houdini 1.0.0-next.2 → 1.0.0-next.20

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 (195) hide show
  1. package/README.md +4 -1
  2. package/build/cmd-cjs/index.js +5366 -2772
  3. package/build/cmd-esm/index.js +5340 -2746
  4. package/build/codegen/generators/artifacts/index.d.ts +2 -2
  5. package/build/codegen/generators/artifacts/indexFile.d.ts +2 -2
  6. package/build/codegen/generators/artifacts/selection.d.ts +5 -5
  7. package/build/codegen/generators/artifacts/utils.d.ts +0 -1
  8. package/build/codegen/generators/indexFile/index.d.ts +2 -2
  9. package/build/codegen/generators/persistedQueries/index.d.ts +2 -2
  10. package/build/codegen/generators/runtime/graphqlFunction.d.ts +2 -2
  11. package/build/codegen/generators/runtime/index.d.ts +2 -2
  12. package/build/codegen/generators/runtime/runtimeConfig.d.ts +7 -0
  13. package/build/codegen/generators/typescript/documentTypes.d.ts +2 -0
  14. package/build/codegen/generators/typescript/imperativeTypeDef.d.ts +2 -0
  15. package/build/codegen/generators/typescript/index.d.ts +2 -2
  16. package/build/codegen/generators/typescript/typeReference.d.ts +4 -2
  17. package/build/codegen/generators/typescript/types.d.ts +0 -1
  18. package/build/codegen/index.d.ts +2 -2
  19. package/build/codegen/transforms/addID.d.ts +2 -2
  20. package/build/codegen/transforms/composeQueries.d.ts +4 -4
  21. package/build/codegen/transforms/fragmentVariables.d.ts +3 -2
  22. package/build/codegen/transforms/list.d.ts +2 -2
  23. package/build/codegen/transforms/paginate.d.ts +2 -2
  24. package/build/codegen/transforms/schema.d.ts +2 -2
  25. package/build/codegen/transforms/typename.d.ts +2 -2
  26. package/build/codegen/utils/flattenSelections.d.ts +1 -1
  27. package/build/codegen/validators/noIDAlias.d.ts +2 -2
  28. package/build/codegen/validators/plugins.d.ts +2 -2
  29. package/build/codegen/validators/typeCheck.d.ts +2 -2
  30. package/build/codegen/validators/uniqueNames.d.ts +2 -2
  31. package/build/codegen-cjs/index.js +4694 -2137
  32. package/build/codegen-esm/index.js +4682 -2125
  33. package/build/lib/config.d.ts +15 -96
  34. package/build/lib/deepMerge.d.ts +1 -0
  35. package/build/lib/graphql.d.ts +5 -2
  36. package/build/lib/index.d.ts +2 -0
  37. package/build/lib/path.d.ts +1 -1
  38. package/build/lib/pipeline.d.ts +1 -1
  39. package/build/lib/plugin.d.ts +2 -0
  40. package/build/lib/types.d.ts +257 -6
  41. package/build/lib/walk.d.ts +4 -1
  42. package/build/lib-cjs/index.js +4108 -928
  43. package/build/lib-esm/index.js +4078 -907
  44. package/build/runtime/cache/cache.d.ts +28 -11
  45. package/build/runtime/cache/lists.d.ts +1 -0
  46. package/build/runtime/cache/staleManager.d.ts +30 -0
  47. package/build/runtime/cache/storage.d.ts +23 -20
  48. package/build/runtime/cache/stuff.d.ts +0 -2
  49. package/build/runtime/cache/subscription.d.ts +2 -1
  50. package/build/runtime/client/documentStore.d.ts +20 -17
  51. package/build/runtime/client/index.d.ts +13 -11
  52. package/build/runtime/client/plugins/cache.d.ts +1 -1
  53. package/build/runtime/client/plugins/fetch.d.ts +1 -1
  54. package/build/runtime/client/plugins/fetchParams.d.ts +2 -2
  55. package/build/runtime/client/plugins/injectedPlugins.d.ts +2 -1
  56. package/build/runtime/client/plugins/mutation.d.ts +1 -1
  57. package/build/runtime/client/plugins/query.d.ts +1 -1
  58. package/build/runtime/client/plugins/subscription.d.ts +2 -3
  59. package/build/runtime/client/plugins/throwOnError.d.ts +1 -1
  60. package/build/runtime/client/utils/documentPlugins.d.ts +3 -3
  61. package/build/runtime/generated.d.ts +1 -0
  62. package/build/runtime/imports/pluginConfig.d.ts +3 -0
  63. package/build/runtime/index.d.ts +1 -1
  64. package/build/runtime/lib/config.d.ts +27 -24
  65. package/build/runtime/lib/flatten.d.ts +2 -0
  66. package/build/runtime/lib/index.d.ts +1 -0
  67. package/build/runtime/lib/key.d.ts +6 -0
  68. package/build/runtime/lib/scalars.d.ts +3 -3
  69. package/build/runtime/lib/types.d.ts +46 -46
  70. package/build/runtime/public/cache.d.ts +26 -6
  71. package/build/runtime/public/record.d.ts +26 -17
  72. package/build/runtime/public/tests/test.d.ts +52 -10
  73. package/build/runtime/public/types.d.ts +8 -0
  74. package/build/runtime-cjs/cache/cache.d.ts +28 -11
  75. package/build/runtime-cjs/cache/cache.js +97 -22
  76. package/build/runtime-cjs/cache/gc.js +9 -0
  77. package/build/runtime-cjs/cache/lists.d.ts +1 -0
  78. package/build/runtime-cjs/cache/lists.js +9 -6
  79. package/build/runtime-cjs/cache/staleManager.d.ts +30 -0
  80. package/build/runtime-cjs/cache/staleManager.js +95 -0
  81. package/build/runtime-cjs/cache/storage.d.ts +23 -20
  82. package/build/runtime-cjs/cache/storage.js +11 -13
  83. package/build/runtime-cjs/cache/stuff.d.ts +0 -2
  84. package/build/runtime-cjs/cache/stuff.js +2 -19
  85. package/build/runtime-cjs/cache/subscription.d.ts +2 -1
  86. package/build/runtime-cjs/cache/subscription.js +11 -7
  87. package/build/runtime-cjs/client/documentStore.d.ts +20 -17
  88. package/build/runtime-cjs/client/documentStore.js +12 -8
  89. package/build/runtime-cjs/client/index.d.ts +13 -11
  90. package/build/runtime-cjs/client/index.js +48 -19
  91. package/build/runtime-cjs/client/plugins/cache.d.ts +1 -1
  92. package/build/runtime-cjs/client/plugins/cache.js +10 -8
  93. package/build/runtime-cjs/client/plugins/fetch.d.ts +1 -1
  94. package/build/runtime-cjs/client/plugins/fetch.js +9 -8
  95. package/build/runtime-cjs/client/plugins/fetchParams.d.ts +2 -2
  96. package/build/runtime-cjs/client/plugins/fetchParams.js +9 -4
  97. package/build/runtime-cjs/client/plugins/injectedPlugins.d.ts +2 -1
  98. package/build/runtime-cjs/client/plugins/mutation.d.ts +1 -1
  99. package/build/runtime-cjs/client/plugins/mutation.js +3 -3
  100. package/build/runtime-cjs/client/plugins/query.d.ts +1 -1
  101. package/build/runtime-cjs/client/plugins/query.js +4 -4
  102. package/build/runtime-cjs/client/plugins/subscription.d.ts +2 -3
  103. package/build/runtime-cjs/client/plugins/subscription.js +5 -3
  104. package/build/runtime-cjs/client/plugins/throwOnError.d.ts +1 -1
  105. package/build/runtime-cjs/client/plugins/throwOnError.js +3 -3
  106. package/build/runtime-cjs/client/utils/documentPlugins.d.ts +3 -3
  107. package/build/runtime-cjs/generated.d.ts +1 -0
  108. package/build/runtime-cjs/imports/pluginConfig.d.ts +3 -0
  109. package/build/runtime-cjs/imports/pluginConfig.js +27 -0
  110. package/build/runtime-cjs/index.d.ts +1 -1
  111. package/build/runtime-cjs/lib/config.d.ts +27 -24
  112. package/build/runtime-cjs/lib/config.js +11 -1
  113. package/build/runtime-cjs/lib/flatten.d.ts +2 -0
  114. package/build/runtime-cjs/lib/flatten.js +41 -0
  115. package/build/runtime-cjs/lib/index.d.ts +1 -0
  116. package/build/runtime-cjs/lib/index.js +1 -0
  117. package/build/runtime-cjs/lib/key.d.ts +6 -0
  118. package/build/runtime-cjs/lib/key.js +41 -0
  119. package/build/runtime-cjs/lib/scalars.d.ts +3 -3
  120. package/build/runtime-cjs/lib/scalars.js +13 -2
  121. package/build/runtime-cjs/lib/types.d.ts +46 -46
  122. package/build/runtime-cjs/lib/types.js +26 -30
  123. package/build/runtime-cjs/public/cache.d.ts +26 -6
  124. package/build/runtime-cjs/public/cache.js +32 -32
  125. package/build/runtime-cjs/public/list.js +6 -28
  126. package/build/runtime-cjs/public/record.d.ts +26 -17
  127. package/build/runtime-cjs/public/record.js +27 -187
  128. package/build/runtime-cjs/public/tests/test.d.ts +52 -10
  129. package/build/runtime-cjs/public/tests/test.js +27 -2
  130. package/build/runtime-cjs/public/types.d.ts +8 -0
  131. package/build/runtime-esm/cache/cache.d.ts +28 -11
  132. package/build/runtime-esm/cache/cache.js +99 -24
  133. package/build/runtime-esm/cache/gc.js +9 -0
  134. package/build/runtime-esm/cache/lists.d.ts +1 -0
  135. package/build/runtime-esm/cache/lists.js +9 -6
  136. package/build/runtime-esm/cache/staleManager.d.ts +30 -0
  137. package/build/runtime-esm/cache/staleManager.js +71 -0
  138. package/build/runtime-esm/cache/storage.d.ts +23 -20
  139. package/build/runtime-esm/cache/storage.js +11 -13
  140. package/build/runtime-esm/cache/stuff.d.ts +0 -2
  141. package/build/runtime-esm/cache/stuff.js +1 -17
  142. package/build/runtime-esm/cache/subscription.d.ts +2 -1
  143. package/build/runtime-esm/cache/subscription.js +12 -8
  144. package/build/runtime-esm/client/documentStore.d.ts +20 -17
  145. package/build/runtime-esm/client/documentStore.js +13 -9
  146. package/build/runtime-esm/client/index.d.ts +13 -11
  147. package/build/runtime-esm/client/index.js +49 -21
  148. package/build/runtime-esm/client/plugins/cache.d.ts +1 -1
  149. package/build/runtime-esm/client/plugins/cache.js +9 -7
  150. package/build/runtime-esm/client/plugins/fetch.d.ts +1 -1
  151. package/build/runtime-esm/client/plugins/fetch.js +8 -7
  152. package/build/runtime-esm/client/plugins/fetchParams.d.ts +2 -2
  153. package/build/runtime-esm/client/plugins/fetchParams.js +8 -3
  154. package/build/runtime-esm/client/plugins/injectedPlugins.d.ts +2 -1
  155. package/build/runtime-esm/client/plugins/mutation.d.ts +1 -1
  156. package/build/runtime-esm/client/plugins/mutation.js +2 -2
  157. package/build/runtime-esm/client/plugins/query.d.ts +1 -1
  158. package/build/runtime-esm/client/plugins/query.js +3 -3
  159. package/build/runtime-esm/client/plugins/subscription.d.ts +2 -3
  160. package/build/runtime-esm/client/plugins/subscription.js +4 -2
  161. package/build/runtime-esm/client/plugins/throwOnError.d.ts +1 -1
  162. package/build/runtime-esm/client/plugins/throwOnError.js +2 -2
  163. package/build/runtime-esm/client/utils/documentPlugins.d.ts +3 -3
  164. package/build/runtime-esm/generated.d.ts +1 -0
  165. package/build/runtime-esm/imports/pluginConfig.d.ts +3 -0
  166. package/build/runtime-esm/imports/pluginConfig.js +5 -0
  167. package/build/runtime-esm/index.d.ts +1 -1
  168. package/build/runtime-esm/lib/config.d.ts +27 -24
  169. package/build/runtime-esm/lib/config.js +11 -1
  170. package/build/runtime-esm/lib/flatten.d.ts +2 -0
  171. package/build/runtime-esm/lib/flatten.js +17 -0
  172. package/build/runtime-esm/lib/index.d.ts +1 -0
  173. package/build/runtime-esm/lib/index.js +1 -0
  174. package/build/runtime-esm/lib/key.d.ts +6 -0
  175. package/build/runtime-esm/lib/key.js +17 -0
  176. package/build/runtime-esm/lib/scalars.d.ts +3 -3
  177. package/build/runtime-esm/lib/scalars.js +13 -2
  178. package/build/runtime-esm/lib/types.d.ts +46 -46
  179. package/build/runtime-esm/lib/types.js +26 -30
  180. package/build/runtime-esm/public/cache.d.ts +26 -6
  181. package/build/runtime-esm/public/cache.js +31 -30
  182. package/build/runtime-esm/public/list.js +6 -28
  183. package/build/runtime-esm/public/record.d.ts +26 -17
  184. package/build/runtime-esm/public/record.js +26 -183
  185. package/build/runtime-esm/public/tests/test.d.ts +52 -10
  186. package/build/runtime-esm/public/tests/test.js +26 -1
  187. package/build/runtime-esm/public/types.d.ts +8 -0
  188. package/build/test/index.d.ts +3 -3
  189. package/build/test-cjs/index.js +5007 -2465
  190. package/build/test-esm/index.js +4995 -2453
  191. package/build/vite/houdini.d.ts +2 -0
  192. package/build/vite-cjs/index.js +5344 -2744
  193. package/build/vite-esm/index.js +5319 -2719
  194. package/package.json +6 -5
  195. package/build/codegen/generators/typescript/imperativeCache.d.ts +0 -2
