@isograph/react 0.0.0-main-3de26263 → 0.0.0-main-709dc2bb

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 (260) hide show
  1. package/.turbo/turbo-compile-libs.log +9 -2
  2. package/dist/_virtual/rolldown_runtime.js +25 -0
  3. package/dist/core/FragmentReference.d.mts +38 -0
  4. package/dist/core/FragmentReference.d.mts.map +1 -0
  5. package/dist/core/FragmentReference.d.ts +31 -29
  6. package/dist/core/FragmentReference.d.ts.map +1 -1
  7. package/dist/core/FragmentReference.js +7 -5
  8. package/dist/core/FragmentReference.mjs +10 -0
  9. package/dist/core/FragmentReference.mjs.map +1 -0
  10. package/dist/core/IsographEnvironment.d.mts +89 -0
  11. package/dist/core/IsographEnvironment.d.mts.map +1 -0
  12. package/dist/core/IsographEnvironment.d.ts +76 -81
  13. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  14. package/dist/core/IsographEnvironment.js +59 -82
  15. package/dist/core/IsographEnvironment.mjs +67 -0
  16. package/dist/core/IsographEnvironment.mjs.map +1 -0
  17. package/dist/core/PromiseWrapper.d.mts +36 -0
  18. package/dist/core/PromiseWrapper.d.mts.map +1 -0
  19. package/dist/core/PromiseWrapper.d.ts +26 -23
  20. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  21. package/dist/core/PromiseWrapper.js +45 -43
  22. package/dist/core/PromiseWrapper.mjs +49 -0
  23. package/dist/core/PromiseWrapper.mjs.map +1 -0
  24. package/dist/core/areEqualWithDeepComparison.js +56 -93
  25. package/dist/core/areEqualWithDeepComparison.mjs +62 -0
  26. package/dist/core/areEqualWithDeepComparison.mjs.map +1 -0
  27. package/dist/core/brand.d.mts +19 -0
  28. package/dist/core/brand.d.mts.map +1 -0
  29. package/dist/core/brand.d.ts +6 -6
  30. package/dist/core/brand.d.ts.map +1 -1
  31. package/dist/core/cache.d.mts +20 -0
  32. package/dist/core/cache.d.mts.map +1 -0
  33. package/dist/core/cache.d.ts +18 -24
  34. package/dist/core/cache.d.ts.map +1 -1
  35. package/dist/core/cache.js +203 -306
  36. package/dist/core/cache.mjs +237 -0
  37. package/dist/core/cache.mjs.map +1 -0
  38. package/dist/core/check.d.mts +28 -0
  39. package/dist/core/check.d.mts.map +1 -0
  40. package/dist/core/check.d.ts +21 -19
  41. package/dist/core/check.d.ts.map +1 -1
  42. package/dist/core/check.js +80 -122
  43. package/dist/core/check.mjs +84 -0
  44. package/dist/core/check.mjs.map +1 -0
  45. package/dist/core/componentCache.js +9 -10
  46. package/dist/core/componentCache.mjs +12 -0
  47. package/dist/core/componentCache.mjs.map +1 -0
  48. package/dist/core/entrypoint.d.mts +99 -0
  49. package/dist/core/entrypoint.d.mts.map +1 -0
  50. package/dist/core/entrypoint.d.ts +83 -80
  51. package/dist/core/entrypoint.d.ts.map +1 -1
  52. package/dist/core/entrypoint.js +6 -5
  53. package/dist/core/entrypoint.mjs +8 -0
  54. package/dist/core/entrypoint.mjs.map +1 -0
  55. package/dist/core/garbageCollection.d.mts +18 -0
  56. package/dist/core/garbageCollection.d.mts.map +1 -0
  57. package/dist/core/garbageCollection.d.ts +15 -16
  58. package/dist/core/garbageCollection.d.ts.map +1 -1
  59. package/dist/core/garbageCollection.js +76 -120
  60. package/dist/core/garbageCollection.mjs +89 -0
  61. package/dist/core/garbageCollection.mjs.map +1 -0
  62. package/dist/core/getOrCreateCacheForArtifact.js +35 -38
  63. package/dist/core/getOrCreateCacheForArtifact.mjs +38 -0
  64. package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -0
  65. package/dist/core/logging.d.mts +95 -0
  66. package/dist/core/logging.d.mts.map +1 -0
  67. package/dist/core/logging.d.ts +66 -61
  68. package/dist/core/logging.d.ts.map +1 -1
  69. package/dist/core/logging.js +17 -18
  70. package/dist/core/logging.mjs +20 -0
  71. package/dist/core/logging.mjs.map +1 -0
  72. package/dist/core/makeNetworkRequest.d.mts +13 -0
  73. package/dist/core/makeNetworkRequest.d.mts.map +1 -0
  74. package/dist/core/makeNetworkRequest.d.ts +12 -10
  75. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  76. package/dist/core/makeNetworkRequest.js +180 -260
  77. package/dist/core/makeNetworkRequest.mjs +195 -0
  78. package/dist/core/makeNetworkRequest.mjs.map +1 -0
  79. package/dist/core/optimisticProxy.d.mts +43 -0
  80. package/dist/core/optimisticProxy.d.mts.map +1 -0
  81. package/dist/core/optimisticProxy.d.ts +37 -53
  82. package/dist/core/optimisticProxy.d.ts.map +1 -1
  83. package/dist/core/optimisticProxy.js +245 -353
  84. package/dist/core/optimisticProxy.mjs +268 -0
  85. package/dist/core/optimisticProxy.mjs.map +1 -0
  86. package/dist/core/read.d.mts +29 -0
  87. package/dist/core/read.d.mts.map +1 -0
  88. package/dist/core/read.d.ts +23 -29
  89. package/dist/core/read.d.ts.map +1 -1
  90. package/dist/core/read.js +435 -634
  91. package/dist/core/read.mjs +456 -0
  92. package/dist/core/read.mjs.map +1 -0
  93. package/dist/core/reader.d.mts +89 -0
  94. package/dist/core/reader.d.mts.map +1 -0
  95. package/dist/core/reader.d.ts +78 -79
  96. package/dist/core/reader.d.ts.map +1 -1
  97. package/dist/core/startUpdate.js +115 -149
  98. package/dist/core/startUpdate.mjs +125 -0
  99. package/dist/core/startUpdate.mjs.map +1 -0
  100. package/dist/core/subscribe.d.mts +12 -0
  101. package/dist/core/subscribe.d.mts.map +1 -0
  102. package/dist/core/subscribe.d.ts +11 -7
  103. package/dist/core/subscribe.d.ts.map +1 -1
  104. package/dist/core/subscribe.js +67 -109
  105. package/dist/core/subscribe.mjs +79 -0
  106. package/dist/core/subscribe.mjs.map +1 -0
  107. package/dist/core/util.d.mts +27 -0
  108. package/dist/core/util.d.mts.map +1 -0
  109. package/dist/core/util.d.ts +21 -24
  110. package/dist/core/util.d.ts.map +1 -1
  111. package/dist/core/util.js +17 -23
  112. package/dist/core/util.mjs +21 -0
  113. package/dist/core/util.mjs.map +1 -0
  114. package/dist/core/writeData.d.mts +11 -0
  115. package/dist/core/writeData.d.mts.map +1 -0
  116. package/dist/core/writeData.d.ts +10 -6
  117. package/dist/core/writeData.d.ts.map +1 -1
  118. package/dist/core/writeData.js +39 -34
  119. package/dist/core/writeData.mjs +42 -0
  120. package/dist/core/writeData.mjs.map +1 -0
  121. package/dist/index.d.mts +32 -0
  122. package/dist/index.d.ts +32 -32
  123. package/dist/index.js +70 -72
  124. package/dist/index.mjs +31 -0
  125. package/dist/loadable-hooks/useClientSideDefer.d.mts +12 -0
  126. package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -0
  127. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -13
  128. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  129. package/dist/loadable-hooks/useClientSideDefer.js +13 -44
  130. package/dist/loadable-hooks/useClientSideDefer.mjs +14 -0
  131. package/dist/loadable-hooks/useClientSideDefer.mjs.map +1 -0
  132. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts +33 -0
  133. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -0
  134. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +26 -22
  135. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  136. package/dist/loadable-hooks/useConnectionSpecPagination.js +133 -176
  137. package/dist/loadable-hooks/useConnectionSpecPagination.mjs +134 -0
  138. package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -0
  139. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts +8 -0
  140. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -0
  141. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -3
  142. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  143. package/dist/loadable-hooks/useImperativeExposedMutationField.js +9 -12
  144. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs +11 -0
  145. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs.map +1 -0
  146. package/dist/loadable-hooks/useImperativeLoadableField.d.mts +19 -0
  147. package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -0
  148. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +15 -11
  149. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  150. package/dist/loadable-hooks/useImperativeLoadableField.js +16 -12
  151. package/dist/loadable-hooks/useImperativeLoadableField.mjs +17 -0
  152. package/dist/loadable-hooks/useImperativeLoadableField.mjs.map +1 -0
  153. package/dist/loadable-hooks/useSkipLimitPagination.d.mts +24 -0
  154. package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -0
  155. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +19 -15
  156. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  157. package/dist/loadable-hooks/useSkipLimitPagination.js +118 -164
  158. package/dist/loadable-hooks/useSkipLimitPagination.mjs +119 -0
  159. package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -0
  160. package/dist/react/FragmentReader.d.mts +18 -0
  161. package/dist/react/FragmentReader.d.mts.map +1 -0
  162. package/dist/react/FragmentReader.d.ts +16 -8
  163. package/dist/react/FragmentReader.d.ts.map +1 -1
  164. package/dist/react/FragmentReader.js +8 -7
  165. package/dist/react/FragmentReader.mjs +10 -0
  166. package/dist/react/FragmentReader.mjs.map +1 -0
  167. package/dist/react/FragmentRenderer.d.mts +20 -0
  168. package/dist/react/FragmentRenderer.d.mts.map +1 -0
  169. package/dist/react/FragmentRenderer.d.ts +18 -14
  170. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  171. package/dist/react/FragmentRenderer.js +11 -33
  172. package/dist/react/FragmentRenderer.mjs +12 -0
  173. package/dist/react/FragmentRenderer.mjs.map +1 -0
  174. package/dist/react/IsographEnvironmentProvider.d.mts +17 -0
  175. package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -0
  176. package/dist/react/IsographEnvironmentProvider.d.ts +15 -9
  177. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  178. package/dist/react/IsographEnvironmentProvider.js +15 -39
  179. package/dist/react/IsographEnvironmentProvider.mjs +17 -0
  180. package/dist/react/IsographEnvironmentProvider.mjs.map +1 -0
  181. package/dist/react/LoadableFieldReader.d.mts +21 -0
  182. package/dist/react/LoadableFieldReader.d.mts.map +1 -0
  183. package/dist/react/LoadableFieldReader.d.ts +15 -13
  184. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  185. package/dist/react/LoadableFieldReader.js +13 -47
  186. package/dist/react/LoadableFieldReader.mjs +14 -0
  187. package/dist/react/LoadableFieldReader.mjs.map +1 -0
  188. package/dist/react/LoadableFieldRenderer.d.mts +22 -0
  189. package/dist/react/LoadableFieldRenderer.d.mts.map +1 -0
  190. package/dist/react/LoadableFieldRenderer.d.ts +16 -14
  191. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  192. package/dist/react/LoadableFieldRenderer.js +13 -70
  193. package/dist/react/LoadableFieldRenderer.mjs +14 -0
  194. package/dist/react/LoadableFieldRenderer.mjs.map +1 -0
  195. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +18 -0
  196. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -0
  197. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +11 -3
  198. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -1
  199. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +17 -13
  200. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs +18 -0
  201. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs.map +1 -0
  202. package/dist/react/createIsographEnvironment.d.mts +9 -0
  203. package/dist/react/createIsographEnvironment.d.mts.map +1 -0
  204. package/dist/react/createIsographEnvironment.d.ts +7 -3
  205. package/dist/react/createIsographEnvironment.d.ts.map +1 -1
  206. package/dist/react/createIsographEnvironment.js +8 -6
  207. package/dist/react/createIsographEnvironment.mjs +11 -0
  208. package/dist/react/createIsographEnvironment.mjs.map +1 -0
  209. package/dist/react/maybeUnwrapNetworkRequest.js +9 -12
  210. package/dist/react/maybeUnwrapNetworkRequest.mjs +12 -0
  211. package/dist/react/maybeUnwrapNetworkRequest.mjs.map +1 -0
  212. package/dist/react/useImperativeReference.d.mts +15 -0
  213. package/dist/react/useImperativeReference.d.mts.map +1 -0
  214. package/dist/react/useImperativeReference.d.ts +13 -11
  215. package/dist/react/useImperativeReference.d.ts.map +1 -1
  216. package/dist/react/useImperativeReference.js +34 -30
  217. package/dist/react/useImperativeReference.mjs +35 -0
  218. package/dist/react/useImperativeReference.mjs.map +1 -0
  219. package/dist/react/useLazyReference.d.mts +13 -0
  220. package/dist/react/useLazyReference.d.mts.map +1 -0
  221. package/dist/react/useLazyReference.d.ts +11 -9
  222. package/dist/react/useLazyReference.d.ts.map +1 -1
  223. package/dist/react/useLazyReference.js +17 -40
  224. package/dist/react/useLazyReference.mjs +18 -0
  225. package/dist/react/useLazyReference.mjs.map +1 -0
  226. package/dist/react/useReadAndSubscribe.d.mts +20 -0
  227. package/dist/react/useReadAndSubscribe.d.mts.map +1 -0
  228. package/dist/react/useReadAndSubscribe.d.ts +14 -11
  229. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  230. package/dist/react/useReadAndSubscribe.js +54 -63
  231. package/dist/react/useReadAndSubscribe.mjs +59 -0
  232. package/dist/react/useReadAndSubscribe.mjs.map +1 -0
  233. package/dist/react/useRerenderOnChange.d.mts +12 -0
  234. package/dist/react/useRerenderOnChange.d.mts.map +1 -0
  235. package/dist/react/useRerenderOnChange.d.ts +10 -6
  236. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  237. package/dist/react/useRerenderOnChange.js +16 -20
  238. package/dist/react/useRerenderOnChange.mjs +17 -0
  239. package/dist/react/useRerenderOnChange.mjs.map +1 -0
  240. package/dist/react/useResult.d.mts +8 -0
  241. package/dist/react/useResult.d.mts.map +1 -0
  242. package/dist/react/useResult.d.ts +7 -3
  243. package/dist/react/useResult.d.ts.map +1 -1
  244. package/dist/react/useResult.js +27 -30
  245. package/dist/react/useResult.mjs +30 -0
  246. package/dist/react/useResult.mjs.map +1 -0
  247. package/package.json +16 -8
  248. package/dist/core/areEqualWithDeepComparison.d.ts +0 -3
  249. package/dist/core/areEqualWithDeepComparison.d.ts.map +0 -1
  250. package/dist/core/brand.js +0 -2
  251. package/dist/core/componentCache.d.ts +0 -5
  252. package/dist/core/componentCache.d.ts.map +0 -1
  253. package/dist/core/getOrCreateCacheForArtifact.d.ts +0 -8
  254. package/dist/core/getOrCreateCacheForArtifact.d.ts.map +0 -1
  255. package/dist/core/reader.js +0 -2
  256. package/dist/core/startUpdate.d.ts +0 -9
  257. package/dist/core/startUpdate.d.ts.map +0 -1
  258. package/dist/index.d.ts.map +0 -1
  259. package/dist/react/maybeUnwrapNetworkRequest.d.ts +0 -4
  260. package/dist/react/maybeUnwrapNetworkRequest.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startUpdate.mjs","names":["mutableUpdatedIds: EncounteredIds","startUpdate: StartUpdateStoreLayer['startUpdate']","value:\n | { kind: 'Set'; value: T; validatedAt: number }\n | {\n kind: 'NotSet';\n }","target: { [index: string]: any }","storeRecord","ast","root"],"sources":["../../src/core/startUpdate.ts"],"sourcesContent":["import {\n getParentRecordKey,\n insertEmptySetIfMissing,\n type EncounteredIds,\n} from './cache';\nimport type { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';\nimport {\n stableIdForFragmentReference,\n type ExtractParameters,\n type ExtractStartUpdate,\n type ExtractUpdatableData,\n type FragmentReference,\n type UnknownTReadFromStore,\n} from './FragmentReference';\nimport {\n assertLink,\n type IsographEnvironment,\n type StoreLink,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n addStartUpdateStoreLayer,\n getMutableStoreRecordProxy,\n getOrInsertRecord,\n type StartUpdateStoreLayer,\n type StoreLayer,\n} from './optimisticProxy';\nimport { readPromise, type PromiseWrapper } from './PromiseWrapper';\nimport {\n readImperativelyLoadedField,\n readLinkedFieldData,\n readLoadablySelectedFieldData,\n readResolverFieldData,\n readScalarFieldData,\n type NetworkRequestReaderOptions,\n type ReadDataResultSuccess,\n} from './read';\nimport type { ReaderAst } from './reader';\nimport { callSubscriptions } from './subscribe';\n\nexport function getOrCreateCachedStartUpdate<\n TReadFromStore extends UnknownTReadFromStore,\n>(\n environment: IsographEnvironment,\n fragmentReference: FragmentReference<TReadFromStore, unknown>,\n networkRequestOptions: NetworkRequestReaderOptions,\n): ExtractStartUpdate<TReadFromStore> {\n return (environment.eagerReaderCache[\n stableIdForFragmentReference(fragmentReference)\n ] ??= createStartUpdate(\n environment,\n fragmentReference,\n networkRequestOptions,\n ));\n}\n\nexport function createStartUpdate<TReadFromStore extends UnknownTReadFromStore>(\n environment: IsographEnvironment,\n fragmentReference: FragmentReference<TReadFromStore, unknown>,\n networkRequestOptions: NetworkRequestReaderOptions,\n): ExtractStartUpdate<TReadFromStore> {\n return (updater) => {\n let mutableUpdatedIds: EncounteredIds = new Map();\n\n const startUpdate: StartUpdateStoreLayer['startUpdate'] = (storeLayer) => {\n mutableUpdatedIds.clear();\n let updatableData = createUpdatableProxy(\n environment,\n storeLayer,\n fragmentReference,\n networkRequestOptions,\n mutableUpdatedIds,\n );\n\n try {\n updater({ updatableData });\n } catch (e) {\n logMessage(environment, () => ({\n kind: 'StartUpdateError',\n error: e,\n }));\n throw e;\n }\n };\n\n environment.store = addStartUpdateStoreLayer(\n environment.store,\n startUpdate,\n );\n\n logMessage(environment, () => ({\n kind: 'StartUpdateComplete',\n updatedIds: mutableUpdatedIds,\n }));\n\n callSubscriptions(environment, mutableUpdatedIds);\n };\n}\n\nexport function createUpdatableProxy<\n TReadFromStore extends UnknownTReadFromStore,\n>(\n environment: IsographEnvironment,\n storeLayer: StoreLayer,\n fragmentReference: FragmentReference<TReadFromStore, unknown>,\n networkRequestOptions: NetworkRequestReaderOptions,\n mutableUpdatedIds: EncounteredIds,\n): ExtractUpdatableData<TReadFromStore> {\n const readerWithRefetchQueries = readPromise(\n fragmentReference.readerWithRefetchQueries,\n );\n\n return readUpdatableData(\n environment,\n storeLayer,\n readerWithRefetchQueries.readerArtifact.readerAst,\n fragmentReference.root,\n fragmentReference.variables ?? {},\n readerWithRefetchQueries.nestedRefetchQueries,\n fragmentReference.networkRequest,\n networkRequestOptions,\n {\n lastInvalidated: 0,\n },\n mutableUpdatedIds,\n ).data;\n}\n\ntype MutableInvalidationState = {\n lastInvalidated: number;\n};\n\nfunction defineCachedProperty<T>(\n target: T,\n property: PropertyKey,\n mutableState: MutableInvalidationState,\n get: () => any,\n set?: (v: any) => void,\n) {\n let value:\n | { kind: 'Set'; value: T; validatedAt: number }\n | {\n kind: 'NotSet';\n } = {\n kind: 'NotSet',\n };\n\n Object.defineProperty(target, property, {\n configurable: false,\n enumerable: true,\n get: () => {\n if (\n value.kind === 'NotSet' ||\n value.validatedAt < mutableState.lastInvalidated\n ) {\n value = {\n kind: 'Set',\n value: get(),\n validatedAt: mutableState.lastInvalidated,\n };\n }\n return value.value;\n },\n ...(set != null && {\n set: (newValue) => {\n set(newValue);\n mutableState.lastInvalidated++;\n },\n }),\n });\n}\n\nfunction readUpdatableData<TReadFromStore extends UnknownTReadFromStore>(\n environment: IsographEnvironment,\n storeLayer: StoreLayer,\n ast: ReaderAst<TReadFromStore>,\n root: StoreLink,\n variables: ExtractParameters<TReadFromStore>,\n nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n networkRequest: PromiseWrapper<void, any>,\n networkRequestOptions: NetworkRequestReaderOptions,\n mutableState: MutableInvalidationState,\n mutableUpdatedIds: EncounteredIds,\n): ReadDataResultSuccess<ExtractUpdatableData<TReadFromStore>> {\n const storeRecord = getMutableStoreRecordProxy(storeLayer, root);\n let target: { [index: string]: any } = {};\n\n for (const field of ast) {\n switch (field.kind) {\n case 'Scalar': {\n const storeRecordName = getParentRecordKey(field, variables);\n\n defineCachedProperty(\n target,\n field.alias ?? field.fieldName,\n mutableState,\n () => {\n const data = readScalarFieldData(\n field,\n storeRecord,\n root,\n variables,\n );\n if (data.kind === 'MissingData') {\n throw new Error(data.reason);\n }\n return data.data;\n },\n field.isUpdatable\n ? (newValue) => {\n const storeRecord = getOrInsertRecord(storeLayer.data, root);\n storeRecord[storeRecordName] = newValue;\n const updatedIds = insertEmptySetIfMissing(\n mutableUpdatedIds,\n root.__typename,\n );\n updatedIds.add(root.__link);\n }\n : undefined,\n );\n break;\n }\n case 'Linked': {\n const storeRecordName = getParentRecordKey(field, variables);\n defineCachedProperty(\n target,\n field.alias ?? field.fieldName,\n mutableState,\n () => {\n const data = readLinkedFieldData(\n environment,\n field,\n storeRecord,\n root,\n variables,\n nestedRefetchQueries,\n networkRequest,\n networkRequestOptions,\n (ast, root) =>\n readUpdatableData(\n environment,\n storeLayer,\n ast,\n root,\n variables,\n nestedRefetchQueries,\n networkRequest,\n networkRequestOptions,\n mutableState,\n mutableUpdatedIds,\n ),\n );\n if (data.kind === 'MissingData') {\n throw new Error(data.reason);\n }\n return data.data;\n },\n 'isUpdatable' in field && field.isUpdatable\n ? (newValue) => {\n const storeRecord = getOrInsertRecord(storeLayer.data, root);\n if (Array.isArray(newValue)) {\n storeRecord[storeRecordName] = newValue.map((node) =>\n assertLink(node?.__link),\n );\n } else {\n storeRecord[storeRecordName] = assertLink(newValue?.__link);\n }\n const updatedIds = insertEmptySetIfMissing(\n mutableUpdatedIds,\n root.__typename,\n );\n updatedIds.add(root.__link);\n }\n : undefined,\n );\n break;\n }\n case 'ImperativelyLoadedField': {\n defineCachedProperty(target, field.alias, mutableState, () => {\n const data = readImperativelyLoadedField(\n environment,\n field,\n root,\n variables,\n nestedRefetchQueries,\n networkRequest,\n networkRequestOptions,\n new Map(),\n );\n if (data.kind === 'MissingData') {\n throw new Error(data.reason);\n }\n return data.data;\n });\n break;\n }\n case 'Resolver': {\n defineCachedProperty(target, field.alias, mutableState, () => {\n const data = readResolverFieldData(\n environment,\n field,\n root,\n variables,\n nestedRefetchQueries,\n networkRequest,\n networkRequestOptions,\n new Map(),\n );\n if (data.kind === 'MissingData') {\n throw new Error(data.reason);\n }\n return data.data;\n });\n break;\n }\n case 'LoadablySelectedField': {\n defineCachedProperty(target, field.alias, mutableState, () => {\n const data = readLoadablySelectedFieldData(\n environment,\n field,\n root,\n variables,\n networkRequest,\n networkRequestOptions,\n new Map(),\n );\n if (data.kind === 'MissingData') {\n throw new Error(data.reason);\n }\n return data.data;\n });\n break;\n }\n case 'Link': {\n target[field.alias] = root;\n break;\n }\n }\n }\n\n return {\n kind: 'Success',\n data: target as any,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { ReaderAst } from "./reader.mjs";
2
+ import { WithEncounteredRecords } from "./read.mjs";
3
+ import { IsographEnvironment } from "./IsographEnvironment.mjs";
4
+ import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.mjs";
5
+ import { EncounteredIds } from "./cache.mjs";
6
+
7
+ //#region src/core/subscribe.d.ts
8
+ declare function subscribe<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void, readerAst: ReaderAst<TReadFromStore>): () => void;
9
+ declare function callSubscriptions(environment: IsographEnvironment, recordsEncounteredWhenNormalizing: EncounteredIds): void;
10
+ //#endregion
11
+ export { callSubscriptions, subscribe };
12
+ //# sourceMappingURL=subscribe.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.d.mts","names":[],"sources":["../../src/core/subscribe.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAcgB,iCAAiC,oCAClC,gDACc,uBAAuB,oCAC/B,kBAAkB,+DAEL,uBAAuB,qCAE5C,UAAU;iBAyCP,iBAAA,cACD,wDACsB"}
@@ -1,8 +1,12 @@
1
- import type { EncounteredIds } from './cache';
2
- import type { FragmentReference, UnknownTReadFromStore } from './FragmentReference';
3
- import type { IsographEnvironment } from './IsographEnvironment';
4
- import { type WithEncounteredRecords } from './read';
5
- import type { ReaderAst } from './reader';
6
- export declare function subscribe<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void, readerAst: ReaderAst<TReadFromStore>): () => void;
7
- export declare function callSubscriptions(environment: IsographEnvironment, recordsEncounteredWhenNormalizing: EncounteredIds): void;
1
+ import { ReaderAst } from "./reader.js";
2
+ import { WithEncounteredRecords } from "./read.js";
3
+ import { IsographEnvironment } from "./IsographEnvironment.js";
4
+ import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.js";
5
+ import { EncounteredIds } from "./cache.js";
6
+
7
+ //#region src/core/subscribe.d.ts
8
+ declare function subscribe<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void, readerAst: ReaderAst<TReadFromStore>): () => void;
9
+ declare function callSubscriptions(environment: IsographEnvironment, recordsEncounteredWhenNormalizing: EncounteredIds): void;
10
+ //#endregion
11
+ export { callSubscriptions, subscribe };
8
12
  //# sourceMappingURL=subscribe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/core/subscribe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,sBAAsB,EAAwB,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,wBAAgB,SAAS,CAAC,cAAc,SAAS,qBAAqB,EACpE,WAAW,EAAE,mBAAmB,EAChC,yBAAyB,EAAE,sBAAsB,CAAC,cAAc,CAAC,EACjE,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,EACzD,QAAQ,EAAE,CACR,4BAA4B,EAAE,sBAAsB,CAAC,cAAc,CAAC,KACjE,IAAI,EACT,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,GACnC,MAAM,IAAI,CAiBZ;AAuBD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,mBAAmB,EAChC,iCAAiC,EAAE,cAAc,QA4ClD"}
