From 0d24af4cb4fd0ceabf1eadc2e3184ebc0eb8bd39 Mon Sep 17 00:00:00 2001 From: InfiniteTF Date: Mon, 1 Nov 2021 01:15:03 +0100 Subject: [PATCH] Extend __typename stripper to fix interface config saving (#1929) --- ui/v2.5/src/utils/data.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/ui/v2.5/src/utils/data.ts b/ui/v2.5/src/utils/data.ts index 19ba59092..7fc08d3f4 100644 --- a/ui/v2.5/src/utils/data.ts +++ b/ui/v2.5/src/utils/data.ts @@ -5,7 +5,28 @@ interface ITypename { __typename?: string; } -export function withoutTypename(o: T) { - const { __typename, ...ret } = o; - return ret; +const hasTypename = (value: unknown): value is ITypename => + !!(value as ITypename)?.__typename; + +const processNoneObjValue = (value: unknown): unknown => + Array.isArray(value) + ? value.map((v) => + hasTypename(v) ? withoutTypename(v) : processNoneObjValue(v) + ) + : value; + +export function withoutTypename( + o: T +): Omit { + const { __typename, ...data } = o; + + return Object.entries(data).reduce( + (ret, [key, value]) => ({ + ...ret, + [key]: hasTypename(value) + ? withoutTypename(value) + : processNoneObjValue(value), + }), + {} as Omit + ); }