@isograph/react 0.0.0-main-0eb53a17 → 0.0.0-main-cddcd660

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.
Files changed (65) hide show
  1. package/.turbo/turbo-compile-libs.log +1 -1
  2. package/dist/core/FragmentReference.d.ts +2 -2
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/IsographEnvironment.d.ts +12 -7
  5. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  6. package/dist/core/areEqualWithDeepComparison.d.ts +1 -3
  7. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
  8. package/dist/core/areEqualWithDeepComparison.js +0 -2
  9. package/dist/core/brand.d.ts +2 -0
  10. package/dist/core/brand.d.ts.map +1 -0
  11. package/dist/core/brand.js +2 -0
  12. package/dist/core/cache.d.ts +4 -4
  13. package/dist/core/cache.d.ts.map +1 -1
  14. package/dist/core/cache.js +8 -3
  15. package/dist/core/check.d.ts +3 -3
  16. package/dist/core/check.d.ts.map +1 -1
  17. package/dist/core/garbageCollection.d.ts +2 -2
  18. package/dist/core/garbageCollection.d.ts.map +1 -1
  19. package/dist/core/logging.d.ts +13 -4
  20. package/dist/core/logging.d.ts.map +1 -1
  21. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  22. package/dist/core/read.d.ts +7 -7
  23. package/dist/core/read.d.ts.map +1 -1
  24. package/dist/core/reader.d.ts +3 -3
  25. package/dist/core/reader.d.ts.map +1 -1
  26. package/dist/core/startUpdate.d.ts.map +1 -1
  27. package/dist/core/startUpdate.js +9 -0
  28. package/dist/index.d.ts +4 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +5 -1
  31. package/dist/react/FragmentReader.d.ts +4 -10
  32. package/dist/react/FragmentReader.d.ts.map +1 -1
  33. package/dist/react/FragmentReader.js +3 -30
  34. package/dist/react/FragmentRenderer.d.ts +15 -0
  35. package/dist/react/FragmentRenderer.d.ts.map +1 -0
  36. package/dist/react/FragmentRenderer.js +35 -0
  37. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  38. package/dist/react/LoadableFieldReader.js +0 -3
  39. package/dist/react/LoadableFieldRenderer.d.ts +13 -0
  40. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -0
  41. package/dist/react/LoadableFieldRenderer.js +37 -0
  42. package/package.json +4 -4
  43. package/src/core/FragmentReference.ts +2 -2
  44. package/src/core/IsographEnvironment.ts +13 -7
  45. package/src/core/areEqualWithDeepComparison.ts +5 -5
  46. package/src/core/brand.ts +18 -0
  47. package/src/core/cache.ts +22 -14
  48. package/src/core/check.ts +4 -4
  49. package/src/core/garbageCollection.ts +3 -3
  50. package/src/core/logging.ts +16 -4
  51. package/src/core/makeNetworkRequest.ts +2 -2
  52. package/src/core/read.ts +12 -10
  53. package/src/core/reader.ts +3 -3
  54. package/src/core/startUpdate.ts +11 -2
  55. package/src/index.ts +5 -2
  56. package/src/react/FragmentReader.tsx +17 -36
  57. package/src/react/FragmentRenderer.tsx +46 -0
  58. package/src/react/LoadableFieldReader.tsx +0 -3
  59. package/src/react/LoadableFieldRenderer.tsx +41 -0
  60. package/src/tests/__isograph/Economist/link/output_type.ts +2 -0
  61. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +1 -1
  62. package/src/tests/__isograph/Node/link/output_type.ts +3 -0
  63. package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +4 -4
  64. package/src/tests/__isograph/iso.ts +1 -1
  65. package/src/tests/__isograph/tsconfig.json +8 -0
package/src/core/read.ts CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  getOrLoadIsographArtifact,
24
24
  IsographEnvironment,
25
25
  type DataTypeValue,
26
- type Link,
26
+ type StoreLink,
27
27
  type StoreRecord,
28
28
  } from './IsographEnvironment';
29
29
  import { logMessage } from './logging';