1
+ {"version":3,"file":"subscribe.d.ts","names":[],"sources":["../../src/core/subscribe.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAcgB,iCAAiC,oCAClC,gDACc,uBAAuB,oCAC/B,kBAAkB,+DAEL,uBAAuB,qCAE5C,UAAU;iBAyCP,iBAAA,cACD,wDACsB"}
@@ -1,121 +1,79 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.subscribe = subscribe;
4
- exports.callSubscriptions = callSubscriptions;
5
- const areEqualWithDeepComparison_1 = require("./areEqualWithDeepComparison");
6
- const logging_1 = require("./logging");
7
- const read_1 = require("./read");
1
+ const require_logging = require('./logging.js');
2
+ const require_areEqualWithDeepComparison = require('./areEqualWithDeepComparison.js');
3
+ const require_read = require('./read.js');
4
+
5
+ //#region src/core/subscribe.ts
8
6
  function subscribe(environment, encounteredDataAndRecords, fragmentReference, callback, readerAst) {
9
- const fragmentSubscription = {
10
- kind: 'FragmentSubscription',
11
- callback,
12
- encounteredDataAndRecords,
13
- fragmentReference,
14
- readerAst,
15
- };
16
- // subscribe is called in an effect. (We should actually subscribe during the
17
- // initial render.) Because it's called in an effect, we might have missed some
18
- // changes since the initial render! So, at this point, we re-read and call the
19
- // subscription (i.e. re-render) if the fragment data has changed.
20
- callSubscriptionIfDataChanged(environment, fragmentSubscription);
21
- environment.subscriptions.add(fragmentSubscription);
22
- return () => environment.subscriptions.delete(fragmentSubscription);
7
+ const fragmentSubscription = {
8
+ kind: "FragmentSubscription",
9
+ callback,
10
+ encounteredDataAndRecords,
11
+ fragmentReference,
12
+ readerAst
13
+ };
14
+ callSubscriptionIfDataChanged(environment, fragmentSubscription);
15
+ environment.subscriptions.add(fragmentSubscription);
16
+ return () => environment.subscriptions.delete(fragmentSubscription);
23
17
  }
24
- // Calls to readButDoNotEvaluate can suspend (i.e. throw a promise).
25
- // Maybe in the future, they will be able to throw errors.
26
- //
27
- // That's probably okay to ignore. We don't, however, want to prevent
28
- // updating other subscriptions if one subscription had missing data.
29
18
  function logAnyError(environment, context, f) {
30
- try {
31
- f();
32
- }
33
- catch (e) {
34
- (0, logging_1.logMessage)(environment, () => ({
35
- kind: 'ErrorEncounteredInWithErrorHandling',
36
- error: e,
37
- context,
38
- }));
39
- }
19
+ try {
20
+ f();
21
+ } catch (e) {
22
+ require_logging.logMessage(environment, () => ({
23
+ kind: "ErrorEncounteredInWithErrorHandling",
24
+ error: e,
25
+ context
26
+ }));
27
+ }
40
28
  }
41
29
  function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
42
- environment.subscriptions.forEach((subscription) => logAnyError(environment, { situation: 'calling subscriptions' }, () => {
43
- var _a;
44
- switch (subscription.kind) {
45
- case 'FragmentSubscription': {
46
- // TODO if there are multiple components subscribed to the same
47
- // fragment, we will call readButNotEvaluate multiple times. We
48
- // should fix that.
49
- if (hasOverlappingIds(recordsEncounteredWhenNormalizing, subscription.encounteredDataAndRecords.encounteredRecords)) {
50
- callSubscriptionIfDataChanged(environment, subscription);
51
- }
52
- return;
53
- }
54
- case 'AnyRecords': {
55
- logAnyError(environment, { situation: 'calling AnyRecords callback' }, () => subscription.callback());
56
- return;
57
- }
58
- case 'AnyChangesToRecord': {
59
- if (((_a = recordsEncounteredWhenNormalizing
60
- .get(subscription.recordLink.__typename)) === null || _a === void 0 ? void 0 : _a.has(subscription.recordLink.__link)) != null) {
61
- logAnyError(environment, { situation: 'calling AnyChangesToRecord callback' }, () => subscription.callback());
62
- }
63
- return;
64
- }
65
- }
66
- }));
30
+ environment.subscriptions.forEach((subscription) => logAnyError(environment, { situation: "calling subscriptions" }, () => {
31
+ switch (subscription.kind) {
32
+ case "FragmentSubscription":
33
+ if (hasOverlappingIds(recordsEncounteredWhenNormalizing, subscription.encounteredDataAndRecords.encounteredRecords)) callSubscriptionIfDataChanged(environment, subscription);
34
+ return;
35
+ case "AnyRecords":
36
+ logAnyError(environment, { situation: "calling AnyRecords callback" }, () => subscription.callback());
37
+ return;
38
+ case "AnyChangesToRecord":
39
+ if (recordsEncounteredWhenNormalizing.get(subscription.recordLink.__typename)?.has(subscription.recordLink.__link) != null) logAnyError(environment, { situation: "calling AnyChangesToRecord callback" }, () => subscription.callback());
40
+ return;
41
+ }
42
+ }));
67
43
  }
