@data-client/core 0.4.3 → 0.8.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.
- package/data_client_logo_and_text.svg +50 -0
- package/dist/index.js +57 -90
- package/dist/index.umd.min.js +1 -1
- package/dist/next.js +0 -454
- package/legacy/actionTypes.js +11 -13
- package/legacy/actions.js +2 -0
- package/legacy/controller/Controller.js +24 -41
- package/legacy/index.js +2 -2
- package/legacy/internal.js +2 -2
- package/legacy/manager/DevtoolsManager.js +3 -3
- package/legacy/manager/NetworkManager.js +11 -11
- package/legacy/manager/SubscriptionManager.js +6 -6
- package/legacy/manager/applyManager.js +2 -9
- package/legacy/middlewareTypes.js +1 -1
- package/legacy/next/index.js +2 -3
- package/legacy/state/reducer/fetchReducer.js +5 -5
- package/legacy/state/reducer/setReducer.js +2 -2
- package/legacy/types.js +3 -4
- package/lib/actionTypes.d.ts +10 -12
- package/lib/actionTypes.d.ts.map +1 -1
- package/lib/actionTypes.js +11 -13
- package/lib/{newActions.d.ts → actions.d.ts} +1 -3
- package/lib/actions.d.ts.map +1 -0
- package/lib/actions.js +2 -0
- package/lib/controller/Controller.d.ts +20 -33
- package/lib/controller/Controller.d.ts.map +1 -1
- package/lib/controller/Controller.js +24 -41
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/internal.d.ts +1 -1
- package/lib/internal.d.ts.map +1 -1
- package/lib/internal.js +2 -2
- package/lib/manager/DevtoolsManager.js +3 -3
- package/lib/manager/NetworkManager.d.ts +6 -6
- package/lib/manager/NetworkManager.d.ts.map +1 -1
- package/lib/manager/NetworkManager.js +11 -11
- package/lib/manager/SubscriptionManager.d.ts +5 -5
- package/lib/manager/SubscriptionManager.js +6 -6
- package/lib/manager/applyManager.d.ts.map +1 -1
- package/lib/manager/applyManager.js +2 -9
- package/lib/middlewareTypes.d.ts +2 -5
- package/lib/middlewareTypes.d.ts.map +1 -1
- package/lib/middlewareTypes.js +1 -1
- package/lib/next/index.d.ts +0 -2
- package/lib/next/index.d.ts.map +1 -1
- package/lib/next/index.js +2 -3
- package/lib/state/reducer/expireReducer.d.ts +1 -1
- package/lib/state/reducer/fetchReducer.js +5 -5
- package/lib/state/reducer/invalidateReducer.d.ts +1 -1
- package/lib/state/reducer/setReducer.d.ts +2 -2
- package/lib/state/reducer/setReducer.d.ts.map +1 -1
- package/lib/state/reducer/setReducer.js +2 -2
- package/lib/types.d.ts +3 -4
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +3 -4
- package/package.json +3 -3
- package/src/actionTypes.ts +10 -12
- package/src/{newActions.ts → actions.ts} +1 -6
- package/src/controller/Controller.ts +23 -54
- package/src/index.ts +1 -1
- package/src/internal.ts +1 -1
- package/src/manager/DevtoolsManager.ts +2 -2
- package/src/manager/NetworkManager.ts +10 -10
- package/src/manager/SubscriptionManager.ts +5 -5
- package/src/manager/__tests__/__snapshots__/pollingSubscription.ts.snap +2 -2
- package/src/manager/__tests__/logoutManager.ts +2 -2
- package/src/manager/__tests__/manager.ts +1 -1
- package/src/manager/__tests__/networkManager.ts +13 -16
- package/src/manager/applyManager.ts +1 -6
- package/src/middlewareTypes.ts +4 -9
- package/src/next/index.ts +0 -2
- package/src/state/__tests__/__snapshots__/reducer.ts.snap +1 -1
- package/src/state/__tests__/reducer.ts +27 -9
- package/src/state/reducer/fetchReducer.ts +5 -5
- package/src/state/reducer/setReducer.ts +5 -5
- package/src/types.ts +3 -4
- package/ts3.4/actionTypes.d.ts +10 -12
- package/ts3.4/{newActions.d.ts → actions.d.ts} +1 -3
- package/ts3.4/controller/Controller.d.ts +20 -39
- package/ts3.4/index.d.ts +1 -1
- package/ts3.4/internal.d.ts +1 -1
- package/ts3.4/manager/NetworkManager.d.ts +6 -6
- package/ts3.4/manager/SubscriptionManager.d.ts +5 -5
- package/ts3.4/middlewareTypes.d.ts +2 -5
- package/ts3.4/next/index.d.ts +0 -2
- package/ts3.4/state/reducer/expireReducer.d.ts +1 -1
- package/ts3.4/state/reducer/invalidateReducer.d.ts +1 -1
- package/ts3.4/state/reducer/setReducer.d.ts +2 -2
- package/ts3.4/types.d.ts +3 -5
- package/legacy/fsa.js +0 -2
- package/legacy/newActions.js +0 -2
- package/lib/fsa.d.ts +0 -41
- package/lib/fsa.d.ts.map +0 -1
- package/lib/fsa.js +0 -2
- package/lib/newActions.d.ts.map +0 -1
- package/lib/newActions.js +0 -2
- package/src/fsa.ts +0 -99
- package/ts3.4/fsa.d.ts +0 -41
package/dist/next.js
CHANGED
|
@@ -1,456 +1,2 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var normalizr = require('@data-client/normalizr');
|
|
6
|
-
|
|
7
|
-
const FETCH_TYPE = 'rest-hooks/fetch';
|
|
8
|
-
/** @deprecated use SET_TYPE instead */
|
|
9
|
-
const RECEIVE_TYPE = 'rest-hooks/receive';
|
|
10
|
-
const SET_TYPE = RECEIVE_TYPE;
|
|
11
|
-
const RESET_TYPE = 'rest-hooks/reset';
|
|
12
|
-
const SUBSCRIBE_TYPE = 'rest-hooks/subscribe';
|
|
13
|
-
const UNSUBSCRIBE_TYPE = 'rest-hook/unsubscribe';
|
|
14
|
-
const INVALIDATE_TYPE = 'rest-hooks/invalidate';
|
|
15
|
-
const INVALIDATEALL_TYPE = 'rest-hooks/invalidateall';
|
|
16
|
-
const EXPIREALL_TYPE = 'rest-hooks/expireall';
|
|
17
|
-
|
|
18
|
-
function createExpireAll(testKey) {
|
|
19
|
-
return {
|
|
20
|
-
type: EXPIREALL_TYPE,
|
|
21
|
-
testKey
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Requesting a fetch to begin
|
|
27
|
-
*/
|
|
28
|
-
function createFetch(endpoint, {
|
|
29
|
-
args
|
|
30
|
-
}) {
|
|
31
|
-
const key = endpoint.key(...args);
|
|
32
|
-
let resolve = 0;
|
|
33
|
-
let reject = 0;
|
|
34
|
-
const promise = new Promise((a, b) => {
|
|
35
|
-
[resolve, reject] = [a, b];
|
|
36
|
-
});
|
|
37
|
-
const meta = {
|
|
38
|
-
args,
|
|
39
|
-
key,
|
|
40
|
-
throttle: !endpoint.sideEffect,
|
|
41
|
-
resolve,
|
|
42
|
-
reject,
|
|
43
|
-
promise,
|
|
44
|
-
createdAt: Date.now(),
|
|
45
|
-
nm: false
|
|
46
|
-
};
|
|
47
|
-
return {
|
|
48
|
-
type: FETCH_TYPE,
|
|
49
|
-
payload: () => endpoint(...args),
|
|
50
|
-
meta,
|
|
51
|
-
endpoint
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function createInvalidate(endpoint, {
|
|
56
|
-
args
|
|
57
|
-
}) {
|
|
58
|
-
return {
|
|
59
|
-
type: INVALIDATE_TYPE,
|
|
60
|
-
meta: {
|
|
61
|
-
key: endpoint.key(...args)
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function createInvalidateAll(testKey) {
|
|
67
|
-
return {
|
|
68
|
-
type: INVALIDATEALL_TYPE,
|
|
69
|
-
testKey
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function createReset() {
|
|
74
|
-
return {
|
|
75
|
-
type: RESET_TYPE,
|
|
76
|
-
date: Date.now()
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const ensurePojo =
|
|
81
|
-
// FormData doesn't exist in node
|
|
82
|
-
/* istanbul ignore else we don't run coverage when we test node*/
|
|
83
|
-
typeof FormData !== 'undefined' ? body => body instanceof FormData ? Object.fromEntries(body.entries()) : body : /* istanbul ignore next */
|
|
84
|
-
body => body;
|
|
85
|
-
var ensurePojo$1 = ensurePojo;
|
|
86
|
-
|
|
87
|
-
function createSet(endpoint, {
|
|
88
|
-
args,
|
|
89
|
-
fetchedAt,
|
|
90
|
-
response,
|
|
91
|
-
error = false
|
|
92
|
-
}) {
|
|
93
|
-
var _endpoint$errorExpiry, _endpoint$dataExpiryL;
|
|
94
|
-
const expiryLength = error ? (_endpoint$errorExpiry = endpoint.errorExpiryLength) != null ? _endpoint$errorExpiry : 1000 : (_endpoint$dataExpiryL = endpoint.dataExpiryLength) != null ? _endpoint$dataExpiryL : 60000;
|
|
95
|
-
/* istanbul ignore next */
|
|
96
|
-
if (process.env.NODE_ENV === 'development' && expiryLength < 0) {
|
|
97
|
-
throw new Error('Negative expiry length are not allowed.');
|
|
98
|
-
}
|
|
99
|
-
const now = Date.now();
|
|
100
|
-
const meta = {
|
|
101
|
-
args: args.map(ensurePojo$1),
|
|
102
|
-
fetchedAt: fetchedAt != null ? fetchedAt : now,
|
|
103
|
-
date: now,
|
|
104
|
-
expiresAt: now + expiryLength,
|
|
105
|
-
key: endpoint.key(...args)
|
|
106
|
-
};
|
|
107
|
-
const action = {
|
|
108
|
-
type: SET_TYPE,
|
|
109
|
-
payload: response,
|
|
110
|
-
endpoint: endpoint,
|
|
111
|
-
meta
|
|
112
|
-
};
|
|
113
|
-
if (error) action.error = true;
|
|
114
|
-
return action;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function createSubscription(endpoint, {
|
|
118
|
-
args
|
|
119
|
-
}) {
|
|
120
|
-
return {
|
|
121
|
-
type: SUBSCRIBE_TYPE,
|
|
122
|
-
endpoint,
|
|
123
|
-
meta: {
|
|
124
|
-
args,
|
|
125
|
-
key: endpoint.key(...args)
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
function createUnsubscription(endpoint, {
|
|
130
|
-
args
|
|
131
|
-
}) {
|
|
132
|
-
return {
|
|
133
|
-
type: UNSUBSCRIBE_TYPE,
|
|
134
|
-
endpoint,
|
|
135
|
-
meta: {
|
|
136
|
-
args,
|
|
137
|
-
key: endpoint.key(...args)
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const initialState = {
|
|
143
|
-
entities: {},
|
|
144
|
-
indexes: {},
|
|
145
|
-
results: {},
|
|
146
|
-
meta: {},
|
|
147
|
-
entityMeta: {},
|
|
148
|
-
optimistic: [],
|
|
149
|
-
lastReset: 0
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
function selectMeta(state, fetchKey) {
|
|
153
|
-
return state.meta[fetchKey];
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const unsetDispatch = action => {
|
|
157
|
-
throw new Error(`Dispatching while constructing your middleware is not allowed. ` + `Other middleware would not be applied to this dispatch.`);
|
|
158
|
-
};
|
|
159
|
-
const unsetState = () => {
|
|
160
|
-
// This is only the value until it is set by the CacheProvider
|
|
161
|
-
/* istanbul ignore next */
|
|
162
|
-
return initialState;
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Imperative control of Rest Hooks store
|
|
167
|
-
* @see https://resthooks.io/docs/api/Controller
|
|
168
|
-
*/
|
|
169
|
-
class Controller {
|
|
170
|
-
/**
|
|
171
|
-
* Dispatches an action to Rest Hooks reducer.
|
|
172
|
-
*
|
|
173
|
-
* @see https://resthooks.io/docs/api/Controller#dispatch
|
|
174
|
-
*/
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Gets the latest state snapshot that is fully committed.
|
|
178
|
-
*
|
|
179
|
-
* This can be useful for imperative use-cases like event handlers.
|
|
180
|
-
* This should *not* be used to render; instead useSuspense() or useCache()
|
|
181
|
-
* @see https://resthooks.io/docs/api/Controller#getState
|
|
182
|
-
*/
|
|
183
|
-
|
|
184
|
-
constructor({
|
|
185
|
-
dispatch = unsetDispatch,
|
|
186
|
-
getState = unsetState,
|
|
187
|
-
globalCache = {
|
|
188
|
-
entities: {},
|
|
189
|
-
results: {}
|
|
190
|
-
}
|
|
191
|
-
} = {}) {
|
|
192
|
-
/*************** Action Dispatchers ***************/
|
|
193
|
-
/**
|
|
194
|
-
* Fetches the endpoint with given args, updating the Rest Hooks cache with the response or error upon completion.
|
|
195
|
-
* @see https://resthooks.io/docs/api/Controller#fetch
|
|
196
|
-
*/
|
|
197
|
-
this.fetch = (endpoint, ...args) => {
|
|
198
|
-
const action = createFetch(endpoint, {
|
|
199
|
-
args
|
|
200
|
-
});
|
|
201
|
-
this.dispatch(action);
|
|
202
|
-
if (endpoint.schema) {
|
|
203
|
-
return action.meta.promise.then(input => normalizr.denormalize(input, endpoint.schema, {}, args));
|
|
204
|
-
}
|
|
205
|
-
return action.meta.promise;
|
|
206
|
-
};
|
|
207
|
-
/**
|
|
208
|
-
* Fetches only if endpoint is considered 'stale'; otherwise returns undefined
|
|
209
|
-
* @see https://dataclient.io/docs/api/Controller#fetchIfStale
|
|
210
|
-
*/
|
|
211
|
-
this.fetchIfStale = (endpoint, ...args) => {
|
|
212
|
-
const {
|
|
213
|
-
data,
|
|
214
|
-
expiresAt,
|
|
215
|
-
expiryStatus
|
|
216
|
-
} = this.getResponse(endpoint, ...args, this.getState());
|
|
217
|
-
if (expiryStatus !== normalizr.ExpiryStatus.Invalid && Date.now() <= expiresAt) return data;
|
|
218
|
-
return this.fetch(endpoint, ...args);
|
|
219
|
-
};
|
|
220
|
-
/**
|
|
221
|
-
* Forces refetching and suspense on useSuspense with the same Endpoint and parameters.
|
|
222
|
-
* @see https://resthooks.io/docs/api/Controller#invalidate
|
|
223
|
-
*/
|
|
224
|
-
this.invalidate = (endpoint, ...args) => args[0] !== null ? this.dispatch(createInvalidate(endpoint, {
|
|
225
|
-
args: args
|
|
226
|
-
})) : Promise.resolve();
|
|
227
|
-
/**
|
|
228
|
-
* Forces refetching and suspense on useSuspense on all matching endpoint result keys.
|
|
229
|
-
* @see https://resthooks.io/docs/api/Controller#invalidateAll
|
|
230
|
-
* @returns Promise that resolves when invalidation is commited.
|
|
231
|
-
*/
|
|
232
|
-
this.invalidateAll = options => this.dispatch(createInvalidateAll(key => options.testKey(key)));
|
|
233
|
-
/**
|
|
234
|
-
* Sets all matching endpoint result keys to be STALE.
|
|
235
|
-
* @see https://dataclient.io/docs/api/Controller#expireAll
|
|
236
|
-
* @returns Promise that resolves when expiry is commited. *NOT* fetch promise
|
|
237
|
-
*/
|
|
238
|
-
this.expireAll = options => this.dispatch(createExpireAll(key => options.testKey(key)));
|
|
239
|
-
/**
|
|
240
|
-
* Resets the entire Rest Hooks cache. All inflight requests will not resolve.
|
|
241
|
-
* @see https://resthooks.io/docs/api/Controller#resetEntireStore
|
|
242
|
-
*/
|
|
243
|
-
this.resetEntireStore = () => this.dispatch(createReset());
|
|
244
|
-
/**
|
|
245
|
-
* Stores response in cache for given Endpoint and args.
|
|
246
|
-
* @see https://resthooks.io/docs/api/Controller#set
|
|
247
|
-
*/
|
|
248
|
-
this.setResponse = (endpoint, ...rest) => {
|
|
249
|
-
const response = rest[rest.length - 1];
|
|
250
|
-
const action = createSet(endpoint, {
|
|
251
|
-
args: rest.slice(0, rest.length - 1),
|
|
252
|
-
response
|
|
253
|
-
});
|
|
254
|
-
return this.dispatch(action);
|
|
255
|
-
};
|
|
256
|
-
/**
|
|
257
|
-
* @deprecated use https://resthooks.io/docs/api/Controller#setResponse instead
|
|
258
|
-
*/
|
|
259
|
-
/* istanbul ignore next */
|
|
260
|
-
this.receive = (endpoint, ...rest) => {
|
|
261
|
-
/* istanbul ignore next */
|
|
262
|
-
return this.setResponse(endpoint, ...rest);
|
|
263
|
-
};
|
|
264
|
-
/**
|
|
265
|
-
* Stores the result of Endpoint and args as the error provided.
|
|
266
|
-
* @see https://resthooks.io/docs/api/Controller#setError
|
|
267
|
-
*/
|
|
268
|
-
this.setError = (endpoint, ...rest) => {
|
|
269
|
-
const response = rest[rest.length - 1];
|
|
270
|
-
const action = createSet(endpoint, {
|
|
271
|
-
args: rest.slice(0, rest.length - 1),
|
|
272
|
-
response,
|
|
273
|
-
error: true
|
|
274
|
-
});
|
|
275
|
-
return this.dispatch(action);
|
|
276
|
-
};
|
|
277
|
-
/**
|
|
278
|
-
* Another name for setError
|
|
279
|
-
* @deprecated use https://resthooks.io/docs/api/Controller#setError instead
|
|
280
|
-
*/
|
|
281
|
-
/* istanbul ignore next */
|
|
282
|
-
this.receiveError = (endpoint, ...rest) => {
|
|
283
|
-
/* istanbul ignore next */
|
|
284
|
-
return this.setError(endpoint, ...rest);
|
|
285
|
-
};
|
|
286
|
-
/**
|
|
287
|
-
* Resolves an inflight fetch. `fetchedAt` should `fetch`'s `createdAt`
|
|
288
|
-
* @see https://resthooks.io/docs/api/Controller#resolve
|
|
289
|
-
*/
|
|
290
|
-
this.resolve = (endpoint, meta) => {
|
|
291
|
-
return this.dispatch(createSet(endpoint, meta));
|
|
292
|
-
};
|
|
293
|
-
/**
|
|
294
|
-
* Marks a new subscription to a given Endpoint.
|
|
295
|
-
* @see https://resthooks.io/docs/api/Controller#subscribe
|
|
296
|
-
*/
|
|
297
|
-
this.subscribe = (endpoint, ...args) => args[0] !== null ? this.dispatch(createSubscription(endpoint, {
|
|
298
|
-
args: args
|
|
299
|
-
})) : Promise.resolve();
|
|
300
|
-
/**
|
|
301
|
-
* Marks completion of subscription to a given Endpoint.
|
|
302
|
-
* @see https://resthooks.io/docs/api/Controller#unsubscribe
|
|
303
|
-
*/
|
|
304
|
-
this.unsubscribe = (endpoint, ...args) => args[0] !== null ? this.dispatch(createUnsubscription(endpoint, {
|
|
305
|
-
args: args
|
|
306
|
-
})) : Promise.resolve();
|
|
307
|
-
/*************** More ***************/
|
|
308
|
-
/* TODO:
|
|
309
|
-
abort = <E extends EndpointInterface>(
|
|
310
|
-
endpoint: E,
|
|
311
|
-
...args: readonly [...Parameters<E>]
|
|
312
|
-
): Promise<void>
|
|
313
|
-
*/
|
|
314
|
-
/**
|
|
315
|
-
* Gets a snapshot (https://resthooks.io/docs/api/Snapshot)
|
|
316
|
-
* @see https://resthooks.io/docs/api/Controller#snapshot
|
|
317
|
-
*/
|
|
318
|
-
this.snapshot = (state, fetchedAt) => {
|
|
319
|
-
return new Snapshot(this, state, fetchedAt);
|
|
320
|
-
};
|
|
321
|
-
/**
|
|
322
|
-
* Gets the error, if any, for a given endpoint. Returns undefined for no errors.
|
|
323
|
-
* @see https://resthooks.io/docs/api/Controller#getError
|
|
324
|
-
*/
|
|
325
|
-
this.getError = (endpoint, ...rest) => {
|
|
326
|
-
if (rest[0] === null) return;
|
|
327
|
-
const state = rest[rest.length - 1];
|
|
328
|
-
// this is typescript generics breaking
|
|
329
|
-
const args = rest.slice(0, rest.length - 1);
|
|
330
|
-
const key = endpoint.key(...args);
|
|
331
|
-
const meta = selectMeta(state, key);
|
|
332
|
-
const results = state.results[key];
|
|
333
|
-
if (results !== undefined && (meta == null ? void 0 : meta.errorPolicy) === 'soft') return;
|
|
334
|
-
return meta == null ? void 0 : meta.error;
|
|
335
|
-
};
|
|
336
|
-
/**
|
|
337
|
-
* Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
|
|
338
|
-
* @see https://resthooks.io/docs/api/Controller#getResponse
|
|
339
|
-
*/
|
|
340
|
-
this.getResponse = (endpoint, ...rest) => {
|
|
341
|
-
const state = rest[rest.length - 1];
|
|
342
|
-
// this is typescript generics breaking
|
|
343
|
-
const args = rest.slice(0, rest.length - 1).map(ensurePojo$1);
|
|
344
|
-
const isActive = args.length !== 1 || args[0] !== null;
|
|
345
|
-
const key = isActive ? endpoint.key(...args) : '';
|
|
346
|
-
const cacheResults = isActive ? state.results[key] : undefined;
|
|
347
|
-
const schema = endpoint.schema;
|
|
348
|
-
const meta = selectMeta(state, key);
|
|
349
|
-
let expiresAt = meta == null ? void 0 : meta.expiresAt;
|
|
350
|
-
let invalidResults = false;
|
|
351
|
-
let results;
|
|
352
|
-
if (cacheResults === undefined && endpoint.schema !== undefined) {
|
|
353
|
-
results = normalizr.inferResults(endpoint.schema, args, state.indexes, state.entities);
|
|
354
|
-
invalidResults = !normalizr.validateInference(results);
|
|
355
|
-
if (!expiresAt && invalidResults) expiresAt = 1;
|
|
356
|
-
} else {
|
|
357
|
-
results = cacheResults;
|
|
358
|
-
}
|
|
359
|
-
if (!isActive) {
|
|
360
|
-
return {
|
|
361
|
-
data: results,
|
|
362
|
-
expiryStatus: normalizr.ExpiryStatus.Valid,
|
|
363
|
-
expiresAt: Infinity
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
if (!endpoint.schema || !schemaHasEntity(endpoint.schema)) {
|
|
367
|
-
return {
|
|
368
|
-
data: results,
|
|
369
|
-
expiryStatus: meta != null && meta.invalidated ? normalizr.ExpiryStatus.Invalid : cacheResults && !endpoint.invalidIfStale ? normalizr.ExpiryStatus.Valid : normalizr.ExpiryStatus.InvalidIfStale,
|
|
370
|
-
expiresAt: expiresAt || 0
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
if (!this.globalCache.results[key]) this.globalCache.results[key] = new normalizr.WeakEntityMap();
|
|
374
|
-
|
|
375
|
-
// second argument is false if any entities are missing
|
|
376
|
-
// eslint-disable-next-line prefer-const
|
|
377
|
-
const {
|
|
378
|
-
data,
|
|
379
|
-
paths
|
|
380
|
-
} = normalizr.denormalizeCached(results, schema, state.entities, this.globalCache.entities, this.globalCache.results[key], args);
|
|
381
|
-
const invalidDenormalize = typeof data === 'symbol';
|
|
382
|
-
|
|
383
|
-
// fallback to entity expiry time
|
|
384
|
-
if (!expiresAt) {
|
|
385
|
-
expiresAt = entityExpiresAt(paths, state.entityMeta);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// https://resthooks.io/docs/concepts/expiry-policy#expiry-status
|
|
389
|
-
// we don't track the difference between stale or fresh because that is tied to triggering
|
|
390
|
-
// conditions
|
|
391
|
-
const expiryStatus = meta != null && meta.invalidated || invalidDenormalize && !(meta != null && meta.error) ? normalizr.ExpiryStatus.Invalid : invalidDenormalize || endpoint.invalidIfStale || invalidResults ? normalizr.ExpiryStatus.InvalidIfStale : normalizr.ExpiryStatus.Valid;
|
|
392
|
-
return {
|
|
393
|
-
data,
|
|
394
|
-
expiryStatus,
|
|
395
|
-
expiresAt
|
|
396
|
-
};
|
|
397
|
-
};
|
|
398
|
-
this.dispatch = dispatch;
|
|
399
|
-
this.getState = getState;
|
|
400
|
-
this.globalCache = globalCache;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// benchmark: https://www.measurethat.net/Benchmarks/Show/24691/0/min-reducer-vs-imperative-with-paths
|
|
405
|
-
// earliest expiry dictates age
|
|
406
|
-
function entityExpiresAt(paths, entityMeta) {
|
|
407
|
-
let expiresAt = Infinity;
|
|
408
|
-
for (const {
|
|
409
|
-
pk,
|
|
410
|
-
key
|
|
411
|
-
} of paths) {
|
|
412
|
-
var _entityMeta$key, _entityMeta$key$pk;
|
|
413
|
-
const entityExpiry = (_entityMeta$key = entityMeta[key]) == null ? void 0 : (_entityMeta$key$pk = _entityMeta$key[pk]) == null ? void 0 : _entityMeta$key$pk.expiresAt;
|
|
414
|
-
// expiresAt will always resolve to false with any comparison
|
|
415
|
-
if (entityExpiry < expiresAt) expiresAt = entityExpiry;
|
|
416
|
-
}
|
|
417
|
-
return expiresAt;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/** Determine whether the schema has any entities.
|
|
421
|
-
*
|
|
422
|
-
* Without entities, denormalization is not needed, and results should not be inferred.
|
|
423
|
-
*/
|
|
424
|
-
function schemaHasEntity(schema) {
|
|
425
|
-
if (normalizr.isEntity(schema)) return true;
|
|
426
|
-
if (Array.isArray(schema)) return schema.length !== 0 && schemaHasEntity(schema[0]);
|
|
427
|
-
if (schema && (typeof schema === 'object' || typeof schema === 'function')) {
|
|
428
|
-
const nestedSchema = 'schema' in schema ? schema.schema : schema;
|
|
429
|
-
if (typeof nestedSchema === 'function') {
|
|
430
|
-
return schemaHasEntity(nestedSchema);
|
|
431
|
-
}
|
|
432
|
-
return Object.values(nestedSchema).some(x => schemaHasEntity(x));
|
|
433
|
-
}
|
|
434
|
-
return false;
|
|
435
|
-
}
|
|
436
|
-
class Snapshot {
|
|
437
|
-
constructor(controller, state, fetchedAt = 0) {
|
|
438
|
-
this.state = void 0;
|
|
439
|
-
this.controller = void 0;
|
|
440
|
-
this.fetchedAt = void 0;
|
|
441
|
-
/*************** Data Access ***************/
|
|
442
|
-
/** @see https://resthooks.io/docs/api/Snapshot#getResponse */
|
|
443
|
-
this.getResponse = (endpoint, ...args) => {
|
|
444
|
-
return this.controller.getResponse(endpoint, ...args, this.state);
|
|
445
|
-
};
|
|
446
|
-
/** @see https://resthooks.io/docs/api/Snapshot#getError */
|
|
447
|
-
this.getError = (endpoint, ...args) => {
|
|
448
|
-
return this.controller.getError(endpoint, ...args, this.state);
|
|
449
|
-
};
|
|
450
|
-
this.state = state;
|
|
451
|
-
this.controller = controller;
|
|
452
|
-
this.fetchedAt = fetchedAt;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
exports.Controller = Controller;
|
package/legacy/actionTypes.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
export const FETCH_TYPE = '
|
|
2
|
-
|
|
3
|
-
export const
|
|
4
|
-
export const
|
|
5
|
-
export const
|
|
6
|
-
export const
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
10
|
-
export const
|
|
11
|
-
|
|
12
|
-
export const GC_TYPE = 'rest-hooks/gc';
|
|
13
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGRVRDSF9UWVBFIiwiUkVDRUlWRV9UWVBFIiwiU0VUX1RZUEUiLCJPUFRJTUlTVElDX1RZUEUiLCJSRVNFVF9UWVBFIiwiU1VCU0NSSUJFX1RZUEUiLCJVTlNVQlNDUklCRV9UWVBFIiwiSU5WQUxJREFURV9UWVBFIiwiSU5WQUxJREFURUFMTF9UWVBFIiwiRVhQSVJFQUxMX1RZUEUiLCJHQ19UWVBFIl0sInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvblR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBGRVRDSF9UWVBFID0gJ3Jlc3QtaG9va3MvZmV0Y2gnIGFzIGNvbnN0O1xuLyoqIEBkZXByZWNhdGVkIHVzZSBTRVRfVFlQRSBpbnN0ZWFkICovXG5leHBvcnQgY29uc3QgUkVDRUlWRV9UWVBFID0gJ3Jlc3QtaG9va3MvcmVjZWl2ZScgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgU0VUX1RZUEUgPSBSRUNFSVZFX1RZUEU7XG5leHBvcnQgY29uc3QgT1BUSU1JU1RJQ19UWVBFID0gJ3Jlc3QtaG9va3Mvb3B0aW1pc3RpYycgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgUkVTRVRfVFlQRSA9ICdyZXN0LWhvb2tzL3Jlc2V0JyBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVUJTQ1JJQkVfVFlQRSA9ICdyZXN0LWhvb2tzL3N1YnNjcmliZScgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgVU5TVUJTQ1JJQkVfVFlQRSA9ICdyZXN0LWhvb2svdW5zdWJzY3JpYmUnIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IElOVkFMSURBVEVfVFlQRSA9ICdyZXN0LWhvb2tzL2ludmFsaWRhdGUnIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IElOVkFMSURBVEVBTExfVFlQRSA9ICdyZXN0LWhvb2tzL2ludmFsaWRhdGVhbGwnIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IEVYUElSRUFMTF9UWVBFID0gJ3Jlc3QtaG9va3MvZXhwaXJlYWxsJyBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBHQ19UWVBFID0gJ3Jlc3QtaG9va3MvZ2MnIGFzIGNvbnN0O1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLFVBQVUsR0FBRyxrQkFBMkI7QUFDckQ7QUFDQSxPQUFPLE1BQU1DLFlBQVksR0FBRyxvQkFBNkI7QUFDekQsT0FBTyxNQUFNQyxRQUFRLEdBQUdELFlBQVk7QUFDcEMsT0FBTyxNQUFNRSxlQUFlLEdBQUcsdUJBQWdDO0FBQy9ELE9BQU8sTUFBTUMsVUFBVSxHQUFHLGtCQUEyQjtBQUNyRCxPQUFPLE1BQU1DLGNBQWMsR0FBRyxzQkFBK0I7QUFDN0QsT0FBTyxNQUFNQyxnQkFBZ0IsR0FBRyx1QkFBZ0M7QUFDaEUsT0FBTyxNQUFNQyxlQUFlLEdBQUcsdUJBQWdDO0FBQy9ELE9BQU8sTUFBTUMsa0JBQWtCLEdBQUcsMEJBQW1DO0FBQ3JFLE9BQU8sTUFBTUMsY0FBYyxHQUFHLHNCQUErQjtBQUM3RCxPQUFPLE1BQU1DLE9BQU8sR0FBRyxlQUF3QiJ9
|
|
1
|
+
export const FETCH_TYPE = 'rdc/fetch';
|
|
2
|
+
export const SET_TYPE = 'rdc/set';
|
|
3
|
+
export const OPTIMISTIC_TYPE = 'rdc/optimistic';
|
|
4
|
+
export const RESET_TYPE = 'rdc/reset';
|
|
5
|
+
export const SUBSCRIBE_TYPE = 'rdc/subscribe';
|
|
6
|
+
export const UNSUBSCRIBE_TYPE = 'rdc/unsubscribe';
|
|
7
|
+
export const INVALIDATE_TYPE = 'rdc/invalidate';
|
|
8
|
+
export const INVALIDATEALL_TYPE = 'rdc/invalidateall';
|
|
9
|
+
export const EXPIREALL_TYPE = 'rdc/expireall';
|
|
10
|
+
export const GC_TYPE = 'rdc/gc';
|
|
11
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGRVRDSF9UWVBFIiwiU0VUX1RZUEUiLCJPUFRJTUlTVElDX1RZUEUiLCJSRVNFVF9UWVBFIiwiU1VCU0NSSUJFX1RZUEUiLCJVTlNVQlNDUklCRV9UWVBFIiwiSU5WQUxJREFURV9UWVBFIiwiSU5WQUxJREFURUFMTF9UWVBFIiwiRVhQSVJFQUxMX1RZUEUiLCJHQ19UWVBFIl0sInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvblR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBGRVRDSF9UWVBFID0gJ3JkYy9mZXRjaCcgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgU0VUX1RZUEUgPSAncmRjL3NldCcgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgT1BUSU1JU1RJQ19UWVBFID0gJ3JkYy9vcHRpbWlzdGljJyBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBSRVNFVF9UWVBFID0gJ3JkYy9yZXNldCcgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgU1VCU0NSSUJFX1RZUEUgPSAncmRjL3N1YnNjcmliZScgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgVU5TVUJTQ1JJQkVfVFlQRSA9ICdyZGMvdW5zdWJzY3JpYmUnIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IElOVkFMSURBVEVfVFlQRSA9ICdyZGMvaW52YWxpZGF0ZScgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgSU5WQUxJREFURUFMTF9UWVBFID0gJ3JkYy9pbnZhbGlkYXRlYWxsJyBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBFWFBJUkVBTExfVFlQRSA9ICdyZGMvZXhwaXJlYWxsJyBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBHQ19UWVBFID0gJ3JkYy9nYycgYXMgY29uc3Q7XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTUEsVUFBVSxHQUFHLFdBQW9CO0FBQzlDLE9BQU8sTUFBTUMsUUFBUSxHQUFHLFNBQWtCO0FBQzFDLE9BQU8sTUFBTUMsZUFBZSxHQUFHLGdCQUF5QjtBQUN4RCxPQUFPLE1BQU1DLFVBQVUsR0FBRyxXQUFvQjtBQUM5QyxPQUFPLE1BQU1DLGNBQWMsR0FBRyxlQUF3QjtBQUN0RCxPQUFPLE1BQU1DLGdCQUFnQixHQUFHLGlCQUEwQjtBQUMxRCxPQUFPLE1BQU1DLGVBQWUsR0FBRyxnQkFBeUI7QUFDeEQsT0FBTyxNQUFNQyxrQkFBa0IsR0FBRyxtQkFBNEI7QUFDOUQsT0FBTyxNQUFNQyxjQUFjLEdBQUcsZUFBd0I7QUFDdEQsT0FBTyxNQUFNQyxPQUFPLEdBQUcsUUFBaUIifQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBFbmRwb2ludEludGVyZmFjZSxcbiAgUmVzb2x2ZVR5cGUsXG4gIFVua25vd25FcnJvcixcbn0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5cbmltcG9ydCB0eXBlIHtcbiAgU0VUX1RZUEUsXG4gIFJFU0VUX1RZUEUsXG4gIEZFVENIX1RZUEUsXG4gIFNVQlNDUklCRV9UWVBFLFxuICBVTlNVQlNDUklCRV9UWVBFLFxuICBJTlZBTElEQVRFX1RZUEUsXG4gIEdDX1RZUEUsXG4gIE9QVElNSVNUSUNfVFlQRSxcbiAgSU5WQUxJREFURUFMTF9UWVBFLFxuICBFWFBJUkVBTExfVFlQRSxcbn0gZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50VXBkYXRlRnVuY3Rpb24gfSBmcm9tICcuL2NvbnRyb2xsZXIvdHlwZXMuanMnO1xuXG50eXBlIEVuZHBvaW50QW5kVXBkYXRlPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4gPSBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbn07XG50eXBlIEVuZHBvaW50RGVmYXVsdCA9IEVuZHBvaW50SW50ZXJmYWNlICYge1xuICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEVuZHBvaW50SW50ZXJmYWNlPjtcbn07XG5cbi8qIFNFVCAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXRNZXRhIHtcbiAgYXJnczogcmVhZG9ubHkgYW55W107XG4gIGtleTogc3RyaW5nO1xuICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgZGF0ZTogbnVtYmVyO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2V0QWN0aW9uU3VjY2VzczxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiB7XG4gIHR5cGU6IHR5cGVvZiBTRVRfVFlQRTtcbiAgZW5kcG9pbnQ6IEU7XG4gIG1ldGE6IFNldE1ldGE7XG4gIHBheWxvYWQ6IFJlc29sdmVUeXBlPEU+O1xuICBlcnJvcj86IGZhbHNlO1xufVxuZXhwb3J0IGludGVyZmFjZSBTZXRBY3Rpb25FcnJvcjxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiB7XG4gIHR5cGU6IHR5cGVvZiBTRVRfVFlQRTtcbiAgZW5kcG9pbnQ6IEU7XG4gIG1ldGE6IFNldE1ldGE7XG4gIHBheWxvYWQ6IFVua25vd25FcnJvcjtcbiAgZXJyb3I6IHRydWU7XG59XG5leHBvcnQgdHlwZSBTZXRBY3Rpb248RSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0PiA9XG4gIHwgU2V0QWN0aW9uU3VjY2VzczxFPlxuICB8IFNldEFjdGlvbkVycm9yPEU+O1xuXG4vKiBGRVRDSCAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaE1ldGEge1xuICBhcmdzOiByZWFkb25seSBhbnlbXTtcbiAga2V5OiBzdHJpbmc7XG4gIHRocm90dGxlOiBib29sZWFuO1xuICByZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+KSA9PiB2b2lkO1xuICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByb21pc2U6IFByb21pc2VMaWtlPGFueT47XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAvLyBpbmRpY2F0ZXMgd2hldGhlciBuZXR3b3JrIG1hbmFnZXIgcHJvY2Vzc2VkIGl0XG4gIG5tPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaEFjdGlvbjxFIGV4dGVuZHMgRW5kcG9pbnRBbmRVcGRhdGU8RT4gPSBFbmRwb2ludERlZmF1bHQ+IHtcbiAgdHlwZTogdHlwZW9mIEZFVENIX1RZUEU7XG4gIGVuZHBvaW50OiBFO1xuICBtZXRhOiBGZXRjaE1ldGE7XG4gIHBheWxvYWQ6ICgpID0+IFJldHVyblR5cGU8RT47XG59XG5cbi8qIE9QVElNSVNUSUMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW1pc3RpY0FjdGlvbjxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiB7XG4gIHR5cGU6IHR5cGVvZiBPUFRJTUlTVElDX1RZUEU7XG4gIGVuZHBvaW50OiBFO1xuICBtZXRhOiBTZXRNZXRhO1xuICBlcnJvcj86IGZhbHNlO1xufVxuXG4vKiBTVUJTQ1JJQkUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlQWN0aW9uPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRBbmRVcGRhdGU8RT4gPSBFbmRwb2ludERlZmF1bHQsXG4+IHtcbiAgdHlwZTogdHlwZW9mIFNVQlNDUklCRV9UWVBFO1xuICBlbmRwb2ludDogRTtcbiAgbWV0YToge1xuICAgIGFyZ3M6IHJlYWRvbmx5IGFueVtdO1xuICAgIGtleTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuc3Vic2NyaWJlQWN0aW9uPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRBbmRVcGRhdGU8RT4gPSBFbmRwb2ludERlZmF1bHQsXG4+IHtcbiAgdHlwZTogdHlwZW9mIFVOU1VCU0NSSUJFX1RZUEU7XG4gIGVuZHBvaW50OiBFO1xuICBtZXRhOiB7XG4gICAgYXJnczogcmVhZG9ubHkgYW55W107XG4gICAga2V5OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qIEVYUElSWSAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBpcmVBbGxBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgRVhQSVJFQUxMX1RZUEU7XG4gIHRlc3RLZXk6IChrZXk6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyogSU5WQUxJREFURSAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkYXRlQWxsQWN0aW9uIHtcbiAgdHlwZTogdHlwZW9mIElOVkFMSURBVEVBTExfVFlQRTtcbiAgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRhdGVBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgSU5WQUxJREFURV9UWVBFO1xuICBtZXRhOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qIFJFU0VUICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc2V0QWN0aW9uIHtcbiAgdHlwZTogdHlwZW9mIFJFU0VUX1RZUEU7XG4gIGRhdGU6IG51bWJlcjtcbn1cblxuLyogR0MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgR0NfVFlQRTtcbiAgZW50aXRpZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcbiAgcmVzdWx0czogc3RyaW5nW107XG59XG5cbmV4cG9ydCB0eXBlIEFjdGlvblR5cGVzID1cbiAgfCBGZXRjaEFjdGlvblxuICB8IE9wdGltaXN0aWNBY3Rpb25cbiAgfCBTZXRBY3Rpb25cbiAgfCBTdWJzY3JpYmVBY3Rpb25cbiAgfCBVbnN1YnNjcmliZUFjdGlvblxuICB8IEludmFsaWRhdGVBY3Rpb25cbiAgfCBJbnZhbGlkYXRlQWxsQWN0aW9uXG4gIHwgRXhwaXJlQWxsQWN0aW9uXG4gIHwgUmVzZXRBY3Rpb25cbiAgfCBHQ0FjdGlvbjtcbiJdLCJtYXBwaW5ncyI6IiJ9
|