@isograph/react 0.0.0-main-dcf30dfc → 0.0.0-main-8f1270e1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/componentCache.js +5 -1
- package/dist/core/read.js +6 -1
- package/dist/core/reader.d.ts +10 -6
- package/dist/index.d.ts +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.js +12 -1
- package/dist/react/useResult.js +5 -1
- package/package.json +4 -4
- package/src/core/componentCache.ts +6 -1
- package/src/core/read.ts +6 -1
- package/src/core/reader.ts +18 -5
- package/src/index.ts +1 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +16 -1
- package/src/react/useResult.ts +5 -1
- package/src/tests/__isograph/Query/meName/param_type.ts +7 -2
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +10 -5
- package/src/tests/__isograph/Query/nodeField/param_type.ts +8 -3
- package/src/tests/__isograph/iso.ts +9 -5
@@ -28,7 +28,11 @@ function getOrCreateCachedComponent(environment, componentName, fragmentReferenc
|
|
28
28
|
' ' +
|
29
29
|
fragmentReference.root);
|
30
30
|
}
|
31
|
-
|
31
|
+
const firstParameter = {
|
32
|
+
data,
|
33
|
+
parameters: fragmentReference.variables,
|
34
|
+
};
|
35
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter, additionalRuntimeProps);
|
32
36
|
}
|
33
37
|
Component.displayName = `${componentName} (id: ${fragmentReference.root}) @component`;
|
34
38
|
return Component;
|
package/dist/core/read.js
CHANGED
@@ -204,7 +204,12 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
204
204
|
};
|
205
205
|
}
|
206
206
|
else {
|
207
|
-
|
207
|
+
const firstParameter = {
|
208
|
+
data: data.data,
|
209
|
+
parameters: variables,
|
210
|
+
};
|
211
|
+
target[field.alias] =
|
212
|
+
field.readerArtifact.resolver(firstParameter);
|
208
213
|
}
|
209
214
|
break;
|
210
215
|
}
|
package/dist/core/reader.d.ts
CHANGED
@@ -1,20 +1,24 @@
|
|
1
1
|
/// <reference types="react" />
|
2
2
|
import { Factory } from '@isograph/disposable-types';
|
3
|
-
import { FragmentReference } from './FragmentReference';
|
3
|
+
import { FragmentReference, Variables } from './FragmentReference';
|
4
4
|
import { ComponentOrFieldName, DataId, IsographEnvironment } from './IsographEnvironment';
|
5
5
|
import { IsographEntrypoint, IsographEntrypointLoader, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
|
6
6
|
import { Arguments } from './util';
|
7
|
-
export type TopLevelReaderArtifact<TReadFromStore extends Object, TClientFieldValue, TComponentProps extends Record<string, never
|
8
|
-
export type EagerReaderArtifact<TReadFromStore extends Object, TClientFieldValue> = {
|
7
|
+
export type TopLevelReaderArtifact<TReadFromStore extends Object, TClientFieldValue, TComponentProps extends Record<string, never>, TVariables = Variables> = EagerReaderArtifact<TReadFromStore, TClientFieldValue, TVariables> | ComponentReaderArtifact<TReadFromStore, TComponentProps, TVariables>;
|
8
|
+
export type EagerReaderArtifact<TReadFromStore extends Object, TClientFieldValue, TVariables = Variables> = {
|
9
9
|
readonly kind: 'EagerReaderArtifact';
|
10
10
|
readonly readerAst: ReaderAst<TReadFromStore>;
|
11
|
-
readonly resolver: (data: TReadFromStore) => TClientFieldValue;
|
11
|
+
readonly resolver: (data: ResolverFirstParameter<TReadFromStore, TVariables>) => TClientFieldValue;
|
12
12
|
};
|
13
|
-
export type ComponentReaderArtifact<TReadFromStore extends Object, TComponentProps extends Record<string, unknown> = Record<string, never
|
13
|
+
export type ComponentReaderArtifact<TReadFromStore extends Object, TComponentProps extends Record<string, unknown> = Record<string, never>, TVariables = Variables> = {
|
14
14
|
readonly kind: 'ComponentReaderArtifact';
|
15
15
|
readonly componentName: ComponentOrFieldName;
|
16
16
|
readonly readerAst: ReaderAst<TReadFromStore>;
|
17
|
-
readonly resolver: (data: TReadFromStore, runtimeProps: TComponentProps) => React.ReactNode;
|
17
|
+
readonly resolver: (data: ResolverFirstParameter<TReadFromStore, TVariables>, runtimeProps: TComponentProps) => React.ReactNode;
|
18
|
+
};
|
19
|
+
export type ResolverFirstParameter<TReadFromStore extends Object, TVariables = Variables> = {
|
20
|
+
readonly data: TReadFromStore;
|
21
|
+
readonly parameters: TVariables;
|
18
22
|
};
|
19
23
|
export type RefetchReaderArtifact = {
|
20
24
|
readonly kind: 'RefetchReaderArtifact';
|
package/dist/index.d.ts
CHANGED
@@ -3,7 +3,7 @@ export { type PromiseWrapper, readPromise, getPromiseState, wrapResolvedValue, w
|
|
3
3
|
export { subscribe, normalizeData } from './core/cache';
|
4
4
|
export { makeNetworkRequest } from './core/makeNetworkRequest';
|
5
5
|
export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, type IsographNetworkFunction, type IsographStore, type Link, type StoreRecord, createIsographEnvironment, createIsographStore, defaultMissingFieldHandler, } from './core/IsographEnvironment';
|
6
|
-
export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, } from './core/reader';
|
6
|
+
export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, type ResolverFirstParameter, } from './core/reader';
|
7
7
|
export { type NormalizationAst, type NormalizationAstNode, type NormalizationLinkedField, type NormalizationScalarField, type IsographEntrypoint, assertIsEntrypoint, type RefetchQueryNormalizationArtifact, type RefetchQueryNormalizationArtifactWrapper, type ExtractProps, type ExtractReadFromStore, type ExtractResolverResult, } from './core/entrypoint';
|
8
8
|
export { readButDoNotEvaluate } from './core/read';
|
9
9
|
export { type ExtractSecondParam, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
|
@@ -4,6 +4,8 @@ exports.useSkipLimitPagination = void 0;
|
|
4
4
|
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
5
5
|
const useResult_1 = require("../react/useResult");
|
6
6
|
const read_1 = require("../core/read");
|
7
|
+
const cache_1 = require("../core/cache");
|
8
|
+
const react_1 = require("react");
|
7
9
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
8
10
|
const reference_counted_pointer_1 = require("@isograph/reference-counted-pointer");
|
9
11
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
@@ -42,7 +44,11 @@ function useSkipLimitPagination(loadableField) {
|
|
42
44
|
(0, useResult_1.maybeUnwrapNetworkRequest)(fragmentReference.networkRequest, networkRequestOptions);
|
43
45
|
const data = (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions);
|
44
46
|
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
45
|
-
|
47
|
+
const firstParameter = {
|
48
|
+
data,
|
49
|
+
parameters: fragmentReference.variables,
|
50
|
+
};
|
51
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter, undefined);
|
46
52
|
});
|
47
53
|
const items = flatten(results);
|
48
54
|
return items;
|
@@ -70,6 +76,7 @@ function useSkipLimitPagination(loadableField) {
|
|
70
76
|
];
|
71
77
|
setState(totalItemCleanupPair);
|
72
78
|
};
|
79
|
+
const [, rerender] = (0, react_1.useState)({});
|
73
80
|
const loadedReferences = state === react_disposable_state_1.UNASSIGNED_STATE ? [] : state;
|
74
81
|
if (loadedReferences.length === 0) {
|
75
82
|
return {
|
@@ -88,6 +95,10 @@ function useSkipLimitPagination(loadableField) {
|
|
88
95
|
switch (networkRequestStatus.kind) {
|
89
96
|
case 'Pending': {
|
90
97
|
const completedFragmentReferences = loadedReferences.slice(0, loadedReferences.length - 1);
|
98
|
+
const unsubscribe = (0, cache_1.subscribeToAnyChange)(environment, () => {
|
99
|
+
unsubscribe();
|
100
|
+
rerender({});
|
101
|
+
});
|
91
102
|
return {
|
92
103
|
kind: 'Pending',
|
93
104
|
pendingFragment: mostRecentFragmentReference,
|
package/dist/react/useResult.js
CHANGED
@@ -18,7 +18,11 @@ function useResult(fragmentReference, partialNetworkRequestOptions) {
|
|
18
18
|
}
|
19
19
|
case 'EagerReaderArtifact': {
|
20
20
|
const data = (0, useReadAndSubscribe_1.useReadAndSubscribe)(fragmentReference, networkRequestOptions, readerWithRefetchQueries.readerArtifact.readerAst);
|
21
|
-
|
21
|
+
const firstParameter = {
|
22
|
+
data: data,
|
23
|
+
parameters: fragmentReference.variables,
|
24
|
+
};
|
25
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter);
|
22
26
|
}
|
23
27
|
}
|
24
28
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@isograph/react",
|
3
|
-
"version": "0.0.0-main-
|
3
|
+
"version": "0.0.0-main-8f1270e1",
|
4
4
|
"description": "Use Isograph with React",
|
5
5
|
"homepage": "https://isograph.dev",
|
6
6
|
"main": "dist/index.js",
|
@@ -17,9 +17,9 @@
|
|
17
17
|
"tsc": "tsc"
|
18
18
|
},
|
19
19
|
"dependencies": {
|
20
|
-
"@isograph/disposable-types": "0.0.0-main-
|
21
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
22
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
20
|
+
"@isograph/disposable-types": "0.0.0-main-8f1270e1",
|
21
|
+
"@isograph/react-disposable-state": "0.0.0-main-8f1270e1",
|
22
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-8f1270e1"
|
23
23
|
},
|
24
24
|
"peerDependencies": {
|
25
25
|
"react": "18.2.0"
|
@@ -50,8 +50,13 @@ export function getOrCreateCachedComponent(
|
|
50
50
|
);
|
51
51
|
}
|
52
52
|
|
53
|
-
|
53
|
+
const firstParameter = {
|
54
54
|
data,
|
55
|
+
parameters: fragmentReference.variables,
|
56
|
+
};
|
57
|
+
|
58
|
+
return readerWithRefetchQueries.readerArtifact.resolver(
|
59
|
+
firstParameter,
|
55
60
|
additionalRuntimeProps,
|
56
61
|
);
|
57
62
|
}
|
package/src/core/read.ts
CHANGED
@@ -317,7 +317,12 @@ function readData<TReadFromStore>(
|
|
317
317
|
nestedReason: data,
|
318
318
|
};
|
319
319
|
} else {
|
320
|
-
|
320
|
+
const firstParameter = {
|
321
|
+
data: data.data,
|
322
|
+
parameters: variables,
|
323
|
+
};
|
324
|
+
target[field.alias] =
|
325
|
+
field.readerArtifact.resolver(firstParameter);
|
321
326
|
}
|
322
327
|
break;
|
323
328
|
}
|
package/src/core/reader.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Factory } from '@isograph/disposable-types';
|
2
|
-
import { FragmentReference } from './FragmentReference';
|
2
|
+
import { FragmentReference, Variables } from './FragmentReference';
|
3
3
|
import {
|
4
4
|
ComponentOrFieldName,
|
5
5
|
DataId,
|
@@ -17,32 +17,45 @@ export type TopLevelReaderArtifact<
|
|
17
17
|
TReadFromStore extends Object,
|
18
18
|
TClientFieldValue,
|
19
19
|
TComponentProps extends Record<string, never>,
|
20
|
+
TVariables = Variables,
|
20
21
|
> =
|
21
|
-
| EagerReaderArtifact<TReadFromStore, TClientFieldValue>
|
22
|
-
| ComponentReaderArtifact<TReadFromStore, TComponentProps>;
|
22
|
+
| EagerReaderArtifact<TReadFromStore, TClientFieldValue, TVariables>
|
23
|
+
| ComponentReaderArtifact<TReadFromStore, TComponentProps, TVariables>;
|
23
24
|
|
24
25
|
export type EagerReaderArtifact<
|
25
26
|
TReadFromStore extends Object,
|
26
27
|
TClientFieldValue,
|
28
|
+
TVariables = Variables,
|
27
29
|
> = {
|
28
30
|
readonly kind: 'EagerReaderArtifact';
|
29
31
|
readonly readerAst: ReaderAst<TReadFromStore>;
|
30
|
-
readonly resolver: (
|
32
|
+
readonly resolver: (
|
33
|
+
data: ResolverFirstParameter<TReadFromStore, TVariables>,
|
34
|
+
) => TClientFieldValue;
|
31
35
|
};
|
32
36
|
|
33
37
|
export type ComponentReaderArtifact<
|
34
38
|
TReadFromStore extends Object,
|
35
39
|
TComponentProps extends Record<string, unknown> = Record<string, never>,
|
40
|
+
TVariables = Variables,
|
36
41
|
> = {
|
37
42
|
readonly kind: 'ComponentReaderArtifact';
|
38
43
|
readonly componentName: ComponentOrFieldName;
|
39
44
|
readonly readerAst: ReaderAst<TReadFromStore>;
|
40
45
|
readonly resolver: (
|
41
|
-
data: TReadFromStore,
|
46
|
+
data: ResolverFirstParameter<TReadFromStore, TVariables>,
|
42
47
|
runtimeProps: TComponentProps,
|
43
48
|
) => React.ReactNode;
|
44
49
|
};
|
45
50
|
|
51
|
+
export type ResolverFirstParameter<
|
52
|
+
TReadFromStore extends Object,
|
53
|
+
TVariables = Variables,
|
54
|
+
> = {
|
55
|
+
readonly data: TReadFromStore;
|
56
|
+
readonly parameters: TVariables;
|
57
|
+
};
|
58
|
+
|
46
59
|
export type RefetchReaderArtifact = {
|
47
60
|
readonly kind: 'RefetchReaderArtifact';
|
48
61
|
readonly readerAst: ReaderAst<unknown>;
|
package/src/index.ts
CHANGED
@@ -4,6 +4,8 @@ import { ItemCleanupPair } from '@isograph/disposable-types';
|
|
4
4
|
import { FragmentReference } from '../core/FragmentReference';
|
5
5
|
import { maybeUnwrapNetworkRequest } from '../react/useResult';
|
6
6
|
import { readButDoNotEvaluate } from '../core/read';
|
7
|
+
import { subscribeToAnyChange } from '../core/cache';
|
8
|
+
import { useState } from 'react';
|
7
9
|
import {
|
8
10
|
UNASSIGNED_STATE,
|
9
11
|
useUpdatableDisposableState,
|
@@ -105,8 +107,13 @@ export function useSkipLimitPagination<
|
|
105
107
|
fragmentReference.readerWithRefetchQueries,
|
106
108
|
);
|
107
109
|
|
110
|
+
const firstParameter = {
|
111
|
+
data,
|
112
|
+
parameters: fragmentReference.variables,
|
113
|
+
};
|
114
|
+
|
108
115
|
return readerWithRefetchQueries.readerArtifact.resolver(
|
109
|
-
|
116
|
+
firstParameter,
|
110
117
|
undefined,
|
111
118
|
) as ReadonlyArray<any>;
|
112
119
|
});
|
@@ -155,6 +162,8 @@ export function useSkipLimitPagination<
|
|
155
162
|
setState(totalItemCleanupPair);
|
156
163
|
};
|
157
164
|
|
165
|
+
const [, rerender] = useState({});
|
166
|
+
|
158
167
|
const loadedReferences = state === UNASSIGNED_STATE ? [] : state;
|
159
168
|
if (loadedReferences.length === 0) {
|
160
169
|
return {
|
@@ -182,6 +191,12 @@ export function useSkipLimitPagination<
|
|
182
191
|
0,
|
183
192
|
loadedReferences.length - 1,
|
184
193
|
);
|
194
|
+
|
195
|
+
const unsubscribe = subscribeToAnyChange(environment, () => {
|
196
|
+
unsubscribe();
|
197
|
+
rerender({});
|
198
|
+
});
|
199
|
+
|
185
200
|
return {
|
186
201
|
kind: 'Pending',
|
187
202
|
pendingFragment: mostRecentFragmentReference,
|
package/src/react/useResult.ts
CHANGED
@@ -45,7 +45,11 @@ export function useResult<TReadFromStore extends Object, TClientFieldValue>(
|
|
45
45
|
networkRequestOptions,
|
46
46
|
readerWithRefetchQueries.readerArtifact.readerAst,
|
47
47
|
);
|
48
|
-
|
48
|
+
const firstParameter = {
|
49
|
+
data: data,
|
50
|
+
parameters: fragmentReference.variables,
|
51
|
+
};
|
52
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter);
|
49
53
|
}
|
50
54
|
}
|
51
55
|
}
|
@@ -1,11 +1,16 @@
|
|
1
1
|
|
2
|
+
import { type Variables } from '@isograph/react';
|
3
|
+
|
2
4
|
export type Query__meNameSuccessor__param = {
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
data: {
|
6
|
+
me: {
|
7
|
+
name: string,
|
6
8
|
successor: ({
|
7
|
-
|
9
|
+
successor: ({
|
10
|
+
name: string,
|
11
|
+
} | null),
|
8
12
|
} | null),
|
9
|
-
}
|
13
|
+
},
|
10
14
|
},
|
15
|
+
parameters: Variables,
|
11
16
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { IsographEntrypoint } from '@isograph/react';
|
1
|
+
import type { IsographEntrypoint, ResolverFirstParameter, Variables } from '@isograph/react';
|
2
2
|
import { type Query__meNameSuccessor__param } from './Query/meNameSuccessor/param_type';
|
3
3
|
import { type Query__meName__param } from './Query/meName/param_type';
|
4
4
|
import { type Query__nodeField__param } from './Query/nodeField/param_type';
|
@@ -10,9 +10,9 @@ import entrypoint_Query__nodeField from '../__isograph/Query/nodeField/entrypoin
|
|
10
10
|
// This means that the type of the exported iso literal is exactly
|
11
11
|
// the type of the passed-in function, which takes one parameter
|
12
12
|
// of type TParam.
|
13
|
-
type IdentityWithParam<TParam> = <TClientFieldReturn>(
|
13
|
+
type IdentityWithParam<TParam extends Object> = <TClientFieldReturn, TVariables = Variables>(
|
14
14
|
clientField: (param: TParam) => TClientFieldReturn
|
15
|
-
) => (param: TParam) => TClientFieldReturn;
|
15
|
+
) => (param: ResolverFirstParameter<TParam, TVariables>) => TClientFieldReturn;
|
16
16
|
|
17
17
|
// This is the type given it to client fields with @component.
|
18
18
|
// This means that the type of the exported iso literal is exactly
|
@@ -21,9 +21,13 @@ type IdentityWithParam<TParam> = <TClientFieldReturn>(
|
|
21
21
|
//
|
22
22
|
// TComponentProps becomes the types of the props you must pass
|
23
23
|
// whenever the @component field is rendered.
|
24
|
-
type IdentityWithParamComponent<TParam
|
24
|
+
type IdentityWithParamComponent<TParam extends Object> = <
|
25
|
+
TClientFieldReturn,
|
26
|
+
TComponentProps = Record<string, never>,
|
27
|
+
TVariables = Variables
|
28
|
+
>(
|
25
29
|
clientComponentField: (data: TParam, componentProps: TComponentProps) => TClientFieldReturn
|
26
|
-
) => (data: TParam, componentProps: TComponentProps) => TClientFieldReturn;
|
30
|
+
) => (data: ResolverFirstParameter<TParam, TVariables>, componentProps: TComponentProps) => TClientFieldReturn;
|
27
31
|
|
28
32
|
type WhitespaceCharacter = ' ' | '\t' | '\n';
|
29
33
|
type Whitespace<In> = In extends `${WhitespaceCharacter}${infer In}`
|