@isograph/react 0.0.0-main-03be6563 → 0.0.0-main-7d4bae3e
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.
@@ -1,4 +1,4 @@
|
|
1
1
|
import type { ReaderAst, ReaderLinkedField, ReaderScalarField } from './reader';
|
2
|
-
export declare function
|
3
|
-
export declare function
|
4
|
-
export declare function
|
2
|
+
export declare function mergeUsingReaderAst(field: ReaderScalarField | ReaderLinkedField, oldItem: unknown, newItem: unknown): unknown;
|
3
|
+
export declare function mergeArraysUsingReaderAst(field: ReaderScalarField | ReaderLinkedField, oldItems: ReadonlyArray<unknown>, newItems: Array<unknown>): ReadonlyArray<unknown>;
|
4
|
+
export declare function mergeObjectsUsingReaderAst(ast: ReaderAst<object>, oldItemObject: object, newItemObject: object): object;
|
@@ -1,27 +1,27 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
4
|
-
function
|
3
|
+
exports.mergeObjectsUsingReaderAst = exports.mergeArraysUsingReaderAst = exports.mergeUsingReaderAst = void 0;
|
4
|
+
function mergeUsingReaderAst(field, oldItem, newItem) {
|
5
5
|
if (newItem === null) {
|
6
|
-
return oldItem === null;
|
6
|
+
return oldItem === null ? oldItem : newItem;
|
7
7
|
}
|
8
8
|
if (newItem === undefined) {
|
9
|
-
return oldItem === undefined;
|
9
|
+
return oldItem === undefined ? oldItem : newItem;
|
10
10
|
}
|
11
11
|
if (Array.isArray(newItem)) {
|
12
12
|
if (!Array.isArray(oldItem)) {
|
13
|
-
return
|
13
|
+
return newItem;
|
14
14
|
}
|
15
|
-
return
|
15
|
+
return mergeArraysUsingReaderAst(field, oldItem, newItem);
|
16
16
|
}
|
17
17
|
switch (field.kind) {
|
18
18
|
case 'Scalar':
|
19
|
-
return
|
19
|
+
return oldItem === newItem ? oldItem : newItem;
|
20
20
|
case 'Linked':
|
21
21
|
if (oldItem == null) {
|
22
|
-
return
|
22
|
+
return newItem;
|
23
23
|
}
|
24
|
-
return
|
24
|
+
return mergeObjectsUsingReaderAst(field.selections, oldItem, newItem);
|
25
25
|
default: {
|
26
26
|
// Ensure we have covered all variants
|
27
27
|
let _ = field;
|
@@ -30,21 +30,27 @@ function areEqualWithDeepComparison(field, oldItem, newItem) {
|
|
30
30
|
}
|
31
31
|
}
|
32
32
|
}
|
33
|
-
exports.
|
34
|
-
function
|
33
|
+
exports.mergeUsingReaderAst = mergeUsingReaderAst;
|
34
|
+
function mergeArraysUsingReaderAst(field, oldItems, newItems) {
|
35
35
|
if (newItems.length !== oldItems.length) {
|
36
|
-
return
|
36
|
+
return newItems;
|
37
37
|
}
|
38
|
+
let canRecycle = true;
|
38
39
|
for (let i = 0; i < newItems.length; i++) {
|
39
|
-
|
40
|
-
|
40
|
+
const mergedItem = mergeUsingReaderAst(field, oldItems[i], newItems[i]);
|
41
|
+
if (mergedItem !== oldItems[i]) {
|
42
|
+
canRecycle = false;
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
newItems[i] = mergedItem;
|
41
46
|
}
|
42
47
|
}
|
43
|
-
return
|
48
|
+
return canRecycle ? oldItems : newItems;
|
44
49
|
}
|
45
|
-
exports.
|
46
|
-
function
|
50
|
+
exports.mergeArraysUsingReaderAst = mergeArraysUsingReaderAst;
|
51
|
+
function mergeObjectsUsingReaderAst(ast, oldItemObject, newItemObject) {
|
47
52
|
var _a;
|
53
|
+
let canRecycle = true;
|
48
54
|
for (const field of ast) {
|
49
55
|
switch (field.kind) {
|
50
56
|
case 'Scalar':
|
@@ -54,8 +60,13 @@ function areEqualObjectsWithDeepComparison(ast, oldItemObject, newItemObject) {
|
|
54
60
|
const oldValue = oldItemObject[key];
|
55
61
|
// @ts-expect-error
|
56
62
|
const newValue = newItemObject[key];
|
57
|
-
|
58
|
-
|
63
|
+
const mergedValue = mergeUsingReaderAst(field, oldValue, newValue);
|
64
|
+
if (mergedValue !== oldValue) {
|
65
|
+
canRecycle = false;
|
66
|
+
}
|
67
|
+
else {
|
68
|
+
// @ts-expect-error
|
69
|
+
newItemObject[key] = mergedValue;
|
59
70
|
}
|
60
71
|
break;
|
61
72
|
case 'Resolver': {
|
@@ -65,7 +76,7 @@ function areEqualObjectsWithDeepComparison(ast, oldItemObject, newItemObject) {
|
|
65
76
|
// @ts-expect-error
|
66
77
|
const newValue = newItemObject[key];
|
67
78
|
if (oldValue !== newValue) {
|
68
|
-
|
79
|
+
canRecycle = false;
|
69
80
|
}
|
70
81
|
break;
|
71
82
|
}
|
@@ -80,6 +91,6 @@ function areEqualObjectsWithDeepComparison(ast, oldItemObject, newItemObject) {
|
|
80
91
|
}
|
81
92
|
}
|
82
93
|
}
|
83
|
-
return
|
94
|
+
return canRecycle ? oldItemObject : newItemObject;
|
84
95
|
}
|
85
|
-
exports.
|
96
|
+
exports.mergeObjectsUsingReaderAst = mergeObjectsUsingReaderAst;
|
package/dist/core/cache.js
CHANGED
@@ -158,7 +158,8 @@ function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
|
|
158
158
|
suspendIfInFlight: false,
|
159
159
|
throwOnNetworkError: false,
|
160
160
|
});
|
161
|
-
|
161
|
+
const mergedItem = (0, areEqualWithDeepComparison_1.mergeObjectsUsingReaderAst)(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item);
|
162
|
+
if (mergedItem !== subscription.encounteredDataAndRecords.item) {
|
162
163
|
// @ts-expect-error
|
163
164
|
if (typeof window !== 'undefined' && window.__LOG) {
|
164
165
|
console.log('Deep equality - No', {
|
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-7d4bae3e",
|
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-7d4bae3e",
|
21
|
+
"@isograph/react-disposable-state": "0.0.0-main-7d4bae3e",
|
22
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-7d4bae3e"
|
23
23
|
},
|
24
24
|
"peerDependencies": {
|
25
25
|
"react": "18.2.0"
|
@@ -1,38 +1,34 @@
|
|
1
1
|
import type { ReaderAst, ReaderLinkedField, ReaderScalarField } from './reader';
|
2
|
-
export function
|
2
|
+
export function mergeUsingReaderAst(
|
3
3
|
field: ReaderScalarField | ReaderLinkedField,
|
4
4
|
oldItem: unknown,
|
5
5
|
newItem: unknown,
|
6
|
-
):
|
6
|
+
): unknown {
|
7
7
|
if (newItem === null) {
|
8
|
-
return oldItem === null;
|
8
|
+
return oldItem === null ? oldItem : newItem;
|
9
9
|
}
|
10
10
|
|
11
11
|
if (newItem === undefined) {
|
12
|
-
return oldItem === undefined;
|
12
|
+
return oldItem === undefined ? oldItem : newItem;
|
13
13
|
}
|
14
14
|
|
15
15
|
if (Array.isArray(newItem)) {
|
16
16
|
if (!Array.isArray(oldItem)) {
|
17
|
-
return
|
17
|
+
return newItem;
|
18
18
|
}
|
19
19
|
|
20
|
-
return
|
20
|
+
return mergeArraysUsingReaderAst(field, oldItem, newItem);
|
21
21
|
}
|
22
22
|
|
23
23
|
switch (field.kind) {
|
24
24
|
case 'Scalar':
|
25
|
-
return
|
25
|
+
return oldItem === newItem ? oldItem : newItem;
|
26
26
|
case 'Linked':
|
27
27
|
if (oldItem == null) {
|
28
|
-
return
|
28
|
+
return newItem;
|
29
29
|
}
|
30
30
|
|
31
|
-
return
|
32
|
-
field.selections,
|
33
|
-
oldItem,
|
34
|
-
newItem,
|
35
|
-
);
|
31
|
+
return mergeObjectsUsingReaderAst(field.selections, oldItem, newItem);
|
36
32
|
default: {
|
37
33
|
// Ensure we have covered all variants
|
38
34
|
let _: never = field;
|
@@ -42,29 +38,34 @@ export function areEqualWithDeepComparison(
|
|
42
38
|
}
|
43
39
|
}
|
44
40
|
|
45
|
-
export function
|
41
|
+
export function mergeArraysUsingReaderAst(
|
46
42
|
field: ReaderScalarField | ReaderLinkedField,
|
47
43
|
oldItems: ReadonlyArray<unknown>,
|
48
|
-
newItems:
|
49
|
-
):
|
44
|
+
newItems: Array<unknown>,
|
45
|
+
): ReadonlyArray<unknown> {
|
50
46
|
if (newItems.length !== oldItems.length) {
|
51
|
-
return
|
47
|
+
return newItems;
|
52
48
|
}
|
53
49
|
|
50
|
+
let canRecycle = true;
|
54
51
|
for (let i = 0; i < newItems.length; i++) {
|
55
|
-
|
56
|
-
|
52
|
+
const mergedItem = mergeUsingReaderAst(field, oldItems[i], newItems[i]);
|
53
|
+
if (mergedItem !== oldItems[i]) {
|
54
|
+
canRecycle = false;
|
55
|
+
} else {
|
56
|
+
newItems[i] = mergedItem;
|
57
57
|
}
|
58
58
|
}
|
59
59
|
|
60
|
-
return
|
60
|
+
return canRecycle ? oldItems : newItems;
|
61
61
|
}
|
62
62
|
|
63
|
-
export function
|
63
|
+
export function mergeObjectsUsingReaderAst(
|
64
64
|
ast: ReaderAst<object>,
|
65
65
|
oldItemObject: object,
|
66
66
|
newItemObject: object,
|
67
|
-
):
|
67
|
+
): object {
|
68
|
+
let canRecycle = true;
|
68
69
|
for (const field of ast) {
|
69
70
|
switch (field.kind) {
|
70
71
|
case 'Scalar':
|
@@ -74,8 +75,13 @@ export function areEqualObjectsWithDeepComparison(
|
|
74
75
|
const oldValue = oldItemObject[key];
|
75
76
|
// @ts-expect-error
|
76
77
|
const newValue = newItemObject[key];
|
77
|
-
|
78
|
-
|
78
|
+
|
79
|
+
const mergedValue = mergeUsingReaderAst(field, oldValue, newValue);
|
80
|
+
if (mergedValue !== oldValue) {
|
81
|
+
canRecycle = false;
|
82
|
+
} else {
|
83
|
+
// @ts-expect-error
|
84
|
+
newItemObject[key] = mergedValue;
|
79
85
|
}
|
80
86
|
break;
|
81
87
|
case 'Resolver': {
|
@@ -86,7 +92,7 @@ export function areEqualObjectsWithDeepComparison(
|
|
86
92
|
const newValue = newItemObject[key];
|
87
93
|
|
88
94
|
if (oldValue !== newValue) {
|
89
|
-
|
95
|
+
canRecycle = false;
|
90
96
|
}
|
91
97
|
break;
|
92
98
|
}
|
@@ -102,5 +108,5 @@ export function areEqualObjectsWithDeepComparison(
|
|
102
108
|
}
|
103
109
|
}
|
104
110
|
|
105
|
-
return
|
111
|
+
return canRecycle ? oldItemObject : newItemObject;
|
106
112
|
}
|
package/src/core/cache.ts
CHANGED
@@ -25,7 +25,7 @@ import { ReaderLinkedField, ReaderScalarField, type ReaderAst } from './reader';
|
|
25
25
|
import { Argument, ArgumentValue } from './util';
|
26
26
|
import { WithEncounteredRecords, readButDoNotEvaluate } from './read';
|
27
27
|
import { FragmentReference, Variables } from './FragmentReference';
|
28
|
-
import {
|
28
|
+
import { mergeObjectsUsingReaderAst } from './areEqualWithDeepComparison';
|
29
29
|
import { makeNetworkRequest } from './makeNetworkRequest';
|
30
30
|
import { wrapResolvedValue } from './PromiseWrapper';
|
31
31
|
|
@@ -262,13 +262,12 @@ function callSubscriptions(
|
|
262
262
|
},
|
263
263
|
);
|
264
264
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
) {
|
265
|
+
const mergedItem = mergeObjectsUsingReaderAst(
|
266
|
+
subscription.readerAst,
|
267
|
+
subscription.encounteredDataAndRecords.item,
|
268
|
+
newEncounteredDataAndRecords.item,
|
269
|
+
);
|
270
|
+
if (mergedItem !== subscription.encounteredDataAndRecords.item) {
|
272
271
|
// @ts-expect-error
|
273
272
|
if (typeof window !== 'undefined' && window.__LOG) {
|
274
273
|
console.log('Deep equality - No', {
|