@@ -1,33 +1,29 @@
1
- var CachePolicy = /* @__PURE__ */ ((CachePolicy2) => {
2
- CachePolicy2["CacheOrNetwork"] = "CacheOrNetwork";
3
- CachePolicy2["CacheOnly"] = "CacheOnly";
4
- CachePolicy2["NetworkOnly"] = "NetworkOnly";
5
- CachePolicy2["CacheAndNetwork"] = "CacheAndNetwork";
6
- return CachePolicy2;
7
- })(CachePolicy || {});
8
- var ArtifactKind = /* @__PURE__ */ ((ArtifactKind2) => {
9
- ArtifactKind2["Query"] = "HoudiniQuery";
10
- ArtifactKind2["Subscription"] = "HoudiniSubscription";
11
- ArtifactKind2["Mutation"] = "HoudiniMutation";
12
- ArtifactKind2["Fragment"] = "HoudiniFragment";
13
- return ArtifactKind2;
14
- })(ArtifactKind || {});
15
- const CompiledFragmentKind = "HoudiniFragment" /* Fragment */;
16
- const CompiledMutationKind = "HoudiniMutation" /* Mutation */;
17
- const CompiledQueryKind = "HoudiniQuery" /* Query */;
18
- const CompiledSubscriptionKind = "HoudiniSubscription" /* Subscription */;
19
- var RefetchUpdateMode = /* @__PURE__ */ ((RefetchUpdateMode2) => {
20
- RefetchUpdateMode2["append"] = "append";
21
- RefetchUpdateMode2["prepend"] = "prepend";
22
- RefetchUpdateMode2["replace"] = "replace";
23
- return RefetchUpdateMode2;
24
- })(RefetchUpdateMode || {});
25
- var DataSource = /* @__PURE__ */ ((DataSource2) => {
26
- DataSource2["Cache"] = "cache";
27
- DataSource2["Network"] = "network";
28
- DataSource2["Ssr"] = "ssr";
29
- return DataSource2;
30
- })(DataSource || {});
1
+ const CachePolicy = {
2
+ CacheOrNetwork: "CacheOrNetwork",
3
+ CacheOnly: "CacheOnly",
4
+ NetworkOnly: "NetworkOnly",
5
+ CacheAndNetwork: "CacheAndNetwork"
6
+ };
7
+ const ArtifactKind = {
8
+ Query: "HoudiniQuery",
9
+ Subscription: "HoudiniSubscription",
10
+ Mutation: "HoudiniMutation",
11
+ Fragment: "HoudiniFragment"
12
+ };
13
+ const CompiledFragmentKind = ArtifactKind.Fragment;
14
+ const CompiledMutationKind = ArtifactKind.Mutation;
15
+ const CompiledQueryKind = ArtifactKind.Query;
16
+ const CompiledSubscriptionKind = ArtifactKind.Subscription;
17
+ const RefetchUpdateMode = {
18
+ append: "append",
19
+ prepend: "prepend",
20
+ replace: "replace"
21
+ };
22
+ const DataSource = {
23
+ Cache: "cache",
24
+ Network: "network",
25
+ Ssr: "ssr"
26
+ };
31
27
  export {
32
28
  ArtifactKind,
33
29
  CachePolicy,
@@ -1,19 +1,39 @@
1
1
  import type { Cache as _Cache } from '../cache/cache';
2
- import type { SchemaManager, TypeInfo } from '../cache/schema';
2
+ import { type QueryArtifact } from '../lib';
3
3
  import { ListCollection } from './list';
4
4
  import { Record } from './record';
5
- import type { CacheTypeDef, IDFields, TypeNames, ValidLists } from './types';
5
+ import type { ArgType, CacheTypeDef, IDFields, QueryInput, QueryList, QueryValue, TypeFieldNames, TypeNames, ValidLists } from './types';
6
6
  export declare class Cache<Def extends CacheTypeDef> {
7
7
  _internal_unstable: _Cache;
8
8
  constructor(cache: _Cache);
9
9
  validateInstabilityWarning(): void;
10
- setFieldType(...args: Parameters<SchemaManager['setFieldType']>): void;
11
- get root(): Record<Def, '__ROOT__'>;
12
10
  get<T extends TypeNames<Def>>(type: T, data: IDFields<Def, T>): Record<Def, T>;
13
- get config(): import("..").ConfigFile;
11
+ get config(): import("../lib").ConfigFile;
14
12
  list<Name extends ValidLists<Def>>(name: Name, { parentID, allLists }?: {
15
13
  parentID?: string;
16
14
  allLists?: boolean;
17
15
  }): ListCollection<Def, Name>;
16
+ read<_Query extends {
17
+ artifact: QueryArtifact;
18
+ }>({ query, variables, }: {
19
+ query: _Query;
20
+ variables?: QueryInput<QueryList<Def>, _Query>;
21
+ }): {
22
+ data: QueryValue<QueryList<Def>, _Query> | null;
23
+ partial: boolean;
24
+ };
25
+ write<_Query extends {
26
+ artifact: QueryArtifact;
27
+ }>({ query, variables, data, }: {
28
+ query: _Query;
29
+ data: QueryValue<QueryList<Def>, _Query>;
30
+ variables?: QueryInput<QueryList<Def>, _Query>;
31
+ }): void;
32
+ /**
33
+ * Mark some elements of the cache stale.
34
+ */
35
+ markStale<_Type extends TypeNames<Def>, _Field extends TypeFieldNames<Def, _Type>>(type?: _Type, options?: {
36
+ field?: _Field;
37
+ when?: ArgType<Def, _Type, _Field>;
38
+ }): void;
18
39
  }
19
- export declare function _typeInfo<Def extends CacheTypeDef>(cache: Cache<Def>, type: string, field: string): TypeInfo;
@@ -1,4 +1,4 @@
1
- import { rootID } from "../cache/cache";
1
+ import { marshalInputs } from "../lib";
2
2
  import { ListCollection } from "./list";
3
3
  import { Record } from "./record";
4
4
  class Cache {
@@ -12,19 +12,6 @@ class Cache {
12
12
  Please acknowledge this by setting acceptImperativeInstability to true in your config file.`);
13
13
  }
14
14
  }
15
- setFieldType(...args) {
16
- this.validateInstabilityWarning();
17
- this._internal_unstable._internal_unstable.schema.setFieldType(...args);
18
- }
19
- get root() {
20
- this.validateInstabilityWarning();
21
- return new Record({
22
- cache: this,
23
- type: "Query",
24
- id: rootID,
25
- idFields: {}
26
- });
27
- }
28
15
  get(type, data) {
29
16
  this.validateInstabilityWarning();
30
17
  let recordID = this._internal_unstable._internal_unstable.id(type, data);
@@ -42,6 +29,7 @@ Please acknowledge this by setting acceptImperativeInstability to true in your c
42
29
  return this._internal_unstable._internal_unstable.config;
43
30
  }
44
31
  list(name, { parentID, allLists } = {}) {
32
+ this.validateInstabilityWarning();
45
33
  return new ListCollection({
46
34
  cache: this,
47
35
  name,
@@ -49,24 +37,37 @@ Please acknowledge this by setting acceptImperativeInstability to true in your c
49
37
  allLists
50
38
  });
51
39
  }
52
- }
53
- function _typeInfo(cache, type, field) {
54
- if (field === "__typename") {
55
- return {
56
- type: "String",
57
- nullable: false,
58
- link: false
59
- };
40
+ read({
41
+ query,
42
+ variables
43
+ }) {
44
+ this.validateInstabilityWarning();
45
+ return this._internal_unstable.read({
46
+ selection: query.artifact.selection,
47
+ variables
48
+ });
49
+ }
50
+ write({
51
+ query,
52
+ variables,
53
+ data
54
+ }) {
55
+ this.validateInstabilityWarning();
56
+ this._internal_unstable.write({
57
+ selection: query.artifact.selection,
58
+ data,
59
+ variables: marshalInputs({
60
+ config: this.config,
61
+ artifact: query.artifact,
62
+ input: variables
63
+ }) ?? {}
64
+ });
65
+ return;
60
66
  }
61
- const info = cache._internal_unstable._internal_unstable.schema.fieldType(type, field);
62
- if (!info) {
63
- throw new Error(
64
- `Unknown field: ${field} for type ${type}. Please provide type information using setFieldType().`
65
- );
67
+ markStale(type, options) {
68
+ return this._internal_unstable.markTypeStale(type ? { ...options, type } : void 0);
66
69
  }
67
- return info;
68
70
  }
69
71
  export {
70
- Cache,
71
- _typeInfo
72
+ Cache
72
73
  };
@@ -1,5 +1,3 @@
1
- import { keyFieldsForType } from "../lib/config";
2
- import { _typeInfo } from "./cache";
3
1
  import { Record } from "./record";
4
2
  class ListCollection {
5
3
  #parentID;
@@ -60,7 +58,7 @@ class ListCollection {
60
58
  return new ListCollection({
61
59
  parentID: this.#parentID,
62
60
  allLists: this.#allLists,
63
- when: this.#when,
61
+ when: filter,
64
62
  cache: this.#cache,
65
63
  name: this.#name
66
64
  });
@@ -96,36 +94,16 @@ class ListCollection {
96
94
  }
97
95
  }
98
96
  #listOperationPayload(records) {
99
- const selection = {
100
- abstractFields: {
101
- fields: {},
102
- typeMap: {}
103
- }
104
- };
97
+ let selection = this.#collection.selection;
98
+ const connectionSelection = selection.fields?.["edges"]?.selection?.fields?.node.selection;
99
+ if (connectionSelection) {
100
+ selection = connectionSelection;
101
+ }
105
102
  const data = [];
106
103
  for (const record of records) {
107
104
  if (!(record instanceof Record)) {
108
105
  throw new Error("You must provide a Record to a list operation");
109
106
  }
110
- const keys = keyFieldsForType(this.#cache.config, record.type);
111
- selection.abstractFields.fields[record.type] = keys.reduce(
112
- (acc, key) => {
113
- const keyInfo = _typeInfo(this.#cache, record.type, key);
114
- return {
115
- ...acc,
116
- [key]: {
117
- type: keyInfo.type,
118
- keyRaw: key
119
- }
120
- };
121
- },
122
- {
123
- __typename: {
124
- type: "String",
125
- keyRaw: "__typename"
126
- }
127
- }
128
- );
129
107
  data.push({ __typename: record.type, ...record.idFields });
130
108
  }
131
109
  return {
@@ -1,5 +1,6 @@
1
+ import type { FragmentArtifact } from '../lib/types';
1
2
  import type { Cache } from './cache';
2
- import type { ArgType, CacheTypeDef, FieldType, TypeFieldNames, ValidTypes } from './types';
3
+ import type { ArgType, CacheTypeDef, FragmentList, FragmentValue, FragmentVariables, TypeFieldNames, ValidTypes } from './types';
3
4
  export declare class Record<Def extends CacheTypeDef, Type extends ValidTypes<Def>> {
4
5
  #private;
5
6
  type: string;
@@ -10,22 +11,30 @@ export declare class Record<Def extends CacheTypeDef, Type extends ValidTypes<De
10
11
  idFields: {};
11
12
  id: string;
12
13
  });
13
- set<Field extends TypeFieldNames<Def, Type>>({ field, args, value, }: {
14
- field: Field;
15
- args?: ArgType<Def, Type, Field>;
16
- value: FieldType<Def, Type, Field>;
14
+ read<_Fragment extends {
15
+ artifact: FragmentArtifact;
16
+ }>({ fragment, variables, }: {
17
+ fragment: _Fragment;
18
+ variables?: FragmentVariables<FragmentList<Def, Type>, _Fragment>;
19
+ }): {
20
+ data: FragmentValue<FragmentList<Def, Type>, _Fragment> | null;
21
+ partial: boolean;
22
+ };
23
+ write<_Fragment extends {
24
+ artifact: FragmentArtifact;
25
+ }, _Variable>(args: {
26
+ fragment: _Fragment;
27
+ data: FragmentValue<FragmentList<Def, Type>, _Fragment>;
28
+ variables?: FragmentVariables<FragmentList<Def, Type>, _Fragment>;
29
+ forceStale?: boolean;
17
30
  }): void;
18
- get<Field extends TypeFieldNames<Def, Type>>({ field, args, }: {
19
- field: Field;
20
- args?: ArgType<Def, Type, Field>;
21
- }): FieldType<Def, Type, Field>;
22
31
  delete(): void;
32
+ /**
33
+ * Mark some elements of the record stale in the cache.
34
+ * @param field
35
+ * @param when
36
+ */
37
+ markStale<Field extends TypeFieldNames<Def, Type>>(field?: Field, { when, }?: {
38
+ when?: ArgType<Def, Type, Field>;
39
+ }): void;
23
40
  }
24
- export declare function computeKey({ field, args }: {
25
- field: string;
26
- args?: {
27
- [key: string]: any;
28
- };
29
- }): string;
30
- export declare const stringifyObjectWithNoQuotesOnKeys: (obj_from_json: {}) => string;
31
- export declare function marshalNestedList(list: any[]): any[];
@@ -1,6 +1,6 @@
1
1
  import { rootID } from "../cache/cache";
2
+ import { marshalInputs } from "../lib";
2
3
  import { keyFieldsForType } from "../lib/config";
3
- import { _typeInfo } from "./cache";
4
4
  class Record {
5
5
  #id;
6
6
  #cache;
@@ -24,199 +24,42 @@ class Record {
24
24
  }
25
25
  }
26
26
  }
27
- set({
28
- field,
29
- args,
30
- value
27
+ read({
28
+ fragment,
29
+ variables
31
30
  }) {
32
- this.#cache.validateInstabilityWarning();
33
- const key = computeKey({ field, args });
34
- const typeInfo = _typeInfo(this.#cache, this.type, field);
35
- let newValue;
36
- if (typeInfo.link) {
37
- const keys = keyFieldsForType(this.#cache.config, typeInfo.type);
38
- typeInfo.selection = {
39
- fields: keys.reduce(
40
- (acc, key2) => {
41
- const keyInfo = _typeInfo(this.#cache, typeInfo.type, key2);
42
- return {
43
- ...acc,
44
- [key2]: {
45
- type: keyInfo.type,
46
- keyRaw: key2
47
- }
48
- };
49
- },
50
- {
51
- __typename: {
52
- type: "String",
53
- keyRaw: "__typename"
54
- }
55
- }
56
- )
57
- };
58
- }
59
- if (!typeInfo.link) {
60
- const fnMarshal = this.#cache.config.scalars?.[typeInfo.type]?.marshal;
61
- if (fnMarshal) {
62
- newValue = fnMarshal(value);
63
- } else {
64
- newValue = value;
65
- }
66
- } else if (value instanceof Record) {
67
- newValue = {
68
- ...value.idFields,
69
- __typename: value.type
70
- };
71
- } else if (Array.isArray(value)) {
72
- newValue = marshalNestedList(value);
73
- } else if (value !== null) {
74
- throw new Error("Value must be a RecordProxy if the field is a link to another record");
75
- }
76
- this.#cache._internal_unstable._internal_unstable.lifetimes.resetLifetime(this.#id, key);
77
- this.#cache._internal_unstable.write({
31
+ return this.#cache._internal_unstable.read({
32
+ selection: fragment.artifact.selection,
78
33
  parent: this.#id,
79
- selection: {
80
- fields: {
81
- [field]: {
82
- keyRaw: key,
83
- ...typeInfo
84
- }
85
- }
86
- },
87
- data: {
88
- [field]: newValue
89
- }
34
+ variables: marshalInputs({
35
+ config: this.#cache.config,
36
+ artifact: fragment.artifact,
37
+ input: variables
38
+ }) ?? void 0
90
39
  });
91
40
  }
92
- get({
93
- field,
94
- args
95
- }) {
96
- this.#cache.validateInstabilityWarning();
97
- const key = computeKey({ field, args });
98
- const typeInfo = _typeInfo(this.#cache, this.type, field);
99
- if (typeInfo.link) {
100
- const keys = keyFieldsForType(this.#cache.config, typeInfo.type);
101
- typeInfo.selection = {
102
- fields: keys.reduce(
103
- (acc, key2) => {
104
- const keyInfo = _typeInfo(this.#cache, typeInfo.type, key2);
105
- return {
106
- ...acc,
107
- [key2]: {
108
- type: keyInfo.type,
109
- keyRaw: key2
110
- }
111
- };
112
- },
113
- {
114
- __typename: {
115
- type: "String",
116
- keyRaw: "__typename"
117
- }
118
- }
119
- )
120
- };
121
- }
122
- const result = this.#cache._internal_unstable.read({
41
+ write(args) {
42
+ this.#cache._internal_unstable.write({
43
+ data: args.data,
44
+ selection: args.fragment.artifact.selection,
123
45
  parent: this.#id,
124
- selection: {
125
- fields: {
126
- [field]: {
127
- keyRaw: key,
128
- ...typeInfo
129
- }
130
- }
131
- }
132
- });
133
- if (!typeInfo.link) {
134
- return result.data?.[field] ?? (typeInfo.nullable ? null : void 0);
135
- }
136
- const data = result.data?.[field] || {};
137
- let finalResult = unmarshalNestedList(
138
- this.#cache,
139
- !Array.isArray(data) ? [data] : data
140
- ).map((val) => {
141
- if (typeInfo.nullable && (val === null || Object.keys(val).length === 0)) {
142
- return null;
143
- }
144
- return val;
46
+ variables: marshalInputs({
47
+ config: this.#cache.config,
48
+ artifact: args.fragment.artifact,
49
+ input: args.variables
50
+ }) ?? void 0,
51
+ forceStale: args.forceStale
145
52
  });
146
- return Array.isArray(data) ? finalResult : finalResult[0];
147
53
  }
148
54
  delete() {
149
55
  this.#cache._internal_unstable.delete(this.#id);
150
56
  }
151
- }
152
- function computeKey({ field, args }) {
153
- const keys = Object.keys(args ?? {});
154
- keys.sort();
155
- return args && keys.length > 0 ? `${field}(${keys.map((key) => `${key}: ${stringifyObjectWithNoQuotesOnKeys(args[key])}`).join(", ")})` : field;
156
- }
157
- const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => {
158
- if (Array.isArray(obj_from_json)) {
159
- return `[${obj_from_json.map((obj) => `${stringifyObjectWithNoQuotesOnKeys(obj)}`).join(", ")}]`;
160
- }
161
- if (typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null) {
162
- return JSON.stringify(obj_from_json).replace(/"([^"]+)":/g, "$1: ");
163
- }
164
- return `{${Object.keys(obj_from_json).map((key) => `${key}: ${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`).join(", ")}}`;
165
- };
166
- function marshalNestedList(list) {
167
- const newValue = [];
168
- for (const inner of list) {
169
- if (Array.isArray(inner)) {
170
- newValue.push(marshalNestedList(inner));
171
- } else if (inner instanceof Record) {
172
- newValue.push({ ...inner.idFields, __typename: inner.type });
173
- } else {
174
- newValue.push(inner);
175
- }
176
- }
177
- return newValue;
178
- }
179
- function unmarshalNestedList(cache, list) {
180
- const newValue = [];
181
- for (const inner of list) {
182
- if (Array.isArray(inner)) {
183
- newValue.push(unmarshalNestedList(cache, inner));
184
- } else if (inner === null) {
185
- newValue.push(null);
186
- } else if (inner.__typename) {
187
- const type = inner.__typename;
188
- let recordID = cache._internal_unstable._internal_unstable.id(type, inner);
189
- if (!recordID) {
190
- throw new Error("todo");
191
- }
192
- const typename = cache._internal_unstable.read({
193
- selection: {
194
- fields: {
195
- __typename: {
196
- keyRaw: "__typename",
197
- type: "String"
198
- }
199
- }
200
- },
201
- parent: recordID
202
- }).data?.__typename;
203
- newValue.push(
204
- new Record({
205
- cache,
206
- type: type || typename,
207
- idFields: inner,
208
- id: recordID
209
- })
210
- );
211
- } else {
212
- newValue.push(inner);
213
- }
57
+ markStale(field, {
58
+ when
59
+ } = {}) {
60
+ this.#cache._internal_unstable.markRecordStale(this.#id, { field, when });
214
61
  }
215
- return newValue;
216
62
  }
217
63
  export {
218
- Record,
219
- computeKey,
220
- marshalNestedList,
221
- stringifyObjectWithNoQuotesOnKeys
64
+ Record
222
65
  };
@@ -1,9 +1,11 @@
1
+ import { type SubscriptionSelection, type FragmentArtifact, type QueryArtifact } from '../../lib';
1
2
  import { Cache } from '../cache';
2
3
  import type { Record } from '../record';
3
- type CacheTypeDef = {
4
+ export type CacheTypeDefTest = {
4
5
  types: {
5
6
  __ROOT__: {
6
7
  idFields: {};
8
+ fragments: [];
7
9
  fields: {
8
10
  test: {
9
11
  type: number | null;
@@ -14,23 +16,23 @@ type CacheTypeDef = {
14
16
  args: never;
15
17
  };
16
18
  viewer: {
17
- type: Record<CacheTypeDef, 'User'> | null;
19
+ type: Record<CacheTypeDefTest, 'User'> | null;
18
20
  args: never;
19
21
  };
20
22
  pets: {
21
- type: (Record<CacheTypeDef, 'Cat'> | Record<CacheTypeDef, 'User'>)[];
23
+ type: (Record<CacheTypeDefTest, 'Cat'> | Record<CacheTypeDefTest, 'User'>)[];
22
24
  args: never;
23
25
  };
24
26
  listOfLists: {
25
- type: ((Record<CacheTypeDef, 'Cat'> | Record<CacheTypeDef, 'User'> | null | (null | Record<CacheTypeDef, 'User'>)[])[] | Record<CacheTypeDef, 'Cat'> | Record<CacheTypeDef, 'User'> | null)[];
27
+ type: ((Record<CacheTypeDefTest, 'Cat'> | Record<CacheTypeDefTest, 'User'> | null | (null | Record<CacheTypeDefTest, 'User'>)[])[] | Record<CacheTypeDefTest, 'Cat'> | Record<CacheTypeDefTest, 'User'> | null)[];
26
28
  args: never;
27
29
  };
28
30
  users: {
29
- type: Record<CacheTypeDef, 'User'>[] | null;
31
+ type: Record<CacheTypeDefTest, 'User'>[] | null;
30
32
  args: never;
31
33
  };
32
34
  pet: {
33
- type: Record<CacheTypeDef, 'Cat'> | Record<CacheTypeDef, 'User'>;
35
+ type: Record<CacheTypeDefTest, 'Cat'> | Record<CacheTypeDefTest, 'User'>;
34
36
  args: never;
35
37
  };
36
38
  };
@@ -39,13 +41,26 @@ type CacheTypeDef = {
39
41
  idFields: {
40
42
  id: string;
41
43
  };
44
+ fragments: [
45
+ [
46
+ {
47
+ artifact: FragmentArtifact;
48
+ },
49
+ {
50
+ firstName: string;
51
+ },
52
+ {
53
+ pattern: string;
54
+ }
55
+ ]
56
+ ];
42
57
  fields: {
43
58
  firstName: {
44
59
  type: string;
45
60
  args: never;
46
61
  };
47
62
  parent: {
48
- type: Record<CacheTypeDef, 'User'>;
63
+ type: Record<CacheTypeDefTest, 'User'>;
49
64
  args: never;
50
65
  };
51
66
  id: {
@@ -62,13 +77,14 @@ type CacheTypeDef = {
62
77
  idFields: {
63
78
  id: string;
64
79
  };
80
+ fragments: [];
65
81
  fields: {
66
82
  name: {
67
83
  type: string | null;
68
84
  args: never;
69
85
  };
70
86
  parent: {
71
- type: Record<CacheTypeDef, 'User'> | null;
87
+ type: Record<CacheTypeDefTest, 'User'> | null;
72
88
  args: never;
73
89
  };
74
90
  id: {
@@ -85,6 +101,7 @@ type CacheTypeDef = {
85
101
  idFields: {
86
102
  id: string;
87
103
  };
104
+ fragments: [];
88
105
  fields: {
89
106
  name: {
90
107
  type: string | null;
@@ -97,6 +114,26 @@ type CacheTypeDef = {
97
114
  };
98
115
  };
99
116
  };
117
+ queries: [
118
+ [
119
+ {
120
+ artifact: QueryArtifact;
121
+ },
122
+ {
123
+ viewer: {
124
+ id: string;
125
+ firstName: string;
126
+ __typename: string;
127
+ parent: {
128
+ id: string;
129
+ firstName: string;
130
+ __typename: string;
131
+ };
132
+ };
133
+ },
134
+ any
135
+ ]
136
+ ];
100
137
  lists: {
101
138
  All_Pets: {
102
139
  types: 'User' | 'Cat';
@@ -110,5 +147,10 @@ type CacheTypeDef = {
110
147
  };
111
148
  };
112
149
  };
113
- export declare const testCache: () => Cache<CacheTypeDef>;
114
- export {};
150
+ export declare const testCache: () => Cache<CacheTypeDefTest>;
151
+ export declare const testFragment: (selection: SubscriptionSelection) => {
152
+ artifact: FragmentArtifact;
153
+ };
154
+ export declare const testQuery: (selection: SubscriptionSelection) => {
155
+ artifact: QueryArtifact;
156
+ };