@khanacademy/wonder-blocks-data 10.0.5 → 10.1.1

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 (181) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/components/data.d.ts +52 -0
  3. package/dist/components/data.js.flow +63 -0
  4. package/dist/components/gql-router.d.ts +24 -0
  5. package/dist/components/gql-router.js.flow +33 -0
  6. package/dist/components/intercept-context.d.ts +10 -0
  7. package/dist/components/intercept-context.js.flow +19 -0
  8. package/dist/components/intercept-requests.d.ts +42 -0
  9. package/dist/components/intercept-requests.js.flow +51 -0
  10. package/dist/components/track-data.d.ts +11 -0
  11. package/dist/components/track-data.js.flow +18 -0
  12. package/dist/es/index.js +196 -214
  13. package/dist/hooks/use-cached-effect.d.ts +70 -0
  14. package/dist/hooks/use-cached-effect.js.flow +85 -0
  15. package/dist/hooks/use-gql-router-context.d.ts +5 -0
  16. package/dist/hooks/use-gql-router-context.js.flow +15 -0
  17. package/dist/hooks/use-gql.d.ts +12 -0
  18. package/dist/hooks/use-gql.js.flow +29 -0
  19. package/dist/hooks/use-hydratable-effect.d.ts +102 -0
  20. package/dist/hooks/use-hydratable-effect.js.flow +125 -0
  21. package/dist/hooks/use-request-interception.d.ts +14 -0
  22. package/dist/hooks/use-request-interception.js.flow +25 -0
  23. package/dist/hooks/use-server-effect.d.ts +39 -0
  24. package/dist/hooks/use-server-effect.js.flow +51 -0
  25. package/dist/hooks/use-shared-cache.d.ts +32 -0
  26. package/dist/hooks/use-shared-cache.js.flow +43 -0
  27. package/dist/index.d.ts +24 -0
  28. package/dist/index.js +198 -219
  29. package/dist/index.js.flow +48 -2
  30. package/dist/util/data-error.d.ts +45 -0
  31. package/dist/util/data-error.js.flow +64 -0
  32. package/dist/util/get-gql-data-from-response.d.ts +4 -0
  33. package/dist/util/get-gql-data-from-response.js.flow +13 -0
  34. package/dist/util/get-gql-request-id.d.ts +5 -0
  35. package/dist/util/get-gql-request-id.js.flow +20 -0
  36. package/dist/util/gql-error.d.ts +28 -0
  37. package/dist/util/gql-error.js.flow +43 -0
  38. package/dist/util/gql-router-context.d.ts +3 -0
  39. package/dist/util/gql-router-context.js.flow +10 -0
  40. package/dist/util/gql-types.d.ts +34 -0
  41. package/dist/util/gql-types.js.flow +53 -0
  42. package/dist/util/graphql-document-node-parser.d.ts +18 -0
  43. package/dist/util/graphql-document-node-parser.js.flow +31 -0
  44. package/dist/util/graphql-types.d.ts +19 -0
  45. package/dist/util/graphql-types.js.flow +30 -0
  46. package/dist/util/hydration-cache-api.d.ts +17 -0
  47. package/dist/util/hydration-cache-api.js.flow +30 -0
  48. package/dist/util/merge-gql-context.d.ts +8 -0
  49. package/dist/util/merge-gql-context.js.flow +19 -0
  50. package/dist/util/purge-caches.d.ts +8 -0
  51. package/dist/util/purge-caches.js.flow +15 -0
  52. package/dist/util/request-api.d.ts +28 -0
  53. package/dist/util/request-api.js.flow +34 -0
  54. package/dist/util/request-fulfillment.d.ts +37 -0
  55. package/dist/util/request-fulfillment.js.flow +50 -0
  56. package/dist/util/request-tracking.d.ts +62 -0
  57. package/dist/util/request-tracking.js.flow +81 -0
  58. package/dist/util/result-from-cache-response.d.ts +5 -0
  59. package/dist/util/result-from-cache-response.js.flow +15 -0
  60. package/dist/util/scoped-in-memory-cache.d.ts +38 -0
  61. package/dist/util/scoped-in-memory-cache.js.flow +57 -0
  62. package/dist/util/serializable-in-memory-cache.d.ts +16 -0
  63. package/dist/util/serializable-in-memory-cache.js.flow +26 -0
  64. package/dist/util/ssr-cache.d.ts +51 -0
  65. package/dist/util/ssr-cache.js.flow +87 -0
  66. package/dist/util/status.d.ts +10 -0
  67. package/dist/util/status.js.flow +19 -0
  68. package/dist/util/to-gql-operation.d.ts +32 -0
  69. package/dist/util/to-gql-operation.js.flow +45 -0
  70. package/dist/util/types.d.ts +111 -0
  71. package/dist/util/types.js.flow +151 -0
  72. package/package.json +5 -6
  73. package/src/components/__tests__/{data.test.js → data.test.tsx} +50 -16
  74. package/src/components/__tests__/{gql-router.test.js → gql-router.test.tsx} +6 -7
  75. package/src/components/__tests__/{intercept-requests.test.js → intercept-requests.test.tsx} +4 -5
  76. package/src/components/__tests__/{track-data.test.js → track-data.test.tsx} +4 -5
  77. package/src/components/{data.js → data.ts} +13 -21
  78. package/src/components/{gql-router.js → gql-router.tsx} +14 -16
  79. package/src/components/{intercept-context.js → intercept-context.ts} +5 -4
  80. package/src/components/{intercept-requests.js → intercept-requests.tsx} +9 -10
  81. package/src/components/{track-data.js → track-data.tsx} +5 -6
  82. package/src/hooks/__tests__/{use-cached-effect.test.js → use-cached-effect.test.tsx} +65 -63
  83. package/src/hooks/__tests__/{use-gql-router-context.test.js → use-gql-router-context.test.tsx} +9 -9
  84. package/src/hooks/__tests__/{use-gql.test.js → use-gql.test.tsx} +23 -24
  85. package/src/hooks/__tests__/{use-hydratable-effect.test.js → use-hydratable-effect.test.ts} +52 -54
  86. package/src/hooks/__tests__/{use-request-interception.test.js → use-request-interception.test.tsx} +7 -5
  87. package/src/hooks/__tests__/{use-server-effect.test.js → use-server-effect.test.ts} +16 -10
  88. package/src/hooks/__tests__/{use-shared-cache.test.js → use-shared-cache.test.ts} +13 -13
  89. package/src/hooks/{use-cached-effect.js → use-cached-effect.ts} +34 -31
  90. package/src/hooks/{use-gql-router-context.js → use-gql-router-context.ts} +6 -7
  91. package/src/hooks/{use-gql.js → use-gql.ts} +9 -9
  92. package/src/hooks/{use-hydratable-effect.js → use-hydratable-effect.ts} +60 -67
  93. package/src/hooks/{use-request-interception.js → use-request-interception.ts} +6 -6
  94. package/src/hooks/{use-server-effect.js → use-server-effect.ts} +12 -14
  95. package/src/hooks/{use-shared-cache.js → use-shared-cache.ts} +16 -11
  96. package/src/index.ts +46 -0
  97. package/src/util/__tests__/{get-gql-data-from-response.test.js → get-gql-data-from-response.test.ts} +1 -2
  98. package/src/util/__tests__/{get-gql-request-id.test.js → get-gql-request-id.test.ts} +10 -12
  99. package/src/util/__tests__/{graphql-document-node-parser.test.js → graphql-document-node-parser.test.ts} +12 -13
  100. package/src/util/__tests__/{hydration-cache-api.test.js → hydration-cache-api.test.ts} +3 -4
  101. package/src/util/__tests__/{merge-gql-context.test.js → merge-gql-context.test.ts} +5 -6
  102. package/src/util/__tests__/{purge-caches.test.js → purge-caches.test.ts} +3 -4
  103. package/src/util/__tests__/{request-api.test.js → request-api.test.ts} +5 -5
  104. package/src/util/__tests__/{request-fulfillment.test.js → request-fulfillment.test.ts} +2 -3
  105. package/src/util/__tests__/{request-tracking.test.js → request-tracking.test.tsx} +15 -8
  106. package/src/util/__tests__/{result-from-cache-response.test.js → result-from-cache-response.test.ts} +3 -5
  107. package/src/util/__tests__/{scoped-in-memory-cache.test.js → scoped-in-memory-cache.test.ts} +5 -6
  108. package/src/util/__tests__/{serializable-in-memory-cache.test.js → serializable-in-memory-cache.test.ts} +8 -8
  109. package/src/util/__tests__/{ssr-cache.test.js → ssr-cache.test.ts} +5 -4
  110. package/src/util/__tests__/{to-gql-operation.test.js → to-gql-operation.test.ts} +5 -4
  111. package/src/util/{data-error.js → data-error.ts} +3 -4
  112. package/src/util/{get-gql-data-from-response.js → get-gql-data-from-response.ts} +3 -8
  113. package/src/util/{get-gql-request-id.js → get-gql-request-id.ts} +13 -17
  114. package/src/util/{gql-error.js → gql-error.ts} +3 -4
  115. package/src/util/gql-router-context.ts +6 -0
  116. package/src/util/{gql-types.js → gql-types.ts} +27 -23
  117. package/src/util/{graphql-document-node-parser.js → graphql-document-node-parser.ts} +8 -9
  118. package/src/util/graphql-types.ts +27 -0
  119. package/src/util/{hydration-cache-api.js → hydration-cache-api.ts} +6 -4
  120. package/src/util/{merge-gql-context.js → merge-gql-context.ts} +3 -3
  121. package/src/util/{purge-caches.js → purge-caches.ts} +2 -3
  122. package/src/util/{request-api.js → request-api.ts} +4 -5
  123. package/src/util/{request-fulfillment.js → request-fulfillment.ts} +15 -14
  124. package/src/util/{request-tracking.js → request-tracking.ts} +15 -16
  125. package/src/util/{result-from-cache-response.js → result-from-cache-response.ts} +6 -7
  126. package/src/util/{scoped-in-memory-cache.js → scoped-in-memory-cache.ts} +3 -4
  127. package/src/util/{serializable-in-memory-cache.js → serializable-in-memory-cache.ts} +5 -6
  128. package/src/util/{ssr-cache.js → ssr-cache.ts} +21 -20
  129. package/src/util/{status.js → status.ts} +5 -6
  130. package/src/util/{to-gql-operation.js → to-gql-operation.ts} +4 -5
  131. package/src/util/{types.js → types.ts} +41 -49
  132. package/tsconfig.json +11 -0
  133. package/tsconfig.tsbuildinfo +1 -0
  134. package/src/__docs__/_overview_.stories.mdx +0 -18
  135. package/src/__docs__/_overview_graphql.stories.mdx +0 -35
  136. package/src/__docs__/_overview_ssr_.stories.mdx +0 -185
  137. package/src/__docs__/_overview_testing_.stories.mdx +0 -123
  138. package/src/__docs__/exports.abort-inflight-requests.stories.mdx +0 -20
  139. package/src/__docs__/exports.data-error.stories.mdx +0 -23
  140. package/src/__docs__/exports.data-errors.stories.mdx +0 -23
  141. package/src/__docs__/exports.data.stories.mdx +0 -146
  142. package/src/__docs__/exports.fetch-tracked-requests.stories.mdx +0 -24
  143. package/src/__docs__/exports.get-gql-request-id.stories.mdx +0 -24
  144. package/src/__docs__/exports.gql-error.stories.mdx +0 -23
  145. package/src/__docs__/exports.gql-errors.stories.mdx +0 -20
  146. package/src/__docs__/exports.gql-router.stories.mdx +0 -29
  147. package/src/__docs__/exports.has-tracked-requests-to-be-fetched.stories.mdx +0 -20
  148. package/src/__docs__/exports.intercept-requests.stories.mdx +0 -69
  149. package/src/__docs__/exports.intialize-hydration-cache.stories.mdx +0 -29
  150. package/src/__docs__/exports.purge-caches.stories.mdx +0 -23
  151. package/src/__docs__/exports.purge-hydration-cache.stories.mdx +0 -24
  152. package/src/__docs__/exports.scoped-in-memory-cache.stories.mdx +0 -92
  153. package/src/__docs__/exports.serializable-in-memory-cache.stories.mdx +0 -112
  154. package/src/__docs__/exports.shared-cache.stories.mdx +0 -16
  155. package/src/__docs__/exports.status.stories.mdx +0 -31
  156. package/src/__docs__/exports.track-data.stories.mdx +0 -209
  157. package/src/__docs__/exports.use-cached-effect.stories.mdx +0 -44
  158. package/src/__docs__/exports.use-gql.stories.mdx +0 -41
  159. package/src/__docs__/exports.use-hydratable-effect.stories.mdx +0 -43
  160. package/src/__docs__/exports.use-server-effect.stories.mdx +0 -50
  161. package/src/__docs__/exports.use-shared-cache.stories.mdx +0 -30
  162. package/src/__docs__/exports.when-client-side.stories.mdx +0 -33
  163. package/src/__docs__/types.cached-response.stories.mdx +0 -29
  164. package/src/__docs__/types.error-options.stories.mdx +0 -21
  165. package/src/__docs__/types.fetch-policy.stories.mdx +0 -44
  166. package/src/__docs__/types.gql-context.stories.mdx +0 -20
  167. package/src/__docs__/types.gql-fetch-fn.stories.mdx +0 -24
  168. package/src/__docs__/types.gql-fetch-options.stories.mdx +0 -24
  169. package/src/__docs__/types.gql-operation-type.stories.mdx +0 -24
  170. package/src/__docs__/types.gql-operation.stories.mdx +0 -67
  171. package/src/__docs__/types.raw-scoped-cache.stories.mdx +0 -27
  172. package/src/__docs__/types.response-cache.stories.mdx +0 -33
  173. package/src/__docs__/types.result.stories.mdx +0 -39
  174. package/src/__docs__/types.scoped-cache.stories.mdx +0 -114
  175. package/src/__docs__/types.valid-cache-data.stories.mdx +0 -23
  176. package/src/index.js +0 -55
  177. package/src/util/gql-router-context.js +0 -6
  178. package/src/util/graphql-types.js +0 -30
  179. /package/src/hooks/__tests__/__snapshots__/{use-shared-cache.test.js.snap → use-shared-cache.test.ts.snap} +0 -0
  180. /package/src/util/__tests__/__snapshots__/{scoped-in-memory-cache.test.js.snap → scoped-in-memory-cache.test.ts.snap} +0 -0
  181. /package/src/util/__tests__/__snapshots__/{serializable-in-memory-cache.test.js.snap → serializable-in-memory-cache.test.ts.snap} +0 -0
