@@ -5,38 +5,56 @@ import { type Accessor, createResource, sharedConfig, type Setter, untrack } fro
55import { createStore , reconcile , type ReconcileOptions , unwrap } from "solid-js/store" ;
66import { isServer } from "solid-js/web" ;
77
8+ /**
9+ * As `createAsync` and `createAsyncStore` are wrappers for `createResource`,
10+ * this type allows to support `latest` field for these primitives.
11+ * It will be removed in the future.
12+ */
13+ type AccessorWithLatest < T > = {
14+ ( ) : T ;
15+ latest : T ;
16+ }
17+
818export function createAsync < T > (
919 fn : ( prev : T ) => Promise < T > ,
1020 options : {
1121 name ?: string ;
1222 initialValue : T ;
1323 deferStream ?: boolean ;
1424 }
15- ) : Accessor < T > ;
25+ ) : AccessorWithLatest < T > ;
1626export function createAsync < T > (
1727 fn : ( prev : T | undefined ) => Promise < T > ,
1828 options ?: {
1929 name ?: string ;
2030 initialValue ?: T ;
2131 deferStream ?: boolean ;
2232 }
23- ) : Accessor < T | undefined > ;
33+ ) : AccessorWithLatest < T | undefined > ;
2434export function createAsync < T > (
2535 fn : ( prev : T | undefined ) => Promise < T > ,
2636 options ?: {
2737 name ?: string ;
2838 initialValue ?: T ;
2939 deferStream ?: boolean ;
3040 }
31- ) : Accessor < T | undefined > {
41+ ) : AccessorWithLatest < T | undefined > {
3242 let resource : ( ) => T ;
3343 let prev = ( ) => ! resource || ( resource as any ) . state === "unresolved" ? undefined : ( resource as any ) . latest ;
3444 [ resource ] = createResource (
3545 ( ) => subFetch ( fn , untrack ( prev ) ) ,
3646 v => v ,
3747 options as any
3848 ) ;
39- return ( ) => resource ( ) ;
49+
50+ const resultAccessor : AccessorWithLatest < T > = ( ( ) => resource ( ) ) as any ;
51+ Object . defineProperty ( resultAccessor , 'latest' , {
52+ get ( ) {
53+ return ( resource as any ) . latest ;
54+ }
55+ } )
56+
57+ return resultAccessor ;
4058}
4159
4260export function createAsyncStore < T > (
@@ -47,7 +65,7 @@ export function createAsyncStore<T>(
4765 deferStream ?: boolean ;
4866 reconcile ?: ReconcileOptions ;
4967 }
50- ) : Accessor < T > ;
68+ ) : AccessorWithLatest < T > ;
5169export function createAsyncStore < T > (
5270 fn : ( prev : T | undefined ) => Promise < T > ,
5371 options ?: {
@@ -56,7 +74,7 @@ export function createAsyncStore<T>(
5674 deferStream ?: boolean ;
5775 reconcile ?: ReconcileOptions ;
5876 }
59- ) : Accessor < T | undefined > ;
77+ ) : AccessorWithLatest < T | undefined > ;
6078export function createAsyncStore < T > (
6179 fn : ( prev : T | undefined ) => Promise < T > ,
6280 options : {
@@ -65,7 +83,7 @@ export function createAsyncStore<T>(
6583 deferStream ?: boolean ;
6684 reconcile ?: ReconcileOptions ;
6785 } = { }
68- ) : Accessor < T | undefined > {
86+ ) : AccessorWithLatest < T | undefined > {
6987 let resource : ( ) => T ;
7088 let prev = ( ) => ! resource || ( resource as any ) . state === "unresolved" ? undefined : unwrap ( ( resource as any ) . latest ) ;
7189 [ resource ] = createResource (
@@ -76,7 +94,15 @@ export function createAsyncStore<T>(
7694 storage : ( init : T | undefined ) => createDeepSignal ( init , options . reconcile )
7795 } as any
7896 ) ;
79- return ( ) => resource ( ) ;
97+
98+ const resultAccessor : AccessorWithLatest < T > = ( ( ) => resource ( ) ) as any ;
99+ Object . defineProperty ( resultAccessor , 'latest' , {
100+ get ( ) {
101+ return ( resource as any ) . latest ;
102+ }
103+ } )
104+
105+ return resultAccessor ;
80106}
81107
82108function createDeepSignal < T > ( value : T | undefined , options ?: ReconcileOptions ) {
0 commit comments