68
44
  function callSubscriptionIfDataChanged(environment, subscription) {
69
- const newEncounteredDataAndRecords = (0, read_1.readButDoNotEvaluate)(environment, subscription.fragmentReference,
70
- // Is this wrong?
71
- // Reasons to think no:
72
- // - we are only updating the read-out value, and the network
73
- // options only affect whether we throw.
74
- // - the component will re-render, and re-throw on its own, anyway.
75
- //
76
- // Reasons to think not:
77
- // - it seems more efficient to suspend here and not update state,
78
- // if we expect that the component will just throw anyway
79
- // - consistency
80
- // - it's also weird, this is called from makeNetworkRequest, where
81
- // we don't currently pass network request options
82
- {
83
- suspendIfInFlight: false,
84
- throwOnNetworkError: false,
85
- });
86
- const mergedItem = (0, areEqualWithDeepComparison_1.mergeObjectsUsingReaderAst)(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item);
87
- (0, logging_1.logMessage)(environment, () => ({
88
- kind: 'DeepEqualityCheck',
89
- fragmentReference: subscription.fragmentReference,
90
- old: subscription.encounteredDataAndRecords.item,
91
- new: newEncounteredDataAndRecords.item,
92
- deeplyEqual: mergedItem === subscription.encounteredDataAndRecords.item,
93
- }));
94
- if (mergedItem !== subscription.encounteredDataAndRecords.item) {
95
- logAnyError(environment, { situation: 'calling FragmentSubscription callback' }, () => {
96
- subscription.callback(newEncounteredDataAndRecords);
97
- });
98
- subscription.encounteredDataAndRecords = newEncounteredDataAndRecords;
99
- }
45
+ const newEncounteredDataAndRecords = require_read.readButDoNotEvaluate(environment, subscription.fragmentReference, {
46
+ suspendIfInFlight: false,
47
+ throwOnNetworkError: false
48
+ });
49
+ const mergedItem = require_areEqualWithDeepComparison.mergeObjectsUsingReaderAst(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item);
50
+ require_logging.logMessage(environment, () => ({
51
+ kind: "DeepEqualityCheck",
52
+ fragmentReference: subscription.fragmentReference,
53
+ old: subscription.encounteredDataAndRecords.item,
54
+ new: newEncounteredDataAndRecords.item,
55
+ deeplyEqual: mergedItem === subscription.encounteredDataAndRecords.item
56
+ }));
57
+ if (mergedItem !== subscription.encounteredDataAndRecords.item) {
58
+ logAnyError(environment, { situation: "calling FragmentSubscription callback" }, () => {
59
+ subscription.callback(newEncounteredDataAndRecords);
60
+ });
61
+ subscription.encounteredDataAndRecords = newEncounteredDataAndRecords;
62
+ }
100
63
  }