@@ -134,13 +134,13 @@ export type ReadDataResult<Data> =
134
134
  readonly kind: 'MissingData';
135
135
  readonly reason: string;
136
136
  readonly nestedReason?: ReadDataResult<unknown>;
137
- readonly recordLink: Link;
137
+ readonly recordLink: StoreLink;
138
138
  };
139
139
 
140
140
  function readData<TReadFromStore>(
141
141
  environment: IsographEnvironment,
142
142
  ast: ReaderAst<TReadFromStore>,
143
- root: Link,
143
+ root: StoreLink,
144
144
  variables: Variables,
145
145
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
146
146
  networkRequest: PromiseWrapper<void, any>,
@@ -281,7 +281,7 @@ function readData<TReadFromStore>(
281
281
  export function readLoadablySelectedFieldData(
282
282
  environment: IsographEnvironment,
283
283
  field: LoadablySelectedField,
284
- root: Link,
284
+ root: StoreLink,
285
285
  variables: Variables,
286
286
  networkRequest: PromiseWrapper<void, any>,
287
287
  networkRequestOptions: NetworkRequestReaderOptions,
@@ -534,7 +534,7 @@ function writeQueryArgsToVariables(
534
534
  export function readResolverFieldData(
535
535
  environment: IsographEnvironment,
536
536
  field: ReaderNonLoadableResolverField,
537
- root: Link,
537
+ root: StoreLink,
538
538
  variables: Variables,
539
539
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
540
540
  networkRequest: PromiseWrapper<void, any>,
@@ -625,9 +625,11 @@ export function readResolverFieldData(
625
625
  export function readScalarFieldData(
626
626
  field: ReaderScalarField,
627
627
  storeRecord: StoreRecord,
628
- root: Link,
628
+ root: StoreLink,
629
629
  variables: Variables,
630
- ): ReadDataResult<string | number | boolean | Link | DataTypeValue[] | null> {
630
+ ): ReadDataResult<
631
+ string | number | boolean | StoreLink | DataTypeValue[] | null
632
+ > {
631
633
  const storeRecordName = getParentRecordKey(field, variables);
632
634
  const value = storeRecord[storeRecordName];
633
635
  // TODO consider making scalars into discriminated unions. This probably has
@@ -646,14 +648,14 @@ export function readLinkedFieldData(
646
648
  environment: IsographEnvironment,
647
649
  field: ReaderLinkedField,
648
650
  storeRecord: StoreRecord,
649
- root: Link,
651
+ root: StoreLink,
650
652
  variables: Variables,
651
653
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
652
654
  networkRequest: PromiseWrapper<void, any>,
653
655
  networkRequestOptions: NetworkRequestReaderOptions,
654
656
  readData: <TReadFromStore>(
655
657
  ast: ReaderAst<TReadFromStore>,
656
- root: Link,
658
+ root: StoreLink,
657
659
  ) => ReadDataResult<object>,
658
660
  ): ReadDataResult<unknown> {
659
661
  const storeRecordName = getParentRecordKey(field, variables);
@@ -944,7 +946,7 @@ function stableStringifyArgs(args: object) {
944
946
  export function readImperativelyLoadedField(
945
947
  environment: IsographEnvironment,
946
948
  field: ReaderImperativelyLoadedField,
947
- root: Link,
949
+ root: StoreLink,
948
950
  variables: Variables,
949
951
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
950
952
  networkRequest: PromiseWrapper<void, any>,
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  ComponentOrFieldName,
16
16
  IsographEnvironment,
17
- type Link,
17
+ type StoreLink,
18
18
  } from './IsographEnvironment';
19
19
  import { Arguments } from './util';
20
20
 
@@ -71,7 +71,7 @@ export type RefetchReaderArtifact = {
71
71
  variables: any,
72
72
  // TODO type this better
73
73
  filteredVariables: any,
74
- rootLink: Link,
74
+ rootLink: StoreLink,
75
75
  readerArtifact: TopLevelReaderArtifact<any, any, any> | null,
76
76
  // TODO type this better
77
77
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
@@ -110,7 +110,7 @@ export type ReaderLinkedField = {
110
110
  readonly arguments: Arguments | null;
111
111
  readonly condition: EagerReaderArtifact<
112
112
  { data: any; parameters: any; startUpdate?: StartUpdate<any> },
113
- Link | null
113
+ StoreLink | null
114
114
  > | null;
115
115
  readonly isUpdatable: boolean;
116
116
  /**
@@ -16,8 +16,9 @@ import {
16
16
  import {
17
17
  assertLink,
18
18
  type IsographEnvironment,
19
- type Link,
19
+ type StoreLink,
20
20
  } from './IsographEnvironment';
21
+ import { logMessage } from './logging';
21
22
  import { readPromise, type PromiseWrapper } from './PromiseWrapper';
22
23
  import {
23
24
  readImperativelyLoadedField,
@@ -65,8 +66,16 @@ export function createStartUpdate<TReadFromStore extends UnknownTReadFromStore>(
65
66
  try {
66
67
  updater(data);
67
68
  } catch (e) {
69
+ logMessage(environment, () => ({
70
+ kind: 'StartUpdateError',
71
+ error: e,
72
+ }));
68
73
  throw e;
69
74
  } finally {
75
+ logMessage(environment, () => ({
76
+ kind: 'StartUpdateComplete',
77
+ updatedIds: mutableUpdatedIds,
78
+ }));
70
79
  callSubscriptions(environment, mutableUpdatedIds);
71
80
  }
72
81
  };
@@ -146,7 +155,7 @@ function defineCachedProperty<T>(
146
155
  function readUpdatableData<TReadFromStore extends UnknownTReadFromStore>(
147
156
  environment: IsographEnvironment,
148
157
  ast: ReaderAst<TReadFromStore>,
149
- root: Link,
158
+ root: StoreLink,
150
159
  variables: ExtractParameters<TReadFromStore>,
151
160
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
152
161
  networkRequest: PromiseWrapper<void, any>,
package/src/index.ts CHANGED
@@ -35,6 +35,7 @@ export {
35
35
  type IsographNetworkFunction,
36
36
  type IsographStore,
37
37
  type MissingFieldHandler,
38
+ type StoreLink,
38
39
  type Link,
39
40
  type StoreRecord,
40
41
  type CacheMap,
@@ -141,10 +142,12 @@ export {
141
142
  type UseImperativeReferenceResult,
142
143
  } from './react/useImperativeReference';
143
144
  export {
144
- FragmentReader,
145
+ FragmentRenderer,
145
146
  type IsExactlyIntrinsicAttributes,
146
- } from './react/FragmentReader';
147
+ } from './react/FragmentRenderer';
148
+ export { FragmentReader } from './react/FragmentReader';
147
149
  export { LoadableFieldReader } from './react/LoadableFieldReader';
150
+ export { LoadableFieldRenderer } from './react/LoadableFieldRenderer';
148
151
  export { useResult } from './react/useResult';
149
152
  export {
150
153
  useReadAndSubscribe,
@@ -1,4 +1,3 @@
1
- import * as React from 'react';
2
1
  import {
3
2
  type ExtractReadFromStore,
4
3
  type IsographEntrypoint,
@@ -7,40 +6,22 @@ import { type FragmentReference } from '../core/FragmentReference';
7
6
  import { type NetworkRequestReaderOptions } from '../core/read';
8
7
  import { useResult } from './useResult';
9
8
 
10
- export type IsExactlyIntrinsicAttributes<T> = T extends JSX.IntrinsicAttributes
11
- ? JSX.IntrinsicAttributes extends T
12
- ? true
13
- : false
14
- : false;
15
-
16
9
  export function FragmentReader<
17
- TProps extends Record<any, any>,
18
- TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>, any>,
19
- >(
20
- props: IsExactlyIntrinsicAttributes<TProps> extends true
21
- ? {
22
- fragmentReference: FragmentReference<
23
- ExtractReadFromStore<TEntrypoint>,
24
- React.FC<TProps>
25
- >;
26
- additionalProps?: Record<PropertyKey, never>;
27
- networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
28
- }
29
- : {
30
- fragmentReference: FragmentReference<
31
- ExtractReadFromStore<TEntrypoint>,
32
- React.FC<TProps>
33
- >;
34
- additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
35
- networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
36
- },
37
- ): React.ReactNode {
38
- const Component = useResult(
39
- props.fragmentReference,
40
- props.networkRequestOptions,
41
- );
42
- // TypeScript is not understanding that if additionalProps is Record<PropertyKey, never>,
43
- // it means that TProps === JSX.IntrinsicAttributes.
44
- // @ts-expect-error
45
- return <Component {...props.additionalProps} />;
10
+ TResult,
11
+ TEntrypoint extends IsographEntrypoint<any, TResult, any>,
12
+ TChildrenResult,
13
+ >({
14
+ fragmentReference,
15
+ networkRequestOptions,
16
+ children,
17
+ }: {
18
+ fragmentReference: FragmentReference<
19
+ ExtractReadFromStore<TEntrypoint>,
20
+ TResult
21
+ >;
22
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
23
+ children: (data: TResult) => TChildrenResult;
24
+ }): TChildrenResult {
25
+ const result = useResult(fragmentReference, networkRequestOptions);
26
+ return children(result);
46
27
  }
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+ import {
3
+ type ExtractReadFromStore,
4
+ type IsographEntrypoint,
5
+ } from '../core/entrypoint';
6
+ import { type FragmentReference } from '../core/FragmentReference';
7
+ import { type NetworkRequestReaderOptions } from '../core/read';
8
+ import { useResult } from './useResult';
9
+
10
+ export type IsExactlyIntrinsicAttributes<T> = T extends JSX.IntrinsicAttributes
11
+ ? JSX.IntrinsicAttributes extends T
12
+ ? true
13
+ : false
14
+ : false;
15
+
16
+ export function FragmentRenderer<
17
+ TProps extends Record<any, any>,
18
+ TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>, any>,
19
+ >(
20
+ props: IsExactlyIntrinsicAttributes<TProps> extends true
21
+ ? {
22
+ fragmentReference: FragmentReference<
23
+ ExtractReadFromStore<TEntrypoint>,
24
+ React.FC<TProps>
25
+ >;
26
+ additionalProps?: Record<PropertyKey, never>;
27
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
28
+ }
29
+ : {
30
+ fragmentReference: FragmentReference<
31
+ ExtractReadFromStore<TEntrypoint>,
32
+ React.FC<TProps>
33
+ >;
34
+ additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
35
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
36
+ },
37
+ ): React.ReactNode {
38
+ const Component = useResult(
39
+ props.fragmentReference,
40
+ props.networkRequestOptions,
41
+ );
42
+ // TypeScript is not understanding that if additionalProps is Record<PropertyKey, never>,
43
+ // it means that TProps === JSX.IntrinsicAttributes.
44
+ // @ts-expect-error
45
+ return <Component {...props.additionalProps} />;
46
+ }
@@ -8,9 +8,6 @@ import { type LoadableField } from '../core/reader';
8
8
  import { useClientSideDefer } from '../loadable-hooks/useClientSideDefer';
9
9
  import { useResult } from './useResult';
10
10
 
11
- // TODO
12
- // - LoadableFieldRenderer, which works for @loadable fields that are components,
13
- // i.e. just renders the resulting component
14
11
  export function LoadableFieldReader<
15
12
  TReadFromStore extends UnknownTReadFromStore,
16
13
  TResult,
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import { type FetchOptions } from '../core/check';
3
+ import {
4
+ ExtractParameters,
5
+ type UnknownTReadFromStore,
6
+ } from '../core/FragmentReference';
7
+ import { type NetworkRequestReaderOptions } from '../core/read';
8
+ import { type LoadableField } from '../core/reader';
9
+ import { useClientSideDefer } from '../loadable-hooks/useClientSideDefer';
10
+ import { useResult } from './useResult';
11
+
12
+ export function LoadableFieldRenderer<
13
+ TReadFromStore extends UnknownTReadFromStore,
14
+ TProvidedArgs extends object,
15
+ TChildrenResult,
16
+ TProps,
17
+ >(props: {
18
+ loadableField: LoadableField<
19
+ TReadFromStore,
20
+ React.FC<TProps>,
21
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
22
+ >;
23
+ // TODO we can improve this to not require args if its an empty object
24
+ args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>;
25
+ fetchOptions?: FetchOptions<React.FC<TProps>>;
26
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
27
+ additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
28
+ }): TChildrenResult {
29
+ const { fragmentReference } = useClientSideDefer(
30
+ props.loadableField,
31
+ props.args,
32
+ props.fetchOptions,
33
+ );
34
+
35
+ const Component = useResult(fragmentReference, props.networkRequestOptions);
36
+
37
+ // TODO we probably can figure out a way to convince TypeScript of
38
+ // the validity of this.
39
+ // @ts-expect-error
40
+ return <Component {...props.additionalProps} />;
41
+ }
@@ -0,0 +1,2 @@
1
+ import type { Link } from '@isograph/react';
2
+ export type Economist__link__output_type = Link<"Economist">;
@@ -16,7 +16,7 @@ const readerAst: ReaderAst<{ data: any, parameters: Record<PropertyKey, never> }
16
16
 
17
17
  const artifact: EagerReaderArtifact<
18
18
  { data: any, parameters: Record<PropertyKey, never> },
19
- Link | null
19
+ Link<"Economist"> | null
20
20
  > = {
21
21
  kind: "EagerReaderArtifact",
22
22
  fieldName: "Node.asEconomist",
@@ -0,0 +1,3 @@
1
+ import type { Link } from '@isograph/react';
2
+ export type Node__link__output_type =
3
+ | Link<"Economist">;
@@ -1,4 +1,4 @@
1
- import type { Link } from '@isograph/react';
1
+ import { type Node__link__output_type } from '../../Node/link/output_type';
2
2
  import type { StartUpdate } from '@isograph/react';
3
3
 
4
4
  export type Query__linkedUpdate__param = {
@@ -15,7 +15,7 @@ A client pointer for the Economist type.
15
15
  /**
16
16
  A store Link for the Node type.
17
17
  */
18
- readonly link: Link,
18
+ readonly link: Node__link__output_type,
19
19
  /**
20
20
  A client pointer for the Economist type.
21
21
  */
@@ -34,12 +34,12 @@ A client pointer for the Economist type.
34
34
  name: string,
35
35
  } | null),
36
36
  } | null),
37
- set node(value: ({ link: Link } | null)),
37
+ set node(value: ({ link: Node__link__output_type } | null)),
38
38
  readonly john_stuart_mill: ({
39
39
  /**
40
40
  A store Link for the Node type.
41
41
  */
42
- readonly link: Link,
42
+ readonly link: Node__link__output_type,
43
43
  /**
44
44
  A client pointer for the Economist type.
45
45
  */
@@ -16,7 +16,7 @@ import entrypoint_Query__subquery from '../__isograph/Query/subquery/entrypoint'
16
16
  // This means that the type of the exported iso literal is exactly
17
17
  // the type of the passed-in function, which takes one parameter
18
18
  // of type TParam.
19
- type IdentityWithParam<TParam extends object> = <TClientFieldReturn>(
19
+ type IdentityWithParam<TParam extends object, TReturnConstraint = unknown> = <TClientFieldReturn extends TReturnConstraint>(
20
20
  clientField: (param: TParam) => TClientFieldReturn
21
21
  ) => (param: TParam) => TClientFieldReturn;
22
22
 
@@ -0,0 +1,8 @@
1
+ {
2
+ "compilerOptions": {
3
+ "noUnusedLocals": false,
4
+ "noUnusedParameters": false,
5
+ "jsx": "preserve",
6
+ "esModuleInterop": true
7
+ }
8
+ }