@isograph/react 0.1.1 → 0.2.0
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/FragmentReference.d.ts +15 -0
- package/dist/core/FragmentReference.js +17 -0
- package/dist/core/IsographEnvironment.d.ts +71 -0
- package/dist/core/IsographEnvironment.js +72 -0
- package/dist/core/PromiseWrapper.d.ts +27 -0
- package/dist/core/PromiseWrapper.js +58 -0
- package/dist/core/areEqualWithDeepComparison.d.ts +3 -0
- package/dist/core/areEqualWithDeepComparison.js +61 -0
- package/dist/core/cache.d.ts +28 -0
- package/dist/core/cache.js +452 -0
- package/dist/core/componentCache.d.ts +5 -0
- package/dist/core/componentCache.js +38 -0
- package/dist/core/entrypoint.d.ts +50 -0
- package/dist/core/entrypoint.js +8 -0
- package/dist/core/garbageCollection.d.ts +11 -0
- package/dist/core/garbageCollection.js +74 -0
- package/dist/core/makeNetworkRequest.d.ts +6 -0
- package/dist/core/makeNetworkRequest.js +62 -0
- package/dist/core/read.d.ts +12 -0
- package/dist/core/read.js +415 -0
- package/dist/core/reader.d.ts +63 -0
- package/dist/core/reader.js +2 -0
- package/dist/core/util.d.ts +17 -0
- package/dist/core/util.js +2 -0
- package/dist/index.d.ts +21 -120
- package/dist/index.js +49 -306
- package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -0
- package/dist/loadable-hooks/useClientSideDefer.js +15 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +5 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.js +15 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +9 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +15 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +33 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +118 -0
- package/dist/react/FragmentReader.d.ts +13 -0
- package/dist/{EntrypointReader.js → react/FragmentReader.js} +5 -5
- package/dist/react/IsographEnvironmentProvider.d.ts +10 -0
- package/dist/{IsographEnvironment.js → react/IsographEnvironmentProvider.js} +2 -20
- package/dist/react/useImperativeReference.d.ts +7 -0
- package/dist/react/useImperativeReference.js +36 -0
- package/dist/react/useLazyReference.d.ts +5 -0
- package/dist/react/useLazyReference.js +14 -0
- package/dist/react/useReadAndSubscribe.d.ts +11 -0
- package/dist/react/useReadAndSubscribe.js +41 -0
- package/dist/react/useRerenderOnChange.d.ts +3 -0
- package/dist/react/useRerenderOnChange.js +23 -0
- package/dist/react/useResult.d.ts +5 -0
- package/dist/react/useResult.js +36 -0
- package/docs/how-useLazyReference-works.md +117 -0
- package/package.json +11 -6
- package/src/core/FragmentReference.ts +37 -0
- package/src/core/IsographEnvironment.ts +183 -0
- package/src/core/PromiseWrapper.ts +86 -0
- package/src/core/areEqualWithDeepComparison.ts +78 -0
- package/src/core/cache.ts +721 -0
- package/src/core/componentCache.ts +61 -0
- package/src/core/entrypoint.ts +99 -0
- package/src/core/garbageCollection.ts +122 -0
- package/src/core/makeNetworkRequest.ts +99 -0
- package/src/core/read.ts +615 -0
- package/src/core/reader.ts +133 -0
- package/src/core/util.ts +23 -0
- package/src/index.ts +86 -0
- package/src/loadable-hooks/useClientSideDefer.ts +28 -0
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +17 -0
- package/src/loadable-hooks/useImperativeLoadableField.ts +26 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +211 -0
- package/src/react/FragmentReader.tsx +34 -0
- package/src/react/IsographEnvironmentProvider.tsx +33 -0
- package/src/react/useImperativeReference.ts +57 -0
- package/src/react/useLazyReference.ts +22 -0
- package/src/react/useReadAndSubscribe.ts +66 -0
- package/src/react/useRerenderOnChange.ts +33 -0
- package/src/react/useResult.ts +65 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +47 -0
- package/src/tests/__isograph/Query/meName/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meName/param_type.ts +6 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +32 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +83 -0
- package/src/tests/__isograph/Query/meNameSuccessor/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +11 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +54 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +46 -0
- package/src/tests/__isograph/Query/nodeField/output_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/param_type.ts +6 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +37 -0
- package/src/tests/__isograph/iso.ts +88 -0
- package/src/tests/garbageCollection.test.ts +136 -0
- package/src/tests/isograph.config.json +7 -0
- package/src/tests/meNameSuccessor.ts +20 -0
- package/src/tests/nodeQuery.ts +17 -0
- package/src/tests/schema.graphql +16 -0
- package/src/tests/tsconfig.json +21 -0
- package/tsconfig.json +6 -0
- package/tsconfig.pkg.json +2 -1
- package/dist/EntrypointReader.d.ts +0 -6
- package/dist/IsographEnvironment.d.ts +0 -56
- package/dist/PromiseWrapper.d.ts +0 -13
- package/dist/PromiseWrapper.js +0 -22
- package/dist/cache.d.ts +0 -26
- package/dist/cache.js +0 -274
- package/dist/componentCache.d.ts +0 -6
- package/dist/componentCache.js +0 -31
- package/dist/useImperativeReference.d.ts +0 -8
- package/dist/useImperativeReference.js +0 -28
- package/src/EntrypointReader.tsx +0 -20
- package/src/IsographEnvironment.tsx +0 -120
- package/src/PromiseWrapper.ts +0 -29
- package/src/cache.tsx +0 -484
- package/src/componentCache.ts +0 -41
- package/src/index.tsx +0 -617
- package/src/useImperativeReference.ts +0 -58
@@ -0,0 +1,15 @@
|
|
1
|
+
import { DataId } from './IsographEnvironment';
|
2
|
+
import { ReaderWithRefetchQueries } from '../core/entrypoint';
|
3
|
+
import { PromiseWrapper } from './PromiseWrapper';
|
4
|
+
export type VariableValue = string | number | boolean | null | object;
|
5
|
+
export type Variables = {
|
6
|
+
readonly [index: string]: VariableValue;
|
7
|
+
};
|
8
|
+
export type FragmentReference<TReadFromStore extends Object, TClientFieldValue> = {
|
9
|
+
readonly kind: 'FragmentReference';
|
10
|
+
readonly readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
|
11
|
+
readonly root: DataId;
|
12
|
+
readonly variables: Variables | null;
|
13
|
+
readonly networkRequest: PromiseWrapper<void, any>;
|
14
|
+
};
|
15
|
+
export declare function stableIdForFragmentReference(fragmentReference: FragmentReference<any, any>): string;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.stableIdForFragmentReference = void 0;
|
4
|
+
function stableIdForFragmentReference(fragmentReference) {
|
5
|
+
var _a;
|
6
|
+
return `${fragmentReference.root}/TODO_FRAGMENT_NAME/${serializeVariables((_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {})}`;
|
7
|
+
}
|
8
|
+
exports.stableIdForFragmentReference = stableIdForFragmentReference;
|
9
|
+
function serializeVariables(variables) {
|
10
|
+
let s = '';
|
11
|
+
const keys = Object.keys(variables);
|
12
|
+
keys.sort();
|
13
|
+
for (const key of keys) {
|
14
|
+
s += `${key}:${variables[key]},`;
|
15
|
+
}
|
16
|
+
return s;
|
17
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
import { ParentCache } from '@isograph/react-disposable-state';
|
3
|
+
import { RetainedQuery } from './garbageCollection';
|
4
|
+
import { WithEncounteredRecords } from './read';
|
5
|
+
import { FragmentReference, Variables } from './FragmentReference';
|
6
|
+
import { PromiseWrapper } from './PromiseWrapper';
|
7
|
+
import { IsographEntrypoint } from './entrypoint';
|
8
|
+
export type ComponentOrFieldName = string;
|
9
|
+
export type StringifiedArgs = string;
|
10
|
+
type ComponentCache = {
|
11
|
+
[key: DataId]: {
|
12
|
+
[key: ComponentOrFieldName]: {
|
13
|
+
[key: StringifiedArgs]: React.FC<any>;
|
14
|
+
};
|
15
|
+
};
|
16
|
+
};
|
17
|
+
export type FragmentSubscription<TReadFromStore extends Object> = {
|
18
|
+
readonly kind: 'FragmentSubscription';
|
19
|
+
readonly callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void;
|
20
|
+
/** The value read out from the previous call to readButDoNotEvaluate */
|
21
|
+
readonly encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>;
|
22
|
+
readonly fragmentReference: FragmentReference<TReadFromStore, any>;
|
23
|
+
};
|
24
|
+
type AnyRecordSubscription = {
|
25
|
+
readonly kind: 'AnyRecords';
|
26
|
+
readonly callback: () => void;
|
27
|
+
};
|
28
|
+
type Subscription = FragmentSubscription<Object> | AnyRecordSubscription;
|
29
|
+
type Subscriptions = Set<Subscription>;
|
30
|
+
type CacheMap<T> = {
|
31
|
+
[index: string]: ParentCache<T>;
|
32
|
+
};
|
33
|
+
export type IsographEnvironment = {
|
34
|
+
readonly store: IsographStore;
|
35
|
+
readonly networkFunction: IsographNetworkFunction;
|
36
|
+
readonly missingFieldHandler: MissingFieldHandler | null;
|
37
|
+
readonly componentCache: ComponentCache;
|
38
|
+
readonly subscriptions: Subscriptions;
|
39
|
+
readonly fragmentCache: CacheMap<FragmentReference<any, any>>;
|
40
|
+
readonly entrypointArtifactCache: Map<string, PromiseWrapper<IsographEntrypoint<any, any>>>;
|
41
|
+
readonly retainedQueries: Set<RetainedQuery>;
|
42
|
+
readonly gcBuffer: Array<RetainedQuery>;
|
43
|
+
readonly gcBufferSize: number;
|
44
|
+
};
|
45
|
+
export type MissingFieldHandler = (storeRecord: StoreRecord, root: DataId, fieldName: string, arguments_: {
|
46
|
+
[index: string]: any;
|
47
|
+
} | null, variables: Variables | null) => Link | undefined;
|
48
|
+
export type IsographNetworkFunction = (queryText: string, variables: Variables) => Promise<any>;
|
49
|
+
export type Link = {
|
50
|
+
readonly __link: DataId;
|
51
|
+
};
|
52
|
+
export type DataTypeValue = undefined | number | boolean | string | null | Link | DataTypeValue[];
|
53
|
+
export type StoreRecord = {
|
54
|
+
[index: DataId | string]: DataTypeValue;
|
55
|
+
readonly id?: DataId;
|
56
|
+
};
|
57
|
+
export type DataId = string;
|
58
|
+
export declare const ROOT_ID: DataId & '__ROOT';
|
59
|
+
export type IsographStore = {
|
60
|
+
[index: DataId]: StoreRecord | null;
|
61
|
+
readonly __ROOT: StoreRecord;
|
62
|
+
};
|
63
|
+
export declare function createIsographEnvironment(store: IsographStore, networkFunction: IsographNetworkFunction, missingFieldHandler?: MissingFieldHandler): IsographEnvironment;
|
64
|
+
export declare function createIsographStore(): IsographStore;
|
65
|
+
export declare function defaultMissingFieldHandler(_storeRecord: StoreRecord, _root: DataId, fieldName: string, arguments_: {
|
66
|
+
[index: string]: any;
|
67
|
+
} | null, variables: Variables | null): Link | undefined;
|
68
|
+
export declare function assertLink(link: DataTypeValue): Link | null | undefined;
|
69
|
+
export declare function getLink(maybeLink: DataTypeValue): Link | null;
|
70
|
+
export declare function getOrLoadIsographArtifact(environment: IsographEnvironment, key: string, loader: () => Promise<IsographEntrypoint<any, any>>): PromiseWrapper<IsographEntrypoint<any, any>>;
|
71
|
+
export {};
|
@@ -0,0 +1,72 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getOrLoadIsographArtifact = exports.getLink = exports.assertLink = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = void 0;
|
4
|
+
const PromiseWrapper_1 = require("./PromiseWrapper");
|
5
|
+
exports.ROOT_ID = '__ROOT';
|
6
|
+
const DEFAULT_GC_BUFFER_SIZE = 10;
|
7
|
+
function createIsographEnvironment(store, networkFunction, missingFieldHandler) {
|
8
|
+
return {
|
9
|
+
store,
|
10
|
+
networkFunction,
|
11
|
+
missingFieldHandler: missingFieldHandler !== null && missingFieldHandler !== void 0 ? missingFieldHandler : null,
|
12
|
+
componentCache: {},
|
13
|
+
subscriptions: new Set(),
|
14
|
+
fragmentCache: {},
|
15
|
+
entrypointArtifactCache: new Map(),
|
16
|
+
retainedQueries: new Set(),
|
17
|
+
gcBuffer: [],
|
18
|
+
gcBufferSize: DEFAULT_GC_BUFFER_SIZE,
|
19
|
+
};
|
20
|
+
}
|
21
|
+
exports.createIsographEnvironment = createIsographEnvironment;
|
22
|
+
function createIsographStore() {
|
23
|
+
return {
|
24
|
+
[exports.ROOT_ID]: {},
|
25
|
+
};
|
26
|
+
}
|
27
|
+
exports.createIsographStore = createIsographStore;
|
28
|
+
function defaultMissingFieldHandler(_storeRecord, _root, fieldName, arguments_, variables) {
|
29
|
+
if (fieldName === 'node' || fieldName === 'user') {
|
30
|
+
const variable = arguments_ === null || arguments_ === void 0 ? void 0 : arguments_['id'];
|
31
|
+
const value = variables === null || variables === void 0 ? void 0 : variables[variable];
|
32
|
+
// TODO can we handle explicit nulls here too? Probably, after wrapping in objects
|
33
|
+
if (value != null) {
|
34
|
+
// @ts-expect-error
|
35
|
+
return { __link: value };
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
exports.defaultMissingFieldHandler = defaultMissingFieldHandler;
|
40
|
+
function assertLink(link) {
|
41
|
+
if (Array.isArray(link)) {
|
42
|
+
throw new Error('Unexpected array');
|
43
|
+
}
|
44
|
+
if (link == null) {
|
45
|
+
return link;
|
46
|
+
}
|
47
|
+
if (typeof link === 'object') {
|
48
|
+
return link;
|
49
|
+
}
|
50
|
+
throw new Error('Invalid link');
|
51
|
+
}
|
52
|
+
exports.assertLink = assertLink;
|
53
|
+
function getLink(maybeLink) {
|
54
|
+
if (maybeLink != null &&
|
55
|
+
typeof maybeLink === 'object' &&
|
56
|
+
// @ts-expect-error this is safe
|
57
|
+
maybeLink.__link != null) {
|
58
|
+
return maybeLink;
|
59
|
+
}
|
60
|
+
return null;
|
61
|
+
}
|
62
|
+
exports.getLink = getLink;
|
63
|
+
function getOrLoadIsographArtifact(environment, key, loader) {
|
64
|
+
const value = environment.entrypointArtifactCache.get(key);
|
65
|
+
if (value != null) {
|
66
|
+
return value;
|
67
|
+
}
|
68
|
+
const wrapped = (0, PromiseWrapper_1.wrapPromise)(loader());
|
69
|
+
environment.entrypointArtifactCache.set(key, wrapped);
|
70
|
+
return wrapped;
|
71
|
+
}
|
72
|
+
exports.getOrLoadIsographArtifact = getOrLoadIsographArtifact;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
export type AnyError = any;
|
2
|
+
declare const NOT_SET: Symbol;
|
3
|
+
type NotSet = typeof NOT_SET;
|
4
|
+
type Result<T, E> = {
|
5
|
+
kind: 'Ok';
|
6
|
+
value: T;
|
7
|
+
} | {
|
8
|
+
kind: 'Err';
|
9
|
+
error: E;
|
10
|
+
};
|
11
|
+
/**
|
12
|
+
* Invariant:
|
13
|
+
* Before the promise is resolved, value becomes non-null.
|
14
|
+
*/
|
15
|
+
export type PromiseWrapper<T, E = any> = {
|
16
|
+
readonly promise: Promise<T>;
|
17
|
+
result: Result<Exclude<T, NotSet>, E> | NotSet;
|
18
|
+
};
|
19
|
+
export declare function wrapPromise<T>(promise: Promise<T>): PromiseWrapper<T, any>;
|
20
|
+
export declare function wrapResolvedValue<T>(value: T): PromiseWrapper<T, never>;
|
21
|
+
export declare function readPromise<T, E>(p: PromiseWrapper<T, E>): T;
|
22
|
+
export type PromiseState<T, E> = {
|
23
|
+
kind: 'Pending';
|
24
|
+
promise: Promise<T>;
|
25
|
+
} | Result<T, E>;
|
26
|
+
export declare function getPromiseState<T, E>(p: PromiseWrapper<T, E>): PromiseState<T, E>;
|
27
|
+
export {};
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getPromiseState = exports.readPromise = exports.wrapResolvedValue = exports.wrapPromise = void 0;
|
4
|
+
const NOT_SET = Symbol('NOT_SET');
|
5
|
+
function wrapPromise(promise) {
|
6
|
+
// TODO confirm suspense works if the promise is already resolved.
|
7
|
+
const wrapper = { promise, result: NOT_SET };
|
8
|
+
promise
|
9
|
+
.then((v) => {
|
10
|
+
// v is assignable to Exclude<T, Symbol> | Symbol
|
11
|
+
wrapper.result = { kind: 'Ok', value: v };
|
12
|
+
})
|
13
|
+
.catch((e) => {
|
14
|
+
// e is assignable to Exclude<T, Symbol> | Symbol
|
15
|
+
wrapper.result = { kind: 'Err', error: e };
|
16
|
+
});
|
17
|
+
return wrapper;
|
18
|
+
}
|
19
|
+
exports.wrapPromise = wrapPromise;
|
20
|
+
function wrapResolvedValue(value) {
|
21
|
+
return {
|
22
|
+
promise: Promise.resolve(value),
|
23
|
+
result: {
|
24
|
+
kind: 'Ok',
|
25
|
+
// @ts-expect-error one should not call wrapResolvedValue with NOT_SET
|
26
|
+
value,
|
27
|
+
},
|
28
|
+
};
|
29
|
+
}
|
30
|
+
exports.wrapResolvedValue = wrapResolvedValue;
|
31
|
+
function readPromise(p) {
|
32
|
+
const { result } = p;
|
33
|
+
if (result !== NOT_SET) {
|
34
|
+
// Safety: p.result is either NOT_SET or an actual value.
|
35
|
+
const resultKind = result;
|
36
|
+
if (resultKind.kind === 'Ok') {
|
37
|
+
return resultKind.value;
|
38
|
+
}
|
39
|
+
else {
|
40
|
+
throw resultKind.error;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
throw p.promise;
|
44
|
+
}
|
45
|
+
exports.readPromise = readPromise;
|
46
|
+
function getPromiseState(p) {
|
47
|
+
const { result } = p;
|
48
|
+
if (result !== NOT_SET) {
|
49
|
+
// Safety: p.result is either NOT_SET or an actual value.
|
50
|
+
const resultKind = result;
|
51
|
+
return resultKind;
|
52
|
+
}
|
53
|
+
return {
|
54
|
+
kind: 'Pending',
|
55
|
+
promise: p.promise,
|
56
|
+
};
|
57
|
+
}
|
58
|
+
exports.getPromiseState = getPromiseState;
|
@@ -0,0 +1,3 @@
|
|
1
|
+
export declare function areEqualWithDeepComparison(oldItem: unknown, newItem: unknown): boolean;
|
2
|
+
export declare function areEqualArraysWithDeepComparison(oldItems: ReadonlyArray<unknown>, newItems: ReadonlyArray<unknown>): boolean;
|
3
|
+
export declare function areEqualObjectsWithDeepComparison(oldItemObject: object, newItemObject: object): boolean;
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.areEqualObjectsWithDeepComparison = exports.areEqualArraysWithDeepComparison = exports.areEqualWithDeepComparison = void 0;
|
4
|
+
function areEqualWithDeepComparison(oldItem, newItem) {
|
5
|
+
if (newItem === null) {
|
6
|
+
return oldItem === null;
|
7
|
+
}
|
8
|
+
if (newItem === undefined) {
|
9
|
+
return oldItem === undefined;
|
10
|
+
}
|
11
|
+
if (Array.isArray(newItem)) {
|
12
|
+
if (!Array.isArray(oldItem)) {
|
13
|
+
return false;
|
14
|
+
}
|
15
|
+
return areEqualArraysWithDeepComparison(oldItem, newItem);
|
16
|
+
}
|
17
|
+
if (typeof newItem === 'object') {
|
18
|
+
if (typeof oldItem !== 'object') {
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
if (oldItem === null) {
|
22
|
+
return false;
|
23
|
+
}
|
24
|
+
return areEqualObjectsWithDeepComparison(oldItem, newItem);
|
25
|
+
}
|
26
|
+
return newItem === oldItem;
|
27
|
+
}
|
28
|
+
exports.areEqualWithDeepComparison = areEqualWithDeepComparison;
|
29
|
+
function areEqualArraysWithDeepComparison(oldItems, newItems) {
|
30
|
+
if (newItems.length !== oldItems.length) {
|
31
|
+
return false;
|
32
|
+
}
|
33
|
+
for (let i = 0; i < newItems.length; i++) {
|
34
|
+
if (!areEqualWithDeepComparison(oldItems[i], newItems[i])) {
|
35
|
+
return false;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return true;
|
39
|
+
}
|
40
|
+
exports.areEqualArraysWithDeepComparison = areEqualArraysWithDeepComparison;
|
41
|
+
function areEqualObjectsWithDeepComparison(oldItemObject, newItemObject) {
|
42
|
+
const oldKeys = Object.keys(oldItemObject);
|
43
|
+
const newKeys = Object.keys(newItemObject);
|
44
|
+
if (oldKeys.length !== newKeys.length) {
|
45
|
+
return false;
|
46
|
+
}
|
47
|
+
for (const oldKey of oldKeys) {
|
48
|
+
if (!(oldKey in newItemObject)) {
|
49
|
+
return false;
|
50
|
+
}
|
51
|
+
// @ts-expect-error
|
52
|
+
const oldValue = oldItemObject[oldKey];
|
53
|
+
// @ts-expect-error
|
54
|
+
const newValue = newItemObject[oldKey];
|
55
|
+
if (!areEqualWithDeepComparison(oldValue, newValue)) {
|
56
|
+
return false;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
return true;
|
60
|
+
}
|
61
|
+
exports.areEqualObjectsWithDeepComparison = areEqualObjectsWithDeepComparison;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { Factory, ParentCache } from '@isograph/react-disposable-state';
|
2
|
+
import { DataId, type IsographEnvironment } from './IsographEnvironment';
|
3
|
+
import { IsographEntrypoint, NormalizationAst, NormalizationLinkedField, NormalizationScalarField, RefetchQueryNormalizationArtifactWrapper } from '../core/entrypoint';
|
4
|
+
import { ReaderLinkedField, ReaderScalarField } from './reader';
|
5
|
+
import { WithEncounteredRecords } from './read';
|
6
|
+
import { FragmentReference, Variables } from './FragmentReference';
|
7
|
+
export declare function getOrCreateItemInSuspenseCache<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, index: string, factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
|
8
|
+
/**
|
9
|
+
* Creates a copy of the provided value, ensuring any nested objects have their
|
10
|
+
* keys sorted such that equivalent values would have identical JSON.stringify
|
11
|
+
* results.
|
12
|
+
*/
|
13
|
+
export declare function stableCopy<T>(value: T): T;
|
14
|
+
export declare function getOrCreateCacheForArtifact<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>, variables: Variables): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
|
15
|
+
type NetworkResponseScalarValue = string | number | boolean;
|
16
|
+
type NetworkResponseValue = NetworkResponseScalarValue | null | NetworkResponseObject | NetworkResponseObject[] | NetworkResponseScalarValue[];
|
17
|
+
type NetworkResponseObject = {
|
18
|
+
[index: string]: undefined | NetworkResponseValue;
|
19
|
+
id?: DataId;
|
20
|
+
};
|
21
|
+
export declare function normalizeData(environment: IsographEnvironment, normalizationAst: NormalizationAst, networkResponse: NetworkResponseObject, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[]): Set<DataId>;
|
22
|
+
export declare function subscribeToAnyChange(environment: IsographEnvironment, callback: () => void): () => void;
|
23
|
+
export declare function subscribe<TReadFromStore extends Object>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void): () => void;
|
24
|
+
export declare function onNextChange(environment: IsographEnvironment): Promise<void>;
|
25
|
+
export declare function getParentRecordKey(astNode: NormalizationLinkedField | NormalizationScalarField | ReaderLinkedField | ReaderScalarField, variables: Variables): string;
|
26
|
+
export declare const FIRST_SPLIT_KEY = "____";
|
27
|
+
export declare const SECOND_SPLIT_KEY = "___";
|
28
|
+
export {};
|