@isograph/react 0.0.0-main-d57417f0 → 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 areEqualWithDeepComparison(field: ReaderScalarField | ReaderLinkedField, oldItem: unknown, newItem: unknown): boolean;
3
- export declare function areEqualArraysWithDeepComparison(field: ReaderScalarField | ReaderLinkedField, oldItems: ReadonlyArray<unknown>, newItems: ReadonlyArray<unknown>): boolean;
4
- export declare function areEqualObjectsWithDeepComparison(ast: ReaderAst<object>, oldItemObject: object, newItemObject: object): boolean;
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.areEqualObjectsWithDeepComparison = exports.areEqualArraysWithDeepComparison = exports.areEqualWithDeepComparison = void 0;
4
- function areEqualWithDeepComparison(field, oldItem, newItem) {
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 false;
13
+ return newItem;
14
14
  }
15
- return areEqualArraysWithDeepComparison(field, oldItem, newItem);
15
+ return mergeArraysUsingReaderAst(field, oldItem, newItem);
16
16
  }
17
17
  switch (field.kind) {
18
18
  case 'Scalar':
19
- return newItem === oldItem;
19
+ return oldItem === newItem ? oldItem : newItem;
20
20
  case 'Linked':
21
21
  if (oldItem == null) {
22
- return false;
22
+ return newItem;
23
23
  }
24
- return areEqualObjectsWithDeepComparison(field.selections, oldItem, newItem);
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.areEqualWithDeepComparison = areEqualWithDeepComparison;
34
- function areEqualArraysWithDeepComparison(field, oldItems, newItems) {
33
+ exports.mergeUsingReaderAst = mergeUsingReaderAst;
34
+ function mergeArraysUsingReaderAst(field, oldItems, newItems) {
35
35
  if (newItems.length !== oldItems.length) {
36
- return false;
36
+ return newItems;
37
37
  }
38
+ let canRecycle = true;
38
39
  for (let i = 0; i < newItems.length; i++) {
39
- if (!areEqualWithDeepComparison(field, oldItems[i], newItems[i])) {
40
- return false;
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 true;
48
+ return canRecycle ? oldItems : newItems;
44
49
  }
45
- exports.areEqualArraysWithDeepComparison = areEqualArraysWithDeepComparison;
46
- function areEqualObjectsWithDeepComparison(ast, oldItemObject, newItemObject) {
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
- if (!areEqualWithDeepComparison(field, oldValue, newValue)) {
58
- return false;
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
- return false;
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 true;
94
+ return canRecycle ? oldItemObject : newItemObject;
84
95
  }
85
- exports.areEqualObjectsWithDeepComparison = areEqualObjectsWithDeepComparison;
96
+ exports.mergeObjectsUsingReaderAst = mergeObjectsUsingReaderAst;
@@ -158,7 +158,8 @@ function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
158
158
  suspendIfInFlight: false,
159
159
  throwOnNetworkError: false,
160
160
  });
161
- if (!(0, areEqualWithDeepComparison_1.areEqualObjectsWithDeepComparison)(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item)) {
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-d57417f0",
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-d57417f0",
21
- "@isograph/react-disposable-state": "0.0.0-main-d57417f0",
22
- "@isograph/reference-counted-pointer": "0.0.0-main-d57417f0"
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 areEqualWithDeepComparison(
2
+ export function mergeUsingReaderAst(
3
3
  field: ReaderScalarField | ReaderLinkedField,
4
4
  oldItem: unknown,
5
5
  newItem: unknown,
6
- ): boolean {
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 false;
17
+ return newItem;
18
18
  }
19
19
 
20
- return areEqualArraysWithDeepComparison(field, oldItem, newItem);
20
+ return mergeArraysUsingReaderAst(field, oldItem, newItem);
21
21
  }
22
22
 
23
23
  switch (field.kind) {
24
24
  case 'Scalar':
25
- return newItem === oldItem;
25
+ return oldItem === newItem ? oldItem : newItem;
26
26
  case 'Linked':
27
27
  if (oldItem == null) {
28
- return false;
28
+ return newItem;
29
29
  }
30
30
 
31
- return areEqualObjectsWithDeepComparison(
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 areEqualArraysWithDeepComparison(
41
+ export function mergeArraysUsingReaderAst(
46
42
  field: ReaderScalarField | ReaderLinkedField,
47
43
  oldItems: ReadonlyArray<unknown>,
48
- newItems: ReadonlyArray<unknown>,
49
- ): boolean {
44
+ newItems: Array<unknown>,
45
+ ): ReadonlyArray<unknown> {
50
46
  if (newItems.length !== oldItems.length) {
51
- return false;
47
+ return newItems;
52
48
  }
53
49
 
50
+ let canRecycle = true;
54
51
  for (let i = 0; i < newItems.length; i++) {
55
- if (!areEqualWithDeepComparison(field, oldItems[i], newItems[i])) {
56
- return false;
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 true;
60
+ return canRecycle ? oldItems : newItems;
61
61
  }
62
62
 
63
- export function areEqualObjectsWithDeepComparison(
63
+ export function mergeObjectsUsingReaderAst(
64
64
  ast: ReaderAst<object>,
65
65
  oldItemObject: object,
66
66
  newItemObject: object,
67
- ): boolean {
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
- if (!areEqualWithDeepComparison(field, oldValue, newValue)) {
78
- return false;
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
- return false;
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 true;
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 { areEqualObjectsWithDeepComparison } from './areEqualWithDeepComparison';
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
- if (
266
- !areEqualObjectsWithDeepComparison(
267
- subscription.readerAst,
268
- subscription.encounteredDataAndRecords.item,
269
- newEncounteredDataAndRecords.item,
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', {
@@ -1,7 +1,7 @@
1
- import type {IsographEntrypoint} from '@isograph/react';
2
- import { Query__meNameSuccessor__param } from './Query/meNameSuccessor/param_type';
3
- import { Query__meName__param } from './Query/meName/param_type';
4
- import { Query__nodeField__param } from './Query/nodeField/param_type';
1
+ import type { IsographEntrypoint } from '@isograph/react';
2
+ import { type Query__meNameSuccessor__param } from './Query/meNameSuccessor/param_type';
3
+ import { type Query__meName__param } from './Query/meName/param_type';
4
+ import { type Query__nodeField__param } from './Query/nodeField/param_type';
5
5
  import entrypoint_Query__meNameSuccessor from '../__isograph/Query/meNameSuccessor/entrypoint';
6
6
  import entrypoint_Query__meName from '../__isograph/Query/meName/entrypoint';
7
7
  import entrypoint_Query__nodeField from '../__isograph/Query/nodeField/entrypoint';