@isograph/react 0.0.0-main-b5f89834 → 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 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, ReaderResolverVariant, ReaderScalarField, } from './reader';
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.readerArtifact.readerAst, root, variables,
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] = field.readerArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(variables, allowedVariables));
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 { ComponentOrFieldName, IsographEnvironment } from './IsographEnvironment';
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 readerArtifact: MutationReaderArtifact<any> | RefetchReaderArtifact;
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-b5f89834",
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-b5f89834",
20
- "@isograph/react-disposable-state": "0.0.0-main-b5f89834",
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
@@ -42,7 +42,7 @@ declare global {
42
42
  }
43
43
  }
44
44
 
45
- function getOrCreateCache<T>(
45
+ export function getOrCreateCache<T>(
46
46
  environment: IsographEnvironment,
47
47
  index: string,
48
48
  factory: Factory<T>,
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.readerArtifact.readerAst,
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] = field.readerArtifact.resolver(
222
- environment,
223
- refetchQueryArtifact,
224
- data.data,
225
- filterVariables(variables, allowedVariables),
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 readerArtifact: MutationReaderArtifact<any> | RefetchReaderArtifact;
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, RefetchQueryNormalizationArtifact} from '@isograph/react';
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, RefetchQueryNormalizationArtifact} from '@isograph/react';
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, RefetchQueryNormalizationArtifact} from '@isograph/react';
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';