@isograph/react 0.0.0-main-e09b15e0 → 0.0.0-main-cee47c78
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/cache.d.ts +2 -1
- package/dist/cache.js +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +7 -0
- package/dist/loadable-hooks/useClientSideDefer.js +14 -0
- package/dist/read.js +7 -2
- package/dist/reader.d.ts +8 -10
- package/package.json +3 -3
- package/src/cache.ts +1 -1
- package/src/index.ts +3 -1
- package/src/loadable-hooks/useClientSideDefer.ts +19 -0
- package/src/read.ts +14 -7
- package/src/reader.ts +16 -6
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -1
package/dist/cache.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { ItemCleanupPair, ParentCache } from '@isograph/react-disposable-state';
|
1
|
+
import { Factory, ItemCleanupPair, ParentCache } from '@isograph/react-disposable-state';
|
2
2
|
import { PromiseWrapper } from './PromiseWrapper';
|
3
3
|
import { DataId, type IsographEnvironment } from './IsographEnvironment';
|
4
4
|
import { IsographEntrypoint, NormalizationAst, NormalizationLinkedField, NormalizationScalarField, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
|
@@ -10,6 +10,7 @@ declare global {
|
|
10
10
|
__LOG: boolean;
|
11
11
|
}
|
12
12
|
}
|
13
|
+
export declare function getOrCreateCache<T>(environment: IsographEnvironment, index: string, factory: Factory<T>): ParentCache<T>;
|
13
14
|
/**
|
14
15
|
* Creates a copy of the provided value, ensuring any nested objects have their
|
15
16
|
* keys sorted such that equivalent values would have identical JSON.stringify
|
package/dist/cache.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.SECOND_SPLIT_KEY = exports.FIRST_SPLIT_KEY = exports.getParentRecordKey = exports.onNextChange = exports.subscribe = exports.subscribeToAnyChange = exports.normalizeData = exports.makeNetworkRequest = exports.getOrCreateCacheForArtifact = exports.stableCopy = void 0;
|
3
|
+
exports.SECOND_SPLIT_KEY = exports.FIRST_SPLIT_KEY = exports.getParentRecordKey = exports.onNextChange = exports.subscribe = exports.subscribeToAnyChange = exports.normalizeData = exports.makeNetworkRequest = exports.getOrCreateCacheForArtifact = exports.stableCopy = exports.getOrCreateCache = void 0;
|
4
4
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
5
|
const PromiseWrapper_1 = require("./PromiseWrapper");
|
6
6
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
@@ -21,6 +21,7 @@ function getOrCreateCache(environment, index, factory) {
|
|
21
21
|
}
|
22
22
|
return environment.suspenseCache[index];
|
23
23
|
}
|
24
|
+
exports.getOrCreateCache = getOrCreateCache;
|
24
25
|
/**
|
25
26
|
* Creates a copy of the provided value, ensuring any nested objects have their
|
26
27
|
* keys sorted such that equivalent values would have identical JSON.stringify
|
package/dist/index.d.ts
CHANGED
@@ -5,7 +5,7 @@ export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, typ
|
|
5
5
|
export { IsographEnvironmentProvider, useIsographEnvironment, type IsographEnvironmentProviderProps, } from './IsographEnvironmentProvider';
|
6
6
|
export { useImperativeReference } from './useImperativeReference';
|
7
7
|
export { EntrypointReader } from './EntrypointReader';
|
8
|
-
export { EagerReaderArtifact, ComponentReaderArtifact, MutationReaderArtifact, RefetchReaderArtifact, ReaderAst, ReaderAstNode, ReaderLinkedField, ReaderResolverField,
|
8
|
+
export { EagerReaderArtifact, ComponentReaderArtifact, MutationReaderArtifact, RefetchReaderArtifact, ReaderAst, ReaderAstNode, ReaderLinkedField, ReaderResolverField, ReaderScalarField, TopLevelReaderArtifact, LoadableField, } from './reader';
|
9
9
|
export { NormalizationAst, NormalizationAstNode, NormalizationLinkedField, NormalizationScalarField, IsographEntrypoint, assertIsEntrypoint, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper, } from './entrypoint';
|
10
10
|
export { readButDoNotEvaluate } from './read';
|
11
11
|
export { useResult } from './useResult';
|
@@ -13,3 +13,4 @@ export { type FragmentReference } from './FragmentReference';
|
|
13
13
|
export { useLazyReference } from './useLazyReference';
|
14
14
|
export { ExtractSecondParam, Argument, ArgumentName, ArgumentValue, Arguments, } from './util';
|
15
15
|
export { useRerenderOnChange } from './useRerenderOnChange';
|
16
|
+
export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
|
package/dist/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useRerenderOnChange = exports.useLazyReference = exports.useResult = exports.readButDoNotEvaluate = exports.assertIsEntrypoint = exports.EntrypointReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.normalizeData = exports.subscribe = exports.makeNetworkRequest = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
3
|
+
exports.useClientSideDefer = exports.useRerenderOnChange = exports.useLazyReference = exports.useResult = exports.readButDoNotEvaluate = exports.assertIsEntrypoint = exports.EntrypointReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.normalizeData = exports.subscribe = exports.makeNetworkRequest = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
4
4
|
var garbageCollection_1 = require("./garbageCollection");
|
5
5
|
Object.defineProperty(exports, "retainQuery", { enumerable: true, get: function () { return garbageCollection_1.retainQuery; } });
|
6
6
|
Object.defineProperty(exports, "unretainQuery", { enumerable: true, get: function () { return garbageCollection_1.unretainQuery; } });
|
@@ -31,3 +31,5 @@ var useLazyReference_1 = require("./useLazyReference");
|
|
31
31
|
Object.defineProperty(exports, "useLazyReference", { enumerable: true, get: function () { return useLazyReference_1.useLazyReference; } });
|
32
32
|
var useRerenderOnChange_1 = require("./useRerenderOnChange");
|
33
33
|
Object.defineProperty(exports, "useRerenderOnChange", { enumerable: true, get: function () { return useRerenderOnChange_1.useRerenderOnChange; } });
|
34
|
+
var useClientSideDefer_1 = require("./loadable-hooks/useClientSideDefer");
|
35
|
+
Object.defineProperty(exports, "useClientSideDefer", { enumerable: true, get: function () { return useClientSideDefer_1.useClientSideDefer; } });
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { ItemCleanupPair } from '@isograph/isograph-disposable-types';
|
2
|
+
import { FragmentReference } from '../FragmentReference';
|
3
|
+
import { DataId } from '../IsographEnvironment';
|
4
|
+
export declare function useClientSideDefer<TValue>([id, loader]: [
|
5
|
+
DataId,
|
6
|
+
() => ItemCleanupPair<FragmentReference<any, TValue>>
|
7
|
+
]): FragmentReference<any, TValue>;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useClientSideDefer = void 0;
|
4
|
+
const IsographEnvironmentProvider_1 = require("../IsographEnvironmentProvider");
|
5
|
+
const cache_1 = require("../cache");
|
6
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
7
|
+
// TODO allow the user to pass props somehow
|
8
|
+
function useClientSideDefer([id, loader]) {
|
9
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
10
|
+
const cache = (0, cache_1.getOrCreateCache)(environment, id, loader);
|
11
|
+
const fragmentReference = (0, react_disposable_state_1.useLazyDisposableState)(cache).state;
|
12
|
+
return fragmentReference;
|
13
|
+
}
|
14
|
+
exports.useClientSideDefer = useClientSideDefer;
|
package/dist/read.js
CHANGED
@@ -133,7 +133,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, mutab
|
|
133
133
|
break;
|
134
134
|
}
|
135
135
|
case 'ImperativelyLoadedField': {
|
136
|
-
const data = readData(environment, field.
|
136
|
+
const data = readData(environment, field.refetchReaderArtifact.readerAst, root, variables,
|
137
137
|
// Refetch fields just read the id, and don't need refetch query artifacts
|
138
138
|
[], mutableEncounteredRecords);
|
139
139
|
if (data.kind === 'MissingData') {
|
@@ -151,7 +151,12 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, mutab
|
|
151
151
|
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
152
152
|
const refetchQueryArtifact = refetchQuery.artifact;
|
153
153
|
const allowedVariables = refetchQuery.allowedVariables;
|
154
|
-
target[field.alias] =
|
154
|
+
target[field.alias] = [
|
155
|
+
// DataId
|
156
|
+
root + '__' + field.name,
|
157
|
+
// Fetcher
|
158
|
+
field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(variables, allowedVariables), root, field.resolverReaderArtifact),
|
159
|
+
];
|
155
160
|
}
|
156
161
|
break;
|
157
162
|
}
|
package/dist/reader.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
/// <reference types="react" />
|
2
|
-
import {
|
2
|
+
import { FragmentReference } from './FragmentReference';
|
3
|
+
import { ComponentOrFieldName, DataId, IsographEnvironment } from './IsographEnvironment';
|
3
4
|
import { RefetchQueryNormalizationArtifact } from './entrypoint';
|
4
5
|
import { Arguments } from './util';
|
5
6
|
export type TopLevelReaderArtifact<TReadFromStore extends Object, TClientFieldValue, TComponentProps extends Record<string, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
|
@@ -17,12 +18,12 @@ export type ComponentReaderArtifact<TReadFromStore extends Object, TComponentPro
|
|
17
18
|
export type RefetchReaderArtifact = {
|
18
19
|
readonly kind: 'RefetchReaderArtifact';
|
19
20
|
readonly readerAst: ReaderAst<unknown>;
|
20
|
-
readonly resolver: (environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact, variables: any) => () => void;
|
21
|
+
readonly resolver: (environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact, variables: any, filteredVariables: any, rootId: DataId, readerArtifact: TopLevelReaderArtifact<any, any, any> | null) => () => void;
|
21
22
|
};
|
22
23
|
export type MutationReaderArtifact<TReadFromStore extends Object> = {
|
23
24
|
readonly kind: 'MutationReaderArtifact';
|
24
25
|
readonly readerAst: ReaderAst<unknown>;
|
25
|
-
readonly resolver: (environment: IsographEnvironment, entrypoint: RefetchQueryNormalizationArtifact, readOutData: TReadFromStore, filteredVariables: any) => (mutationParams: any) => void;
|
26
|
+
readonly resolver: (environment: IsographEnvironment, entrypoint: RefetchQueryNormalizationArtifact, readOutData: TReadFromStore, filteredVariables: any, rootId: DataId, readerArtifact: TopLevelReaderArtifact<any, any, any> | null) => (mutationParams: any) => void;
|
26
27
|
};
|
27
28
|
export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderResolverField | ReaderImperativelyLoadedField;
|
28
29
|
export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
|
@@ -39,12 +40,6 @@ export type ReaderLinkedField = {
|
|
39
40
|
readonly selections: ReaderAst<unknown>;
|
40
41
|
readonly arguments: Arguments | null;
|
41
42
|
};
|
42
|
-
export type ReaderResolverVariant = {
|
43
|
-
readonly kind: 'Eager';
|
44
|
-
} | {
|
45
|
-
readonly kind: 'Component';
|
46
|
-
readonly componentName: string;
|
47
|
-
};
|
48
43
|
export type ReaderResolverField = {
|
49
44
|
readonly kind: 'Resolver';
|
50
45
|
readonly alias: string;
|
@@ -55,6 +50,9 @@ export type ReaderResolverField = {
|
|
55
50
|
export type ReaderImperativelyLoadedField = {
|
56
51
|
readonly kind: 'ImperativelyLoadedField';
|
57
52
|
readonly alias: string;
|
58
|
-
readonly
|
53
|
+
readonly refetchReaderArtifact: MutationReaderArtifact<any> | RefetchReaderArtifact;
|
54
|
+
readonly resolverReaderArtifact: TopLevelReaderArtifact<any, any, any> | null;
|
59
55
|
readonly refetchQuery: number;
|
56
|
+
readonly name: string;
|
60
57
|
};
|
58
|
+
export type LoadableField<T> = [string, () => FragmentReference<any, T>];
|
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-cee47c78",
|
4
4
|
"description": "Use Isograph with React",
|
5
5
|
"homepage": "https://isograph.dev",
|
6
6
|
"main": "dist/index.js",
|
@@ -16,8 +16,8 @@
|
|
16
16
|
"prepack": "yarn run test && yarn run compile"
|
17
17
|
},
|
18
18
|
"dependencies": {
|
19
|
-
"@isograph/disposable-types": "0.0.0-main-
|
20
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
19
|
+
"@isograph/disposable-types": "0.0.0-main-cee47c78",
|
20
|
+
"@isograph/react-disposable-state": "0.0.0-main-cee47c78",
|
21
21
|
"react": "^18.2.0"
|
22
22
|
},
|
23
23
|
"devDependencies": {
|
package/src/cache.ts
CHANGED
package/src/index.ts
CHANGED
@@ -35,8 +35,9 @@ export {
|
|
35
35
|
ReaderAstNode,
|
36
36
|
ReaderLinkedField,
|
37
37
|
ReaderResolverField,
|
38
|
-
ReaderResolverVariant,
|
39
38
|
ReaderScalarField,
|
39
|
+
TopLevelReaderArtifact,
|
40
|
+
LoadableField,
|
40
41
|
} from './reader';
|
41
42
|
export {
|
42
43
|
NormalizationAst,
|
@@ -60,3 +61,4 @@ export {
|
|
60
61
|
Arguments,
|
61
62
|
} from './util';
|
62
63
|
export { useRerenderOnChange } from './useRerenderOnChange';
|
64
|
+
export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { ItemCleanupPair } from '@isograph/isograph-disposable-types';
|
2
|
+
import { FragmentReference } from '../FragmentReference';
|
3
|
+
import { useIsographEnvironment } from '../IsographEnvironmentProvider';
|
4
|
+
import { getOrCreateCache } from '../cache';
|
5
|
+
import { useLazyDisposableState } from '@isograph/react-disposable-state';
|
6
|
+
import { DataId } from '../IsographEnvironment';
|
7
|
+
|
8
|
+
// TODO allow the user to pass props somehow
|
9
|
+
export function useClientSideDefer<TValue>([id, loader]: [
|
10
|
+
DataId,
|
11
|
+
() => ItemCleanupPair<FragmentReference<any, TValue>>,
|
12
|
+
]) {
|
13
|
+
const environment = useIsographEnvironment();
|
14
|
+
const cache = getOrCreateCache(environment, id, loader);
|
15
|
+
|
16
|
+
const fragmentReference = useLazyDisposableState(cache).state;
|
17
|
+
|
18
|
+
return fragmentReference;
|
19
|
+
}
|
package/src/read.ts
CHANGED
@@ -196,7 +196,7 @@ function readData<TReadFromStore>(
|
|
196
196
|
case 'ImperativelyLoadedField': {
|
197
197
|
const data = readData(
|
198
198
|
environment,
|
199
|
-
field.
|
199
|
+
field.refetchReaderArtifact.readerAst,
|
200
200
|
root,
|
201
201
|
variables,
|
202
202
|
// Refetch fields just read the id, and don't need refetch query artifacts
|
@@ -218,12 +218,19 @@ function readData<TReadFromStore>(
|
|
218
218
|
const refetchQueryArtifact = refetchQuery.artifact;
|
219
219
|
const allowedVariables = refetchQuery.allowedVariables;
|
220
220
|
|
221
|
-
target[field.alias] =
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
221
|
+
target[field.alias] = [
|
222
|
+
// DataId
|
223
|
+
root + '__' + field.name,
|
224
|
+
// Fetcher
|
225
|
+
field.refetchReaderArtifact.resolver(
|
226
|
+
environment,
|
227
|
+
refetchQueryArtifact,
|
228
|
+
data.data,
|
229
|
+
filterVariables(variables, allowedVariables),
|
230
|
+
root,
|
231
|
+
field.resolverReaderArtifact,
|
232
|
+
),
|
233
|
+
];
|
227
234
|
}
|
228
235
|
break;
|
229
236
|
}
|
package/src/reader.ts
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
import { FragmentReference } from './FragmentReference';
|
1
2
|
import {
|
2
3
|
ComponentOrFieldName,
|
4
|
+
DataId,
|
3
5
|
IsographEnvironment,
|
4
6
|
} from './IsographEnvironment';
|
5
7
|
import { RefetchQueryNormalizationArtifact } from './entrypoint';
|
@@ -43,6 +45,11 @@ export type RefetchReaderArtifact = {
|
|
43
45
|
artifact: RefetchQueryNormalizationArtifact,
|
44
46
|
// TODO type this better
|
45
47
|
variables: any,
|
48
|
+
// TODO type this better
|
49
|
+
filteredVariables: any,
|
50
|
+
rootId: DataId,
|
51
|
+
readerArtifact: TopLevelReaderArtifact<any, any, any> | null,
|
52
|
+
// TODO type this better
|
46
53
|
) => () => void;
|
47
54
|
};
|
48
55
|
|
@@ -56,6 +63,8 @@ export type MutationReaderArtifact<TReadFromStore extends Object> = {
|
|
56
63
|
readOutData: TReadFromStore,
|
57
64
|
// TODO type this better
|
58
65
|
filteredVariables: any,
|
66
|
+
rootId: DataId,
|
67
|
+
readerArtifact: TopLevelReaderArtifact<any, any, any> | null,
|
59
68
|
// TODO type this better
|
60
69
|
) => (mutationParams: any) => void;
|
61
70
|
};
|
@@ -83,11 +92,6 @@ export type ReaderLinkedField = {
|
|
83
92
|
readonly arguments: Arguments | null;
|
84
93
|
};
|
85
94
|
|
86
|
-
export type ReaderResolverVariant =
|
87
|
-
| { readonly kind: 'Eager' }
|
88
|
-
// componentName is type + field concatenated
|
89
|
-
| { readonly kind: 'Component'; readonly componentName: string };
|
90
|
-
|
91
95
|
export type ReaderResolverField = {
|
92
96
|
readonly kind: 'Resolver';
|
93
97
|
readonly alias: string;
|
@@ -100,6 +104,12 @@ export type ReaderResolverField = {
|
|
100
104
|
export type ReaderImperativelyLoadedField = {
|
101
105
|
readonly kind: 'ImperativelyLoadedField';
|
102
106
|
readonly alias: string;
|
103
|
-
readonly
|
107
|
+
readonly refetchReaderArtifact:
|
108
|
+
| MutationReaderArtifact<any>
|
109
|
+
| RefetchReaderArtifact;
|
110
|
+
readonly resolverReaderArtifact: TopLevelReaderArtifact<any, any, any> | null;
|
104
111
|
readonly refetchQuery: number;
|
112
|
+
readonly name: string;
|
105
113
|
};
|
114
|
+
|
115
|
+
export type LoadableField<T> = [string, () => FragmentReference<any, T>];
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type {EagerReaderArtifact, ReaderAst
|
1
|
+
import type { EagerReaderArtifact, ReaderAst } from '@isograph/react';
|
2
2
|
import { Query__meName__param } from './param_type';
|
3
3
|
import { Query__meName__output_type } from './output_type';
|
4
4
|
import { meNameField as resolver } from '../../../garbageCollection.test';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type {EagerReaderArtifact, ReaderAst
|
1
|
+
import type { EagerReaderArtifact, ReaderAst } from '@isograph/react';
|
2
2
|
import { Query__meNameSuccessor__param } from './param_type';
|
3
3
|
import { Query__meNameSuccessor__output_type } from './output_type';
|
4
4
|
import { meNameField as resolver } from '../../../meNameSuccessor';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type {EagerReaderArtifact, ReaderAst
|
1
|
+
import type { EagerReaderArtifact, ReaderAst } from '@isograph/react';
|
2
2
|
import { Query__nodeField__param } from './param_type';
|
3
3
|
import { Query__nodeField__output_type } from './output_type';
|
4
4
|
import { nodeField as resolver } from '../../../nodeQuery';
|