1- import type { GraphQLResponse , GraphQLTaggedNode , Subscribable , Subscription } from "relay-runtime" ;
1+ import type {
2+ GraphQLResponse ,
3+ GraphQLTaggedNode ,
4+ Observer ,
5+ Subscribable ,
6+ Subscription ,
7+ } from "relay-runtime" ;
28import { observeFragment } from "relay-runtime/experimental.js" ;
9+ import {
10+ ArrayKeyType ,
11+ ArrayKeyTypeData ,
12+ FragmentState ,
13+ KeyType ,
14+ KeyTypeData ,
15+ } from "relay-runtime/lib/store/FragmentTypes" ;
316import type { Accessor , Setter , Signal } from "solid-js" ;
417import { batch , createResource , createSignal , untrack } from "solid-js" ;
518import { reconcile , type SetStoreFunction , unwrap } from "solid-js/store" ;
619import { isServer } from "solid-js/web" ;
720import { useRelayEnvironment } from "../RelayEnvironment" ;
8- import type { KeyType , KeyTypeData } from "../types/keyType" ;
921import { createDataStore , type DataStore } from "../utils/dataStore" ;
1022
1123type FragmentResult < T > =
@@ -50,17 +62,56 @@ export function createFragment<TKey extends KeyType>(
5062 deferStream ?: boolean ;
5163 } ,
5264) : DataStore < KeyTypeData < TKey > | null | undefined > ;
53- export function createFragment < TKey extends KeyType > (
65+ export function createFragment < TKey extends ArrayKeyType > (
66+ fragment : GraphQLTaggedNode ,
67+ key : Accessor < TKey > ,
68+ options ?: {
69+ deferStream ?: boolean ;
70+ } ,
71+ ) : DataStore < ArrayKeyTypeData < TKey > > ;
72+ export function createFragment < TKey extends MaybeArray < ArrayKeyType > > (
73+ fragment : GraphQLTaggedNode ,
74+ key : Accessor < TKey > ,
75+ options ?: {
76+ deferStream ?: boolean ;
77+ } ,
78+ ) : DataStore < MaybeArray < ArrayKeyTypeData < RequiredArray < TKey > > > > ;
79+ export function createFragment < TKey extends ArrayKeyType > (
5480 fragment : GraphQLTaggedNode ,
5581 key : Accessor < TKey | null | undefined > ,
5682 options ?: {
5783 deferStream ?: boolean ;
5884 } ,
59- ) : DataStore < KeyTypeData < TKey > | null | undefined > {
85+ ) : DataStore < ArrayKeyTypeData < TKey > | null | undefined > ;
86+ export function createFragment < TKey extends MaybeArray < ArrayKeyType > > (
87+ fragment : GraphQLTaggedNode ,
88+ key : Accessor < TKey | null | undefined > ,
89+ options ?: {
90+ deferStream ?: boolean ;
91+ } ,
92+ ) : DataStore < MaybeArray < ArrayKeyTypeData < RequiredArray < TKey > > > | null | undefined > ;
93+ export function createFragment < TKey extends KeyType | ArrayKeyType > (
94+ fragment : GraphQLTaggedNode ,
95+ key : Accessor < TKey | null | undefined > ,
96+ options ?: {
97+ deferStream ?: boolean ;
98+ } ,
99+ ) : DataStore < Data < TKey > | null | undefined > {
60100 return createFragmentInternal ( fragment , key , undefined , options ) ;
61101}
62102
63- export function createFragmentInternal < TKey extends KeyType > (
103+ export type MaybeArray < T > =
104+ T extends ReadonlyArray < unknown > ? ReadonlyArray < T [ number ] | null | undefined > : never ;
105+ type RequiredArray < T > =
106+ T extends ReadonlyArray < ( infer U ) | null | undefined > ? ReadonlyArray < U > : never ;
107+
108+ type Data < TKey extends KeyType | ArrayKeyType > = TKey extends KeyType
109+ ? KeyTypeData < TKey >
110+ : TKey extends ArrayKeyType
111+ ? ArrayKeyTypeData < TKey >
112+ : never ;
113+
114+ export function createFragmentInternal < TKey extends KeyType | ArrayKeyType > (
64115 fragment : GraphQLTaggedNode ,
65116 key : Accessor < TKey | null | undefined > ,
66117 options ?: Accessor < {
@@ -69,10 +120,9 @@ export function createFragmentInternal<TKey extends KeyType>(
69120 createResourceOptions ?: {
70121 deferStream ?: boolean ;
71122 } ,
72- ) : DataStore < KeyTypeData < TKey > | null | undefined > {
123+ ) : DataStore < Data < TKey > | null | undefined > {
73124 const environment = useRelayEnvironment ( ) ;
74125
75- type FragmentObserver = Parameters < ReturnType < typeof observeFragment > [ "subscribe" ] > [ 0 ] ;
76126 const resultUpdateObserver = {
77127 next ( res ) {
78128 queueMicrotask ( ( ) => {
@@ -86,7 +136,7 @@ export function createFragmentInternal<TKey extends KeyType>(
86136 setResult ( "pending" , false ) ;
87137 setResult (
88138 "data" ,
89- reconcile ( res . value as Record < string , unknown > , {
139+ reconcile ( res . value , {
90140 key : "__id" ,
91141 merge : true ,
92142 } ) ,
@@ -101,11 +151,11 @@ export function createFragmentInternal<TKey extends KeyType>(
101151 } ) ;
102152 } ) ;
103153 } ,
104- } satisfies FragmentObserver ;
154+ } satisfies Observer < FragmentState < unknown > > ;
105155 const [ subscription , setSubscription ] = createSignal < Subscription > ( ) ;
106156
107157 const setResultQueue : unknown [ ] [ ] = [ ] ;
108- let setResult : SetStoreFunction < FragmentResult < TKey [ " $data" ] > > = ( ...args : unknown [ ] ) => {
158+ let setResult : SetStoreFunction < FragmentResult < unknown > > = ( ...args : unknown [ ] ) => {
109159 setResultQueue . push ( args ) ;
110160 } ;
111161
@@ -140,7 +190,7 @@ export function createFragmentInternal<TKey extends KeyType>(
140190 } ) ;
141191 }
142192
143- const source = observeFragment ( environment ( ) , fragment , key ) ;
193+ const source = observeFragment ( environment ( ) , fragment , key as KeyType ) ;
144194
145195 return new Promise < true > ( ( resolve , reject ) => {
146196 setSubscription (
@@ -173,7 +223,9 @@ export function createFragmentInternal<TKey extends KeyType>(
173223
174224 if ( ! fetchedInSameEnv && ! current && nextValue && k ) {
175225 setSubscription (
176- observeFragment ( environment ( ) , fragment , k ) . subscribe ( resultUpdateObserver ) ,
226+ observeFragment ( environment ( ) , fragment , k as KeyType ) . subscribe (
227+ resultUpdateObserver ,
228+ ) ,
177229 ) ;
178230 }
179231
@@ -184,7 +236,7 @@ export function createFragmentInternal<TKey extends KeyType>(
184236 } ,
185237 ) ;
186238
187- const store = createDataStore < FragmentResult < TKey [ " $data" ] > > (
239+ const store = createDataStore < FragmentResult < unknown > > (
188240 {
189241 data : undefined ,
190242 error : undefined ,
@@ -197,5 +249,5 @@ export function createFragmentInternal<TKey extends KeyType>(
197249 }
198250 setResult = store [ 1 ] ;
199251
200- return store [ 0 ] ;
252+ return store [ 0 ] as DataStore < Data < TKey > | null | undefined > ;
201253}
0 commit comments