101
64
  function hasOverlappingIds(ids1, ids2) {
102
- for (const [typeName, set1] of ids1.entries()) {
103
- const set2 = ids2.get(typeName);
104
- if (set2 === undefined) {
105
- continue;
106
- }
107
- if (isNotDisjointFrom(set1, set2)) {
108
- return true;
109
- }
110
- }
111
- return false;
65
+ for (const [typeName, set1] of ids1.entries()) {
66
+ const set2 = ids2.get(typeName);
67
+ if (set2 === void 0) continue;
68
+ if (isNotDisjointFrom(set1, set2)) return true;
69
+ }
70
+ return false;
112
71
  }
113
- // TODO use a polyfill library
114
72
  function isNotDisjointFrom(set1, set2) {
115
- for (const id of set1) {
116
- if (set2.has(id)) {
117
- return true;
118
- }
119
- }
120
- return false;
73
+ for (const id of set1) if (set2.has(id)) return true;
74
+ return false;
121
75
  }
76
+
77
+ //#endregion
78
+ exports.callSubscriptions = callSubscriptions;
79
+ exports.subscribe = subscribe;
@@ -0,0 +1,79 @@
1
+ import { logMessage } from "./logging.mjs";
2
+ import { mergeObjectsUsingReaderAst } from "./areEqualWithDeepComparison.mjs";
3
+ import { readButDoNotEvaluate } from "./read.mjs";
4
+
5
+ //#region src/core/subscribe.ts
6
+ function subscribe(environment, encounteredDataAndRecords, fragmentReference, callback, readerAst) {
7
+ const fragmentSubscription = {
8
+ kind: "FragmentSubscription",
9
+ callback,
10
+ encounteredDataAndRecords,
11
+ fragmentReference,
12
+ readerAst
13
+ };
14
+ callSubscriptionIfDataChanged(environment, fragmentSubscription);
15
+ environment.subscriptions.add(fragmentSubscription);
16
+ return () => environment.subscriptions.delete(fragmentSubscription);
17
+ }
18
+ function logAnyError(environment, context, f) {
19
+ try {
20
+ f();
21
+ } catch (e) {
22
+ logMessage(environment, () => ({
23
+ kind: "ErrorEncounteredInWithErrorHandling",
24
+ error: e,
25
+ context
26
+ }));
27
+ }
28
+ }
29
+ function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
30
+ environment.subscriptions.forEach((subscription) => logAnyError(environment, { situation: "calling subscriptions" }, () => {
31
+ switch (subscription.kind) {
32
+ case "FragmentSubscription":
33
+ if (hasOverlappingIds(recordsEncounteredWhenNormalizing, subscription.encounteredDataAndRecords.encounteredRecords)) callSubscriptionIfDataChanged(environment, subscription);
34
+ return;
35
+ case "AnyRecords":
36
+ logAnyError(environment, { situation: "calling AnyRecords callback" }, () => subscription.callback());
37
+ return;
38
+ case "AnyChangesToRecord":
39
+ if (recordsEncounteredWhenNormalizing.get(subscription.recordLink.__typename)?.has(subscription.recordLink.__link) != null) logAnyError(environment, { situation: "calling AnyChangesToRecord callback" }, () => subscription.callback());
40
+ return;
41
+ }
42
+ }));
43
+ }
44
+ function callSubscriptionIfDataChanged(environment, subscription) {
45
+ const newEncounteredDataAndRecords = readButDoNotEvaluate(environment, subscription.fragmentReference, {
46
+ suspendIfInFlight: false,
47
+ throwOnNetworkError: false
48
+ });
49
+ const mergedItem = mergeObjectsUsingReaderAst(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item);
50
+ logMessage(environment, () => ({
51
+ kind: "DeepEqualityCheck",
52
+ fragmentReference: subscription.fragmentReference,
53
+ old: subscription.encounteredDataAndRecords.item,
54
+ new: newEncounteredDataAndRecords.item,
55
+ deeplyEqual: mergedItem === subscription.encounteredDataAndRecords.item
56
+ }));
57
+ if (mergedItem !== subscription.encounteredDataAndRecords.item) {
58
+ logAnyError(environment, { situation: "calling FragmentSubscription callback" }, () => {
59
+ subscription.callback(newEncounteredDataAndRecords);
60
+ });
61
+ subscription.encounteredDataAndRecords = newEncounteredDataAndRecords;
62
+ }
63
+ }
64
+ function hasOverlappingIds(ids1, ids2) {
65
+ for (const [typeName, set1] of ids1.entries()) {
66
+ const set2 = ids2.get(typeName);
67
+ if (set2 === void 0) continue;
68
+ if (isNotDisjointFrom(set1, set2)) return true;
69
+ }
70
+ return false;
71
+ }
72
+ function isNotDisjointFrom(set1, set2) {
73
+ for (const id of set1) if (set2.has(id)) return true;
74
+ return false;
75
+ }
76
+
77
+ //#endregion
78
+ export { callSubscriptions, subscribe };
79
+ //# sourceMappingURL=subscribe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.mjs","names":["fragmentSubscription: FragmentSubscription<TReadFromStore>"],"sources":["../../src/core/subscribe.ts"],"sourcesContent":["import { mergeObjectsUsingReaderAst } from './areEqualWithDeepComparison';\nimport type { EncounteredIds } from './cache';\nimport type {\n FragmentReference,\n UnknownTReadFromStore,\n} from './FragmentReference';\nimport type {\n FragmentSubscription,\n IsographEnvironment,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { type WithEncounteredRecords, readButDoNotEvaluate } from './read';\nimport type { ReaderAst } from './reader';\n\nexport function subscribe<TReadFromStore extends UnknownTReadFromStore>(\n environment: IsographEnvironment,\n encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>,\n fragmentReference: FragmentReference<TReadFromStore, any>,\n callback: (\n newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>,\n ) => void,\n readerAst: ReaderAst<TReadFromStore>,\n): () => void {\n const fragmentSubscription: FragmentSubscription<TReadFromStore> = {\n kind: 'FragmentSubscription',\n callback,\n encounteredDataAndRecords,\n fragmentReference,\n readerAst,\n };\n\n // subscribe is called in an effect. (We should actually subscribe during the\n // initial render.) Because it's called in an effect, we might have missed some\n // changes since the initial render! So, at this point, we re-read and call the\n // subscription (i.e. re-render) if the fragment data has changed.\n callSubscriptionIfDataChanged(environment, fragmentSubscription);\n\n environment.subscriptions.add(fragmentSubscription);\n return () => environment.subscriptions.delete(fragmentSubscription);\n}\n\n// Calls to readButDoNotEvaluate can suspend (i.e. throw a promise).\n// Maybe in the future, they will be able to throw errors.\n//\n// That's probably okay to ignore. We don't, however, want to prevent\n// updating other subscriptions if one subscription had missing data.\nfunction logAnyError(\n environment: IsographEnvironment,\n context: any,\n f: () => void,\n) {\n try {\n f();\n } catch (e) {\n logMessage(environment, () => ({\n kind: 'ErrorEncounteredInWithErrorHandling',\n error: e,\n context,\n }));\n }\n}\n\nexport function callSubscriptions(\n environment: IsographEnvironment,\n recordsEncounteredWhenNormalizing: EncounteredIds,\n) {\n environment.subscriptions.forEach((subscription) =>\n logAnyError(environment, { situation: 'calling subscriptions' }, () => {\n switch (subscription.kind) {\n case 'FragmentSubscription': {\n // TODO if there are multiple components subscribed to the same\n // fragment, we will call readButNotEvaluate multiple times. We\n // should fix that.\n if (\n hasOverlappingIds(\n recordsEncounteredWhenNormalizing,\n subscription.encounteredDataAndRecords.encounteredRecords,\n )\n ) {\n callSubscriptionIfDataChanged(environment, subscription);\n }\n return;\n }\n case 'AnyRecords': {\n logAnyError(\n environment,\n { situation: 'calling AnyRecords callback' },\n () => subscription.callback(),\n );\n return;\n }\n case 'AnyChangesToRecord': {\n if (\n recordsEncounteredWhenNormalizing\n .get(subscription.recordLink.__typename)\n ?.has(subscription.recordLink.__link) != null\n ) {\n logAnyError(\n environment,\n { situation: 'calling AnyChangesToRecord callback' },\n () => subscription.callback(),\n );\n }\n return;\n }\n }\n }),\n );\n}\n\nfunction callSubscriptionIfDataChanged<\n TReadFromStore extends UnknownTReadFromStore,\n>(\n environment: IsographEnvironment,\n subscription: FragmentSubscription<TReadFromStore>,\n) {\n const newEncounteredDataAndRecords = readButDoNotEvaluate(\n environment,\n subscription.fragmentReference,\n // Is this wrong?\n // Reasons to think no:\n // - we are only updating the read-out value, and the network\n // options only affect whether we throw.\n // - the component will re-render, and re-throw on its own, anyway.\n //\n // Reasons to think not:\n // - it seems more efficient to suspend here and not update state,\n // if we expect that the component will just throw anyway\n // - consistency\n // - it's also weird, this is called from makeNetworkRequest, where\n // we don't currently pass network request options\n {\n suspendIfInFlight: false,\n throwOnNetworkError: false,\n },\n );\n\n const mergedItem = mergeObjectsUsingReaderAst(\n subscription.readerAst,\n subscription.encounteredDataAndRecords.item,\n newEncounteredDataAndRecords.item,\n );\n\n logMessage(environment, () => ({\n kind: 'DeepEqualityCheck',\n fragmentReference: subscription.fragmentReference,\n old: subscription.encounteredDataAndRecords.item,\n new: newEncounteredDataAndRecords.item,\n deeplyEqual: mergedItem === subscription.encounteredDataAndRecords.item,\n }));\n\n if (mergedItem !== subscription.encounteredDataAndRecords.item) {\n logAnyError(\n environment,\n { situation: 'calling FragmentSubscription callback' },\n () => {\n subscription.callback(newEncounteredDataAndRecords);\n },\n );\n subscription.encounteredDataAndRecords = newEncounteredDataAndRecords;\n }\n}\n\nfunction hasOverlappingIds(\n ids1: EncounteredIds,\n ids2: EncounteredIds,\n): boolean {\n for (const [typeName, set1] of ids1.entries()) {\n const set2 = ids2.get(typeName);\n if (set2 === undefined) {\n continue;\n }\n\n if (isNotDisjointFrom(set1, set2)) {\n return true;\n }\n }\n return false;\n}\n\n// TODO use a polyfill library\nfunction isNotDisjointFrom<T>(set1: Set<T>, set2: Set<T>): boolean {\n for (const id of set1) {\n if (set2.has(id)) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":";;;;;AAcA,SAAgB,UACd,aACA,2BACA,mBACA,UAGA,WACY;CACZ,MAAMA,uBAA6D;EACjE,MAAM;EACN;EACA;EACA;EACA;EACD;AAMD,+BAA8B,aAAa,qBAAqB;AAEhE,aAAY,cAAc,IAAI,qBAAqB;AACnD,cAAa,YAAY,cAAc,OAAO,qBAAqB;;AAQrE,SAAS,YACP,aACA,SACA,GACA;AACA,KAAI;AACF,KAAG;UACI,GAAG;AACV,aAAW,oBAAoB;GAC7B,MAAM;GACN,OAAO;GACP;GACD,EAAE;;;AAIP,SAAgB,kBACd,aACA,mCACA;AACA,aAAY,cAAc,SAAS,iBACjC,YAAY,aAAa,EAAE,WAAW,yBAAyB,QAAQ;AACrE,UAAQ,aAAa,MAArB;GACE,KAAK;AAIH,QACE,kBACE,mCACA,aAAa,0BAA0B,mBACxC,CAED,+BAA8B,aAAa,aAAa;AAE1D;GAEF,KAAK;AACH,gBACE,aACA,EAAE,WAAW,+BAA+B,QACtC,aAAa,UAAU,CAC9B;AACD;GAEF,KAAK;AACH,QACE,kCACG,IAAI,aAAa,WAAW,WAAW,EACtC,IAAI,aAAa,WAAW,OAAO,IAAI,KAE3C,aACE,aACA,EAAE,WAAW,uCAAuC,QAC9C,aAAa,UAAU,CAC9B;AAEH;;GAGJ,CACH;;AAGH,SAAS,8BAGP,aACA,cACA;CACA,MAAM,+BAA+B,qBACnC,aACA,aAAa,mBAab;EACE,mBAAmB;EACnB,qBAAqB;EACtB,CACF;CAED,MAAM,aAAa,2BACjB,aAAa,WACb,aAAa,0BAA0B,MACvC,6BAA6B,KAC9B;AAED,YAAW,oBAAoB;EAC7B,MAAM;EACN,mBAAmB,aAAa;EAChC,KAAK,aAAa,0BAA0B;EAC5C,KAAK,6BAA6B;EAClC,aAAa,eAAe,aAAa,0BAA0B;EACpE,EAAE;AAEH,KAAI,eAAe,aAAa,0BAA0B,MAAM;AAC9D,cACE,aACA,EAAE,WAAW,yCAAyC,QAChD;AACJ,gBAAa,SAAS,6BAA6B;IAEtD;AACD,eAAa,4BAA4B;;;AAI7C,SAAS,kBACP,MACA,MACS;AACT,MAAK,MAAM,CAAC,UAAU,SAAS,KAAK,SAAS,EAAE;EAC7C,MAAM,OAAO,KAAK,IAAI,SAAS;AAC/B,MAAI,SAAS,OACX;AAGF,MAAI,kBAAkB,MAAM,KAAK,CAC/B,QAAO;;AAGX,QAAO;;AAIT,SAAS,kBAAqB,MAAc,MAAuB;AACjE,MAAK,MAAM,MAAM,KACf,KAAI,KAAK,IAAI,GAAG,CACd,QAAO;AAGX,QAAO"}
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+
3
+ //#region src/core/util.d.ts
4
+ type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends ((arg1: any, arg2: infer P) => any) ? P : never;
5
+ type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? React.JSX.IntrinsicAttributes : T & React.JSX.IntrinsicAttributes;
6
+ type Arguments = Argument[];
7
+ type Argument = [ArgumentName, ArgumentValue];
8
+ type ArgumentName = string;
9
+ type ArgumentValue = {
10
+ readonly kind: 'Variable';
11
+ readonly name: string;
12
+ } | {
13
+ readonly kind: 'Literal';
14
+ readonly value: any;
15
+ } | {
16
+ readonly kind: 'String';
17
+ readonly value: string;
18
+ } | {
19
+ readonly kind: 'Enum';
20
+ readonly value: string;
21
+ } | {
22
+ readonly kind: 'Object';
23
+ readonly value: Arguments;
24
+ };
25
+ //#endregion
26
+ export { Argument, ArgumentName, ArgumentValue, Arguments, CombineWithIntrinsicAttributes, ExtractSecondParam };
27
+ //# sourceMappingURL=util.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.mts","names":[],"sources":["../../src/core/util.ts"],"sourcesContent":[],"mappings":";;;KAEY,8DACV,gDAA8C;KACpC,oCACV,UAAU,OAAO,sBACb,KAAA,CAAM,GAAA,CAAI,sBACV,IAAI,KAAA,CAAM,GAAA,CAAI;AALR,KAOA,SAAA,GAAY,QAPM,EAAA;AAElB,KAMA,QAAA,GANA,CAMY,YANZ,EAM0B,aANI,CAAA;AACxC,KAMU,YAAA,GANV,MAAA;AAAiB,KAOP,aAAA,GAPO;EAAP,SAAA,IAAA,EAAA,UAAA;EACN,SAAU,IAAA,EAAA,MAAA;CACV,GAAA;EAAI,SAAU,IAAA,EAAA,SAAA;EAAmB,SAAA,KAAA,EAAA,GAAA;AAEvC,CAAA,GAAY;EACA,SAAA,IAAQ,EAAA,QAAA;EACR,SAAA,KAAA,EAAY,MAAA;AACxB,CAAA,GAAY;;;;;kBAmBU"}
@@ -1,30 +1,27 @@
1
- import type React from 'react';
2
- export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
3
- export type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? React.JSX.IntrinsicAttributes : T & React.JSX.IntrinsicAttributes;
4
- export type Arguments = Argument[];
5
- export type Argument = [ArgumentName, ArgumentValue];
6
- export type ArgumentName = string;
7
- export type ArgumentValue = {
8
- readonly kind: 'Variable';
9
- readonly name: string;
1
+ import React from "react";
2
+
3
+ //#region src/core/util.d.ts
4
+ type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends ((arg1: any, arg2: infer P) => any) ? P : never;
5
+ type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? React.JSX.IntrinsicAttributes : T & React.JSX.IntrinsicAttributes;
6
+ type Arguments = Argument[];
7
+ type Argument = [ArgumentName, ArgumentValue];
8
+ type ArgumentName = string;
9
+ type ArgumentValue = {
10
+ readonly kind: 'Variable';
11
+ readonly name: string;
10
12
  } | {
11
- readonly kind: 'Literal';
12
- readonly value: any;
13
+ readonly kind: 'Literal';
14
+ readonly value: any;
13
15
  } | {
14
- readonly kind: 'String';
15
- readonly value: string;
16
+ readonly kind: 'String';
17
+ readonly value: string;
16
18
  } | {
17
- readonly kind: 'Enum';
18
- readonly value: string;
19
+ readonly kind: 'Enum';
20
+ readonly value: string;
19
21
  } | {
20
- readonly kind: 'Object';
21
- readonly value: Arguments;
22
+ readonly kind: 'Object';
23
+ readonly value: Arguments;
22
24
  };
23
- export declare function isArray(value: unknown): value is readonly unknown[];
24
- /**
25
- * Creates a copy of the provided value, ensuring any nested objects have their
26
- * keys sorted such that equivalent values would have identical JSON.stringify
27
- * results.
28
- */
29
- export declare function stableCopy<T>(value: T): T;
25
+ //#endregion
26
+ export { Argument, ArgumentName, ArgumentValue, Arguments, CombineWithIntrinsicAttributes, ExtractSecondParam };
30
27
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/core/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,GAAG,IACpE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAC1C,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAChC,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAC7B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;AACnC,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAClC,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACrB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEN,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,OAAO,EAAE,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAezC"}
1
+ {"version":3,"file":"util.d.ts","names":[],"sources":["../../src/core/util.ts"],"sourcesContent":[],"mappings":";;;KAEY,8DACV,gDAA8C;KACpC,oCACV,UAAU,OAAO,sBACb,KAAA,CAAM,GAAA,CAAI,sBACV,IAAI,KAAA,CAAM,GAAA,CAAI;AALR,KAOA,SAAA,GAAY,QAPM,EAAA;AAElB,KAMA,QAAA,GANA,CAMY,YANZ,EAM0B,aANI,CAAA;AACxC,KAMU,YAAA,GANV,MAAA;AAAiB,KAOP,aAAA,GAPO;EAAP,SAAA,IAAA,EAAA,UAAA;EACN,SAAU,IAAA,EAAA,MAAA;CACV,GAAA;EAAI,SAAU,IAAA,EAAA,SAAA;EAAmB,SAAA,KAAA,EAAA,GAAA;AAEvC,CAAA,GAAY;EACA,SAAA,IAAQ,EAAA,QAAA;EACR,SAAA,KAAA,EAAY,MAAA;AACxB,CAAA,GAAY;;;;;kBAmBU"}
package/dist/core/util.js CHANGED
@@ -1,28 +1,22 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isArray = isArray;
4
- exports.stableCopy = stableCopy;
1
+
2
+ //#region src/core/util.ts
5
3
  function isArray(value) {
6
- return Array.isArray(value);
4
+ return Array.isArray(value);
7
5
  }
8
6
  /**
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
- */
7
+ * Creates a copy of the provided value, ensuring any nested objects have their
8
+ * keys sorted such that equivalent values would have identical JSON.stringify
9
+ * results.
10
+ */
13
11
  function stableCopy(value) {
14
- if (value == null || typeof value !== 'object') {
15
- return value;
16
- }
17
- if (isArray(value)) {
18
- // @ts-ignore
19
- return value.map(stableCopy);
20
- }
21
- const keys = Object.keys(value).sort();
22
- const stable = {};
23
- for (let i = 0; i < keys.length; i++) {
24
- // @ts-ignore
25
- stable[keys[i]] = stableCopy(value[keys[i]]);
26
- }
27
- return stable;
12
+ if (value == null || typeof value !== "object") return value;
13
+ if (isArray(value)) return value.map(stableCopy);
14
+ const keys = Object.keys(value).sort();
15
+ const stable = {};
16
+ for (let i = 0; i < keys.length; i++) stable[keys[i]] = stableCopy(value[keys[i]]);
17
+ return stable;
28
18
  }
19
+
20
+ //#endregion
21
+ exports.isArray = isArray;
22
+ exports.stableCopy = stableCopy;
@@ -0,0 +1,21 @@
1
+ //#region src/core/util.ts
2
+ function isArray(value) {
3
+ return Array.isArray(value);
4
+ }
5
+ /**
6
+ * Creates a copy of the provided value, ensuring any nested objects have their
7
+ * keys sorted such that equivalent values would have identical JSON.stringify
8
+ * results.
9
+ */
10
+ function stableCopy(value) {
11
+ if (value == null || typeof value !== "object") return value;
12
+ if (isArray(value)) return value.map(stableCopy);
13
+ const keys = Object.keys(value).sort();
14
+ const stable = {};
15
+ for (let i = 0; i < keys.length; i++) stable[keys[i]] = stableCopy(value[keys[i]]);
16
+ return stable;
17
+ }
18
+
19
+ //#endregion
20
+ export { isArray, stableCopy };
21
+ //# sourceMappingURL=util.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.mjs","names":["stable: { [index: string]: any }"],"sources":["../../src/core/util.ts"],"sourcesContent":["import type React from 'react';\n\nexport type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =\n T extends (arg1: any, arg2: infer P) => any ? P : never;\nexport type CombineWithIntrinsicAttributes<T> =\n T extends Record<PropertyKey, never>\n ? React.JSX.IntrinsicAttributes\n : T & React.JSX.IntrinsicAttributes;\n\nexport type Arguments = Argument[];\nexport type Argument = [ArgumentName, ArgumentValue];\nexport type ArgumentName = string;\nexport type ArgumentValue =\n | {\n readonly kind: 'Variable';\n readonly name: string;\n }\n | {\n readonly kind: 'Literal';\n readonly value: any;\n }\n | {\n readonly kind: 'String';\n readonly value: string;\n }\n | {\n readonly kind: 'Enum';\n readonly value: string;\n }\n | {\n readonly kind: 'Object';\n readonly value: Arguments;\n };\n\nexport function isArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * Creates a copy of the provided value, ensuring any nested objects have their\n * keys sorted such that equivalent values would have identical JSON.stringify\n * results.\n */\nexport function stableCopy<T>(value: T): T {\n if (value == null || typeof value !== 'object') {\n return value;\n }\n if (isArray(value)) {\n // @ts-ignore\n return value.map(stableCopy);\n }\n const keys = Object.keys(value).sort();\n const stable: { [index: string]: any } = {};\n for (let i = 0; i < keys.length; i++) {\n // @ts-ignore\n stable[keys[i]] = stableCopy(value[keys[i]]);\n }\n return stable as any;\n}\n"],"mappings":";AAkCA,SAAgB,QAAQ,OAA6C;AACnE,QAAO,MAAM,QAAQ,MAAM;;;;;;;AAQ7B,SAAgB,WAAc,OAAa;AACzC,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AAET,KAAI,QAAQ,MAAM,CAEhB,QAAO,MAAM,IAAI,WAAW;CAE9B,MAAM,OAAO,OAAO,KAAK,MAAM,CAAC,MAAM;CACtC,MAAMA,SAAmC,EAAE;AAC3C,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAE/B,QAAO,KAAK,MAAM,WAAW,MAAM,KAAK,IAAI;AAE9C,QAAO"}
@@ -0,0 +1,11 @@
1
+ import { IsographEnvironment } from "./IsographEnvironment.mjs";
2
+ import { ExtractParameters, FragmentReference, UnknownTReadFromStore } from "./FragmentReference.mjs";
3
+ import { NetworkResponseObject } from "./cache.mjs";
4
+ import { IsographEntrypoint, NormalizationAst } from "./entrypoint.mjs";
5
+ import { ItemCleanupPair } from "@isograph/isograph-disposable-types/dist";
6
+
7
+ //#region src/core/writeData.d.ts
8
+ declare function writeData<TReadFromStore extends UnknownTReadFromStore, TRawResponseType extends NetworkResponseObject, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, NormalizationAst, TRawResponseType>, data: TRawResponseType, variables: ExtractParameters<TReadFromStore>): ItemCleanupPair<FragmentReference<TReadFromStore, TClientFieldValue>>;
9
+ //#endregion
10
+ export { writeData };
11
+ //# sourceMappingURL=writeData.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeData.d.mts","names":[],"sources":["../../src/core/writeData.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAsBgB,iCACS,gDACE,uDAGZ,iCACD,mBACV,gBACA,mBACA,kBACA,yBAEI,6BACK,kBAAkB,kBAC5B,gBAAgB,kBAAkB,gBAAgB"}
@@ -1,7 +1,11 @@
1
- import type { ItemCleanupPair } from '@isograph/isograph-disposable-types/dist';
2
- import { type NetworkResponseObject } from './cache';
3
- import type { IsographEntrypoint, NormalizationAst } from './entrypoint';
4
- import type { UnknownTReadFromStore, ExtractParameters, FragmentReference } from './FragmentReference';
5
- import { type IsographEnvironment } from './IsographEnvironment';
6
- export declare function writeData<TReadFromStore extends UnknownTReadFromStore, TRawResponseType extends NetworkResponseObject, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, NormalizationAst, TRawResponseType>, data: TRawResponseType, variables: ExtractParameters<TReadFromStore>): ItemCleanupPair<FragmentReference<TReadFromStore, TClientFieldValue>>;
1
+ import { IsographEnvironment } from "./IsographEnvironment.js";
2
+ import { ExtractParameters, FragmentReference, UnknownTReadFromStore } from "./FragmentReference.js";
3
+ import { NetworkResponseObject } from "./cache.js";
4
+ import { IsographEntrypoint, NormalizationAst } from "./entrypoint.js";
5
+ import { ItemCleanupPair } from "@isograph/isograph-disposable-types/dist";
6
+
7
+ //#region src/core/writeData.d.ts
8
+ declare function writeData<TReadFromStore extends UnknownTReadFromStore, TRawResponseType extends NetworkResponseObject, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, NormalizationAst, TRawResponseType>, data: TRawResponseType, variables: ExtractParameters<TReadFromStore>): ItemCleanupPair<FragmentReference<TReadFromStore, TClientFieldValue>>;
9
+ //#endregion
10
+ export { writeData };
7
11
  //# sourceMappingURL=writeData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeData.d.ts","sourceRoot":"","sources":["../../src/core/writeData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAEhF,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,SAAS,CACvB,cAAc,SAAS,qBAAqB,EAC5C,gBAAgB,SAAS,qBAAqB,EAC9C,iBAAiB,EAEjB,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,kBAAkB,CAC5B,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,CACjB,EACD,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC3C,eAAe,CAAC,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,CA0CvE"}
1
+ {"version":3,"file":"writeData.d.ts","names":[],"sources":["../../src/core/writeData.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAsBgB,iCACS,gDACE,uDAGZ,iCACD,mBACV,gBACA,mBACA,kBACA,yBAEI,6BACK,kBAAkB,kBAC5B,gBAAgB,kBAAkB,gBAAgB"}