@@ -1,69 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
- import {InterceptRequests} from "../index.js";
3
-
4
- <Meta
5
- title="Data / Exports / InterceptRequests"
6
- component={InterceptRequests}
7
- parameters={{
8
- chromatic: {
9
- disableSnapshot: true,
10
- },
11
- }}
12
- />
13
-
14
- # InterceptRequests
15
-
16
- When you want to generate tests that check the loading state and
17
- subsequent loaded state are working correctly for your uses of `Data` you can
18
- use the `InterceptRequests` component. You can also use this component to
19
- register request interceptors for any code that uses the `useRequestInterception`
20
- hook.
21
-
22
- This component takes the children to be rendered, and an interceptor function.
23
-
24
- Note that this component is expected to be used only within test cases or
25
- stories. Be careful want request IDs are matched to avoid intercepting the
26
- wrong requests and remember that in-flight requests for a given request ID
27
- can be shared - which means a bad request ID match could share requests across
28
- different request IDs..
29
-
30
- The `interceptor` intercept function has the form:
31
-
32
- ```js static
33
- (requestId: string) => ?Promise<TData>;
34
- ```
35
-
36
- If this method returns `null`, then the next interceptor in the chain is
37
- invoked, ultimately ending with the original handler. This
38
- means that a request will be made for data via the handler assigned to the
39
- `Data` component being intercepted if no interceptor handles the request first.
40
-
41
- ```jsx
42
- import {Body, BodyMonospace} from "@khanacademy/wonder-blocks-typography";
43
- import {View} from "@khanacademy/wonder-blocks-core";
44
- import {InterceptRequests, Data} from "@khanacademy/wonder-blocks-data";
45
- import {Strut} from "@khanacademy/wonder-blocks-layout";
46
- import Color from "@khanacademy/wonder-blocks-color";
47
- import Spacing from "@khanacademy/wonder-blocks-spacing";
48
-
49
- const myHandler = () => Promise.reject(new Error("You should not see this!"));
50
-
51
- const interceptor = (requestId) => requestId === "INTERCEPT_EXAMPLE" ? Promise.resolve("INTERCEPTED DATA!") : null;
52
-
53
- <InterceptRequests interceptor={interceptor}>
54
- <View>
55
- <Body>This received intercepted data!</Body>
56
- <Data handler={myHandler} requestId="INTERCEPT_EXAMPLE">
57
- {(result) => {
58
- if (result.status !== "success") {
59
- return "If you see this, the example is broken!";
60
- }
61
-
62
- return (
63
- <BodyMonospace>{result.data}</BodyMonospace>
64
- );
65
- }}
66
- </Data>
67
- </View>
68
- </InterceptRequests>
69
- ```
@@ -1,29 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / initializeHydrationCache()"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # initializeHydrationCache()
13
-
14
- ```ts
15
- initializeHydrationCache(sourceCache: ResponseCache): void;
16
- ```
17
-
18
- | Argument | Flow&nbsp;Type | Default | Description |
19
- | --- | --- | --- | --- |
20
- | `sourceData` | `ResponseCache` | _Required_ | The source cache that will be used to initialize the response cache. |
21
-
22
- Wonder Blocks Data caches data in its response cache for hydration. This cache can be initialized with data using the `initializeHydrationCache` method.
23
- The `initializeHydrationCache` method can only be called when the hydration cache is empty.
24
-
25
- Usually, the data to be passed to `v` will be obtained by calling [`fetchTrackedRequests`](/docs/data-exports-fetchtrackedrequests--page) after tracking data requests (see [`TrackData`](/docs/data-exports-trackdata--page)) during server-side rendering.
26
-
27
- Combine with [`purgeHydrationCache`](/docs/data-exports-purgehydrationcache--page) to support your testing needs.
28
-
29
- More details about server-side rendering with Wonder Blocks Data can be found in the [relevant overview section](/docs/data-server-side-rendering-and-hydration--page).
@@ -1,23 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / purgeCaches()"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # purgeCaches()
13
-
14
- ```ts
15
- purgeCaches(scope?: string): void;
16
- ```
17
-
18
- The `purgeCaches` method will purge the following caches managed by Wonder Blocks Data:
19
-
20
- - Shared in-memory cache as used by [`useSharedCache`](/docs/data-exports-usesharedcache--page) and other hooks
21
- - Hydration cache as used during server-side rendering
22
-
23
- This is equivalent to calling both `SharedCache.purgeAll()` and `purgeHydrationCache()`, and is especially useful when writing tests or setting up a test environment.
@@ -1,24 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / purgeHydrationCache()"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # purgeHydrationCache()
13
-
14
- ```ts
15
- purgeHydrationCache(predicate?: (key: string, cacheEntry: $ReadOnly<CachedResponse<ValidCacheData>>) => boolean): void;
16
- ```
17
-
18
- | Argument | Flow&nbsp;Type | Default | Description |
19
- | --- | --- | --- | --- |
20
- | `predicate` | `(key: string, entry: $ReadOnly<CachedResponse<TData>>) => boolean)` | _Optional_ | A predicate to identify which entries to remove. If absent, all data is removed; if present, any entries for which the predicate returns `true` will be returned. |
21
-
22
- Removes all entries that match a given predicate from the cache. If no predicate is given, all cached entries.
23
-
24
- This can be used after [`initializeHydrationCache`](/docs/data-exports-initializehydrationcache--page) to manipulate the cache prior to hydration wich can be useful during testing (especially to clear the cache so that it can be initialized again).
@@ -1,92 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / ScopedInMemoryCache"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # ScopedInMemoryCache
13
-
14
- This class implements an in-memory cache that can contain different scopes of cached data. This allows for quick removal of entire classes of data as identified by their scopes without having to iterate each cached item to find them. It implements the [`ScopedCache`](/docs/data-types-scopedcache--page) interface.
15
-
16
- ## constructor()
17
-
18
- ```ts
19
- new ScopedInMemoryCache(initialCache?: RawScopedCache)
20
- ```
21
-
22
- Creates a new instance. An initial state for the cache can be provided.
23
-
24
- ## inUse
25
-
26
- ```ts
27
- if (cache.inUse) {
28
- // Cache is in use
29
- }
30
- ```
31
-
32
- Is `true` if the cache contains any data; otherwise, `false`.
33
-
34
- ## set()
35
-
36
- ```ts
37
- set(
38
- scope: string,
39
- id: string,
40
- value: TValue,
41
- ): void;
42
- ```
43
-
44
- Sets a value in the cache within a given scope.
45
-
46
- ### Throws
47
-
48
- | Error Type | Error Name | Reason |
49
- | ------ | ------ | ------ |
50
- | [`DataError`](/docs/data-exports-dataerror--page) | `InvalidInputDataError` | `id` and `scope` must be non-empty strings |
51
- | [`DataError`](/docs/data-exports-dataerror--page) | `InvalidInputDataError` | `value` must be a non-function value |
52
-
53
- ## get()
54
-
55
- ```ts
56
- get(scope: string, id: string): ?ValidCacheData;
57
- ```
58
-
59
- Gets a value from the cache. If a value with the given identifier (`id`) is not found within the given scope (`scope`) of the cache, `null` is returned.
60
-
61
- ## purge()
62
-
63
- ```ts
64
- purge(scope: string, id: string): void;
65
- ```
66
-
67
- Purges the value from the cache. If a value with the given identifier (`id`) is not found within the given scope (`scope`) of the cache, nothing happens.
68
-
69
- ## purgeScope()
70
-
71
- ```ts
72
- purgeScope(
73
- scope: string,
74
- predicate?: (id: string, value: ValidCacheData) => boolean,
75
- ): void;
76
- ```
77
-
78
- Purges items within a given scope (`scope`) of the cache from that scope. If a predicate is provided, only items for which the predicate returns `true` will be purged; otherwise, the entire scope will be purged.
79
-
80
- ## purgeAll()
81
-
82
- ```ts
83
- purgeAll(
84
- predicate?: (
85
- scope: string,
86
- id: string,
87
- value: ValidCacheData,
88
- ) => boolean,
89
- ): void;
90
- ```
91
-
92
- Purges all items from the cache. If a predicate is provided, only items for which the predicate returns `true` will be purged; otherwise, the entire cache will be purged.
@@ -1,112 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / SerializableInMemoryCache"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # SerializableInMemoryCache
13
-
14
- This class is a specialization of [`ScopedInMemoryCache`](/docs/data-exports-scopedinmemorycache--page). This specialization requires that values added can be serialized to and from strings.
15
-
16
- ## constructor()
17
-
18
- ```ts
19
- new SerializableInMemoryCache(initialCache?: RawScopedCache)
20
- ```
21
-
22
- Creates a new instance. The `initialCache`, if provided, will be cloned and used as the initial state of the cache.
23
-
24
- ### Throws
25
-
26
- | Error Type | Error Name | Reason |
27
- | ------ | ------ | ------ |
28
- | [`DataError`](/docs/data-exports-dataerror--page) | `InvalidInputDataError` | Could not clone the initial cache. |
29
-
30
- ## inUse
31
-
32
- ```ts
33
- if (cache.inUse) {
34
- // Cache is in use
35
- }
36
- ```
37
-
38
- Is `true` if the cache contains any data; otherwise, `false`.
39
-
40
- ## set()
41
-
42
- ```ts
43
- set<TValue: ValidCacheData>(
44
- scope: string,
45
- id: string,
46
- value: TValue,
47
- ): void;
48
- ```
49
-
50
- Sets a value in the cache within a given scope. The value is cloned and the clone is frozen before being added to the cache.
51
-
52
- ### Throws
53
-
54
- | Error Type | Error Name | Reason |
55
- | ------ | ------ | ------ |
56
- | [`DataError`](/docs/data-exports-dataerror--page) | `InvalidInputDataError` | `id` and `scope` must be non-empty strings |
57
- | [`DataError`](/docs/data-exports-dataerror--page) | `InvalidInputDataError` | `value` must be a non-function value |
58
-
59
- ## get()
60
-
61
- ```ts
62
- get(scope: string, id: string): ?ValidCacheData;
63
- ```
64
-
65
- Gets a value from the cache. If a value with the given identifier (`id`) is not found within the given scope (`scope`) of the cache, `null` is returned.
66
-
67
- ## clone()
68
-
69
- ```ts
70
- clone(): RawScopedCache;
71
- ```
72
-
73
- Returns a clone of the current cache.
74
-
75
- ### Throws
76
-
77
- | Error Type | Error Name | Reason |
78
- | ------ | ------ | ------ |
79
- | [`DataError`](/docs/data-exports-dataerror--page) | `InternalDataError` | Could not clone the cache. |
80
-
81
- ## purge()
82
-
83
- ```ts
84
- purge(scope: string, id: string): void;
85
- ```
86
-
87
- Purges the value from the cache. If a value with the given identifier (`id`) is not found within the given scope (`scope`) of the cache, nothing happens.
88
-
89
- ## purgeScope()
90
-
91
- ```ts
92
- purgeScope(
93
- scope: string,
94
- predicate?: (id: string, value: ValidCacheData) => boolean,
95
- ): void;
96
- ```
97
-
98
- Purges items within a given scope (`scope`) of the cache from that scope. If a predicate is provided, only items for which the predicate returns `true` will be purged; otherwise, the entire scope will be purged.
99
-
100
- ## purgeAll()
101
-
102
- ```ts
103
- purgeAll(
104
- predicate?: (
105
- scope: string,
106
- id: string,
107
- value: ValidCacheData,
108
- ) => boolean,
109
- ): void;
110
- ```
111
-
112
- Purges all items from the cache. If a predicate is provided, only items for which the predicate returns `true` will be purged; otherwise, the entire cache will be purged.
@@ -1,16 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / SharedCache"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # SharedCache
13
-
14
- The `SharedCache` export can be used to view and modify the in-memory cache used by [`useSharedCache`](/docs/data-exports-usesharedcache--page) hook and the hooks and components that relate to it.
15
-
16
- The `SharedCache` export implements the [`ScopedCache` interface type](/docs/data-types-scopedcache--page).
@@ -1,31 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / Status"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # Status
13
-
14
- Provides a helper API for creating [`Result<TData>`](/docs/data-types-result--page) instances with specific statuses.
15
-
16
-
17
- ## loading()
18
-
19
- `Status.loading()` creates a result with the `"loading"` status.
20
-
21
- ## aborted()
22
-
23
- `Status.aborted()` creates a result with the `"aborted"` status.
24
-
25
- ## success()
26
-
27
- `Status.success()` creates a result with the `"success"` status and the given data.
28
-
29
- ## error()
30
-
31
- `Status.error()` creates a result with the `"error"` status and the given error.
@@ -1,209 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
- import {TrackData} from "../index.js";
3
-
4
- <Meta
5
- title="Data / Exports / TrackData"
6
- component={TrackData}
7
- parameters={{
8
- chromatic: {
9
- disableSnapshot: true,
10
- },
11
- }}
12
- />
13
-
14
- # TrackData
15
-
16
- The `TrackData` component is a server-side only component. It should be used as
17
- a parent to the components whose data requests you want to fulfill during
18
- server-side rendering.
19
-
20
- #### Client-side behavior
21
-
22
- If used outside of server-side mode (as set using `Server.setServerSide`), this
23
- component will throw, as demonstrated below.
24
-
25
- ```jsx
26
- import {Body, BodyMonospace} from "@khanacademy/wonder-blocks-typography";
27
- import {Server, View} from "@khanacademy/wonder-blocks-core";
28
- import {TrackData} from "@khanacademy/wonder-blocks-data";
29
-
30
- class ErrorBoundary extends React.Component {
31
- constructor(props) {
32
- super(props);
33
- this.state = {};
34
- }
35
-
36
- static getDerivedStateFromError(error) {
37
- return {error: error.message};
38
- }
39
-
40
- render() {
41
- if (typeof jest !== "undefined") {
42
- /**
43
- * The snapshot test just sees the error getting thrown, not the
44
- * awesome error boundary, so we have to hack around it to keep
45
- * this live example, but not get test failures.
46
- */
47
- return "Sorry, no snapshot for you";
48
- }
49
-
50
- if (this.state.error) {
51
- return (
52
- <View>
53
- {this.state.error}
54
- </View>
55
- );
56
- }
57
- return this.props.children;
58
- }
59
- }
60
-
61
- <ErrorBoundary>
62
- <View>
63
- <TrackData>
64
- <Body>This only renders if we're in server-side mode and the page hot reloaded</Body>
65
- </TrackData>
66
- </View>
67
- </ErrorBoundary>
68
- ```
69
-
70
- #### Server-side behavior
71
-
72
- When used server-side, this component tracks any data requests made through
73
- the `Data` component during a render cycle. This data can then be obtained
74
- using the `fetchTrackedRequests` method. The data can then be used in an
75
- additional render cycle to render with that data.
76
-
77
- ```jsx
78
- import {Body, BodyMonospace} from "@khanacademy/wonder-blocks-typography";
79
- import {Strut} from "@khanacademy/wonder-blocks-layout";
80
- import Spacing from "@khanacademy/wonder-blocks-spacing";
81
- import Button from "@khanacademy/wonder-blocks-button";
82
- import {Server, View} from "@khanacademy/wonder-blocks-core";
83
- import {Data, TrackData, fetchTrackedRequests} from "@khanacademy/wonder-blocks-data";
84
-
85
- const myPretendHandler = () => new Promise((resolve, reject) =>
86
- setTimeout(() => resolve("DATA!"), 3000),
87
- );
88
-
89
- class Example extends React.Component {
90
- constructor() {
91
- super();
92
- /**
93
- * For this demonstration, we need to hack the return of isServerSide solely
94
- * for the scope of this component.
95
- */
96
- this.state = {};
97
- }
98
-
99
- static getDerivedStateFromError(error) {
100
- return {error};
101
- }
102
-
103
- componentDidMount() {
104
- this._mounted = true;
105
- }
106
-
107
- componentWillUnmount() {
108
- this._mounted = false;
109
- }
110
-
111
- setClientMode() {
112
- window.location.reload();
113
- }
114
-
115
- setServerMode() {
116
- Server.setServerSide();
117
- this.setState({refresh: Date.now(), error: null});
118
- };
119
-
120
- _renderErrorOrContent() {
121
- if (typeof jest !== "undefined") {
122
- /**
123
- * The snapshot test just sees the error getting thrown, not the
124
- * awesome error boundary, so we have to hack around it to keep
125
- * this live example, but not get test failures.
126
- */
127
- return "Sorry, no snapshot for you";
128
- }
129
-
130
- if (this.state.error) {
131
- return (
132
- <React.Fragment>
133
- <Strut size={Spacing.small_12} />
134
- <Body>We can't show you anything useful in client-side mode</Body>
135
- </React.Fragment>
136
- );
137
- }
138
-
139
- const data = this.state.data
140
- ? JSON.stringify(this.state.data, undefined, " ")
141
- : "Data requested...";
142
-
143
- return (
144
- <React.Fragment>
145
- <Strut size={Spacing.small_12} />
146
- <TrackData>
147
- <Data handler={myPretendHandler} requestId="TRACK_DATA_EXAMPLE">
148
- {(result) => (
149
- <View>
150
- <BodyMonospace>{`Loading: ${result.status === "loading"}`}</BodyMonospace>
151
- <BodyMonospace>{`Data: ${JSON.stringify(result.data)}`}</BodyMonospace>
152
- </View>
153
- )}
154
- </Data>
155
- </TrackData>
156
- <Strut size={Spacing.small_12} />
157
- <View>
158
- <Body>
159
- The above components requested data, but we're server-side,
160
- so all that happened is we tracked the request.
161
- In this example, we've also called `fetchTrackedRequests`
162
- to fetch that tracked data.
163
- </Body>
164
- <Strut size={Spacing.small_12} />
165
- <Body>
166
- In about 3 seconds, it will appear below. Notice that
167
- when it does, the above still doesn't update. That's
168
- because during SSR, the data is not updated in the
169
- rendered tree.
170
- </Body>
171
- <Strut size={Spacing.small_12} />
172
- <BodyMonospace>{data}</BodyMonospace>
173
- </View>
174
- </React.Fragment>
175
- );
176
- }
177
-
178
- render() {
179
- try {
180
- return (
181
- <View key={this.state.refresh}>
182
- {Server.isServerSide()
183
- ? (
184
- <React.Fragment>
185
- <Button kind={"secondary"} onClick={() => this.setClientMode()}>Back to Client-side Mode (reloads page)</Button>
186
- <Strut size={Spacing.small_12} />
187
- <Button kind={"secondary"} onClick={() => this.setServerMode()}>Re-mount</Button>
188
- </React.Fragment>
189
- ) : (
190
- <Button kind={"primary"} onClick={() => this.setServerMode()}>Enable Server-side Mode</Button>
191
- )
192
- }
193
- {this._renderErrorOrContent()}
194
- </View>
195
- );
196
- } finally {
197
- if (!this.state.data && Server.isServerSide()) {
198
- setTimeout(() => fetchTrackedRequests().then((data) => {
199
- if (this._mounted) {
200
- this.setState({data});
201
- }
202
- }), 0);
203
- }
204
- }
205
- }
206
- }
207
-
208
- <Example />
209
- ```
@@ -1,44 +0,0 @@
1
- import {Meta} from "@storybook/addon-docs";
2
-
3
- <Meta
4
- title="Data / Exports / useCachedEffect()"
5
- parameters={{
6
- chromatic: {
7
- disableSnapshot: true,
8
- },
9
- }}
10
- />
11
-
12
- # useCachedEffect()
13
-
14
- ```ts
15
- function useCachedEffect<TData: ValidCacheData>(
16
- requestId: string,
17
- handler: () => Promise<TData>,
18
- options?: CachedEffectOptions<TData>,
19
- ): [Result<TData>, () => void];
20
- ```
21
-
22
- This hook invokes the given handler and caches the result using the [`useSharedCache`](/docs/data-exports-usesharedcache--page) hook. The `requestId` is used to both identify inflight requests that can be shared, and to identify the cached value to use.
23
-
24
- The hook returns an array containing the current state of the request, and a function that can be used to `refetch` that request on demand. Calling `refetch` while an inflight request is in progress for the given `requestId` will be a no-op.
25
-
26
- The behavior of the hook can be modified with the options.
27
-
28
- ```ts
29
- type CachedEffectOptions<TData: ValidCacheData> = {|
30
- skip?: boolean,
31
- retainResultOnChange?: boolean,
32
- onResultChanged?: (result: Result<TData>) => void,
33
- scope?: string,
34
- fetchPolicy?: FetchPolicy,
35
- |};
36
- ```
37
-
38
- | Option | Default | Description |
39
- | ------ | ------- | ----------- |
40
- | `skip` | `false` | When `true`, the effect will not be executed; otherwise, the effect will be executed. If this is set to `true` while the effect is still pending, the pending effect will be cancelled. |
41
- | `retainResultOnChange` | `false` | When `true`, the effect will not reset the result to the loading status while executing if the requestId changes, instead, returning the existing result from before the change; otherwise, the result will be set to loading status. If the status is loading when the changes are made, it will remain as loading; old pending effects are discarded on changes and as such this value has no effect in that case.|
42
- | `onResultChanged` | `undefined` | Callback that is invoked if the result for the given hook has changed. When defined, the hook will invoke this callback whenever it has reason to change the result and will not otherwise affect component rendering directly. When not defined, the hook will ensure the component re-renders to pick up the latest result. |
43
- | `scope` | `"useCachedEffect"` | Scope to use with the shared cache. When specified, the given scope will be used to isolate this hook's cached results. Otherwise, the default scope will be used. Changing this value after the first call is not supported. |
44
- | `fetchPolicy` | [`FetchPolicy`](/docs/data-types-fetchpolicy--page) | Fetch policy to use when fetching the data. Defaults to `FetchPolicy.CacheBeforeNetwork`. |