@data-client/core 0.10.0 → 0.11.4
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/README.md +2 -1
- package/dist/index.js +122 -89
- package/dist/index.umd.min.js +1 -1
- package/legacy/actionTypes.js +1 -1
- package/legacy/actions.js +1 -1
- package/legacy/controller/AbortOptimistic.js +2 -0
- package/legacy/controller/Controller.js +108 -76
- package/legacy/controller/createExpireAll.js +1 -1
- package/legacy/controller/createFetch.js +1 -1
- package/legacy/controller/createInvalidate.js +1 -1
- package/legacy/controller/createInvalidateAll.js +1 -1
- package/legacy/controller/createOptimistic.js +1 -1
- package/legacy/controller/createReset.js +1 -1
- package/legacy/controller/createSet.js +1 -1
- package/legacy/controller/createSubscription.js +1 -1
- package/legacy/controller/ensurePojo.js +1 -1
- package/legacy/controller/types.js +1 -1
- package/legacy/index.js +1 -1
- package/legacy/internal.js +2 -2
- package/legacy/manager/ConnectionListener.js +1 -1
- package/legacy/manager/DefaultConnectionListener.js +1 -1
- package/legacy/manager/DevtoolsManager.js +1 -1
- package/legacy/manager/LogoutManager.js +1 -1
- package/legacy/manager/NetworkManager.js +1 -1
- package/legacy/manager/PollingSubscription.js +1 -1
- package/legacy/manager/SubscriptionManager.js +1 -1
- package/legacy/manager/applyManager.js +1 -1
- package/legacy/manager/devtoolsTypes.js +1 -1
- package/legacy/manager/index.js +1 -1
- package/legacy/middlewareTypes.js +1 -1
- package/legacy/next/index.js +1 -1
- package/legacy/state/RIC.js +1 -1
- package/legacy/state/reducer/createReducer.js +4 -4
- package/legacy/state/reducer/expireReducer.js +1 -1
- package/legacy/state/reducer/fetchReducer.js +1 -1
- package/legacy/state/reducer/invalidateReducer.js +5 -5
- package/legacy/state/reducer/setReducer.js +7 -7
- package/legacy/state/selectMeta.js +1 -1
- package/legacy/types.js +1 -1
- package/lib/actionTypes.js +1 -1
- package/lib/actions.d.ts +1 -1
- package/lib/actions.d.ts.map +1 -1
- package/lib/actions.js +1 -1
- package/lib/controller/AbortOptimistic.d.ts +3 -0
- package/lib/controller/AbortOptimistic.d.ts.map +1 -0
- package/lib/controller/AbortOptimistic.js +2 -0
- package/lib/controller/Controller.d.ts +36 -11
- package/lib/controller/Controller.d.ts.map +1 -1
- package/lib/controller/Controller.js +108 -76
- package/lib/controller/createExpireAll.js +1 -1
- package/lib/controller/createFetch.js +1 -1
- package/lib/controller/createInvalidate.js +1 -1
- package/lib/controller/createInvalidateAll.js +1 -1
- package/lib/controller/createOptimistic.js +1 -1
- package/lib/controller/createReset.js +1 -1
- package/lib/controller/createSet.js +1 -1
- package/lib/controller/createSubscription.js +1 -1
- package/lib/controller/ensurePojo.js +1 -1
- package/lib/controller/types.js +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/internal.d.ts +1 -1
- package/lib/internal.d.ts.map +1 -1
- package/lib/internal.js +2 -2
- package/lib/manager/ConnectionListener.js +1 -1
- package/lib/manager/DefaultConnectionListener.js +1 -1
- package/lib/manager/DevtoolsManager.js +1 -1
- package/lib/manager/LogoutManager.js +1 -1
- package/lib/manager/NetworkManager.js +1 -1
- package/lib/manager/PollingSubscription.js +1 -1
- package/lib/manager/SubscriptionManager.js +1 -1
- package/lib/manager/applyManager.js +1 -1
- package/lib/manager/devtoolsTypes.js +1 -1
- package/lib/manager/index.js +1 -1
- package/lib/middlewareTypes.js +1 -1
- package/lib/next/index.js +1 -1
- package/lib/state/RIC.js +1 -1
- package/lib/state/reducer/createReducer.js +4 -4
- package/lib/state/reducer/expireReducer.d.ts +1 -1
- package/lib/state/reducer/expireReducer.js +1 -1
- package/lib/state/reducer/fetchReducer.js +1 -1
- package/lib/state/reducer/invalidateReducer.d.ts +1 -1
- package/lib/state/reducer/invalidateReducer.js +6 -6
- package/lib/state/reducer/setReducer.d.ts.map +1 -1
- package/lib/state/reducer/setReducer.js +8 -8
- package/lib/state/selectMeta.js +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +1 -1
- package/package.json +3 -3
- package/src/actions.ts +1 -1
- package/src/controller/AbortOptimistic.ts +1 -0
- package/src/controller/Controller.ts +185 -63
- package/src/controller/__tests__/Controller.ts +2 -4
- package/src/controller/__tests__/__snapshots__/get.ts.snap +120 -0
- package/src/controller/__tests__/get.ts +285 -0
- package/src/controller/__tests__/getResponse.ts +2 -2
- package/src/index.ts +3 -1
- package/src/internal.ts +1 -1
- package/src/manager/__tests__/logoutManager.ts +0 -2
- package/src/state/__tests__/__snapshots__/reducer.ts.snap +4 -4
- package/src/state/__tests__/reducer.ts +25 -25
- package/src/state/reducer/createReducer.ts +3 -3
- package/src/state/reducer/invalidateReducer.ts +4 -4
- package/src/state/reducer/setReducer.ts +7 -6
- package/src/types.ts +3 -1
- package/ts3.4/actions.d.ts +1 -1
- package/ts3.4/controller/AbortOptimistic.d.ts +3 -0
- package/ts3.4/controller/Controller.d.ts +47 -19
- package/ts3.4/index.d.ts +1 -1
- package/ts3.4/internal.d.ts +1 -1
- package/ts3.4/state/reducer/expireReducer.d.ts +1 -1
- package/ts3.4/state/reducer/invalidateReducer.d.ts +1 -1
- package/ts3.4/types.d.ts +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { INVALIDATE_TYPE } from '../../actionTypes.js';
|
|
2
2
|
export function invalidateReducer(state, action) {
|
|
3
|
-
const
|
|
4
|
-
...state.
|
|
3
|
+
const endpoints = {
|
|
4
|
+
...state.endpoints
|
|
5
5
|
};
|
|
6
6
|
const meta = {
|
|
7
7
|
...state.meta
|
|
8
8
|
};
|
|
9
9
|
const invalidateKey = key => {
|
|
10
|
-
delete
|
|
10
|
+
delete endpoints[key];
|
|
11
11
|
const itemMeta = {
|
|
12
12
|
...meta[key],
|
|
13
13
|
expiresAt: 0,
|
|
@@ -19,7 +19,7 @@ export function invalidateReducer(state, action) {
|
|
|
19
19
|
if (action.type === INVALIDATE_TYPE) {
|
|
20
20
|
invalidateKey(action.meta.key);
|
|
21
21
|
} else {
|
|
22
|
-
Object.keys(
|
|
22
|
+
Object.keys(endpoints).forEach(key => {
|
|
23
23
|
if (action.testKey(key)) {
|
|
24
24
|
invalidateKey(key);
|
|
25
25
|
}
|
|
@@ -27,8 +27,8 @@ export function invalidateReducer(state, action) {
|
|
|
27
27
|
}
|
|
28
28
|
return {
|
|
29
29
|
...state,
|
|
30
|
-
|
|
30
|
+
endpoints,
|
|
31
31
|
meta
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlZBTElEQVRFX1RZUEUiLCJpbnZhbGlkYXRlUmVkdWNlciIsInN0YXRlIiwiYWN0aW9uIiwiZW5kcG9pbnRzIiwibWV0YSIsImludmFsaWRhdGVLZXkiLCJrZXkiLCJpdGVtTWV0YSIsImV4cGlyZXNBdCIsImludmFsaWRhdGVkIiwiZXJyb3IiLCJ0eXBlIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJ0ZXN0S2V5Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0YXRlL3JlZHVjZXIvaW52YWxpZGF0ZVJlZHVjZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5WQUxJREFURV9UWVBFIH0gZnJvbSAnLi4vLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBTdGF0ZSxcbiAgSW52YWxpZGF0ZUFsbEFjdGlvbixcbiAgSW52YWxpZGF0ZUFjdGlvbixcbn0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZVJlZHVjZXIoXG4gIHN0YXRlOiBTdGF0ZTx1bmtub3duPixcbiAgYWN0aW9uOiBJbnZhbGlkYXRlQWN0aW9uIHwgSW52YWxpZGF0ZUFsbEFjdGlvbixcbikge1xuICBjb25zdCBlbmRwb2ludHMgPSB7IC4uLnN0YXRlLmVuZHBvaW50cyB9O1xuICBjb25zdCBtZXRhID0geyAuLi5zdGF0ZS5tZXRhIH07XG4gIGNvbnN0IGludmFsaWRhdGVLZXkgPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBkZWxldGUgZW5kcG9pbnRzW2tleV07XG4gICAgY29uc3QgaXRlbU1ldGEgPSB7XG4gICAgICAuLi5tZXRhW2tleV0sXG4gICAgICBleHBpcmVzQXQ6IDAsXG4gICAgICBpbnZhbGlkYXRlZDogdHJ1ZSxcbiAgICB9O1xuICAgIGRlbGV0ZSBpdGVtTWV0YS5lcnJvcjtcbiAgICBtZXRhW2tleV0gPSBpdGVtTWV0YTtcbiAgfTtcbiAgaWYgKGFjdGlvbi50eXBlID09PSBJTlZBTElEQVRFX1RZUEUpIHtcbiAgICBpbnZhbGlkYXRlS2V5KGFjdGlvbi5tZXRhLmtleSk7XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmtleXMoZW5kcG9pbnRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoYWN0aW9uLnRlc3RLZXkoa2V5KSkge1xuICAgICAgICBpbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVuZHBvaW50cyxcbiAgICBtZXRhLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsc0JBQXNCO0FBT3RELE9BQU8sU0FBU0MsaUJBQWlCQSxDQUMvQkMsS0FBcUIsRUFDckJDLE1BQThDLEVBQzlDO0VBQ0EsTUFBTUMsU0FBUyxHQUFHO0lBQUUsR0FBR0YsS0FBSyxDQUFDRTtFQUFVLENBQUM7RUFDeEMsTUFBTUMsSUFBSSxHQUFHO0lBQUUsR0FBR0gsS0FBSyxDQUFDRztFQUFLLENBQUM7RUFDOUIsTUFBTUMsYUFBYSxHQUFJQyxHQUFXLElBQUs7SUFDckMsT0FBT0gsU0FBUyxDQUFDRyxHQUFHLENBQUM7SUFDckIsTUFBTUMsUUFBUSxHQUFHO01BQ2YsR0FBR0gsSUFBSSxDQUFDRSxHQUFHLENBQUM7TUFDWkUsU0FBUyxFQUFFLENBQUM7TUFDWkMsV0FBVyxFQUFFO0lBQ2YsQ0FBQztJQUNELE9BQU9GLFFBQVEsQ0FBQ0csS0FBSztJQUNyQk4sSUFBSSxDQUFDRSxHQUFHLENBQUMsR0FBR0MsUUFBUTtFQUN0QixDQUFDO0VBQ0QsSUFBSUwsTUFBTSxDQUFDUyxJQUFJLEtBQUtaLGVBQWUsRUFBRTtJQUNuQ00sYUFBYSxDQUFDSCxNQUFNLENBQUNFLElBQUksQ0FBQ0UsR0FBRyxDQUFDO0VBQ2hDLENBQUMsTUFBTTtJQUNMTSxNQUFNLENBQUNDLElBQUksQ0FBQ1YsU0FBUyxDQUFDLENBQUNXLE9BQU8sQ0FBQ1IsR0FBRyxJQUFJO01BQ3BDLElBQUlKLE1BQU0sQ0FBQ2EsT0FBTyxDQUFDVCxHQUFHLENBQUMsRUFBRTtRQUN2QkQsYUFBYSxDQUFDQyxHQUFHLENBQUM7TUFDcEI7SUFDRixDQUFDLENBQUM7RUFDSjtFQUVBLE9BQU87SUFDTCxHQUFHTCxLQUFLO0lBQ1JFLFNBQVM7SUFDVEM7RUFDRixDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setReducer.d.ts","sourceRoot":"","sources":["../../../src/state/reducer/setReducer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setReducer.d.ts","sourceRoot":"","sources":["../../../src/state/reducer/setReducer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EACrB,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,UAAU,EAAE,UAAU,kBA6FvB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalize } from '@data-client/normalizr';
|
|
2
2
|
import { OPTIMISTIC_TYPE } from '../../actionTypes.js';
|
|
3
|
+
import AbortOptimistic from '../../controller/AbortOptimistic.js';
|
|
3
4
|
export function setReducer(state, action, controller) {
|
|
4
5
|
if (action.error) {
|
|
5
6
|
return reduceError(state, action, action.payload);
|
|
@@ -15,9 +16,8 @@ export function setReducer(state, action, controller) {
|
|
|
15
16
|
// compute optimistic response based on current state
|
|
16
17
|
payload = action.endpoint.getOptimisticResponse.call(action.endpoint, controller.snapshot(state, action.meta.fetchedAt), ...action.meta.args);
|
|
17
18
|
} catch (e) {
|
|
18
|
-
var _e$constructor;
|
|
19
19
|
// AbortOptimistic means 'do nothing', otherwise we count the exception as endpoint failure
|
|
20
|
-
if (
|
|
20
|
+
if (e.constructor === AbortOptimistic) {
|
|
21
21
|
return state;
|
|
22
22
|
}
|
|
23
23
|
throw e;
|
|
@@ -31,15 +31,15 @@ export function setReducer(state, action, controller) {
|
|
|
31
31
|
indexes,
|
|
32
32
|
entityMeta
|
|
33
33
|
} = normalize(payload, action.endpoint.schema, action.meta.args, state.entities, state.indexes, state.entityMeta, action.meta);
|
|
34
|
-
const
|
|
35
|
-
...state.
|
|
34
|
+
const endpoints = {
|
|
35
|
+
...state.endpoints,
|
|
36
36
|
[action.meta.key]: result
|
|
37
37
|
};
|
|
38
38
|
try {
|
|
39
39
|
if (action.endpoint.update) {
|
|
40
40
|
const updaters = action.endpoint.update(result, ...action.meta.args);
|
|
41
41
|
Object.keys(updaters).forEach(key => {
|
|
42
|
-
|
|
42
|
+
endpoints[key] = updaters[key](endpoints[key]);
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
// no reason to completely fail because of user-code error
|
|
@@ -51,7 +51,7 @@ export function setReducer(state, action, controller) {
|
|
|
51
51
|
return {
|
|
52
52
|
entities,
|
|
53
53
|
indexes,
|
|
54
|
-
|
|
54
|
+
endpoints,
|
|
55
55
|
entityMeta,
|
|
56
56
|
meta: {
|
|
57
57
|
...state.meta,
|
|
@@ -64,7 +64,7 @@ export function setReducer(state, action, controller) {
|
|
|
64
64
|
optimistic: filterOptimistic(state, action),
|
|
65
65
|
lastReset: state.lastReset
|
|
66
66
|
};
|
|
67
|
-
// reducer must update the state, so in case of processing errors we simply compute the
|
|
67
|
+
// reducer must update the state, so in case of processing errors we simply compute the endpoints inline
|
|
68
68
|
} catch (error) {
|
|
69
69
|
if (typeof error === 'object') {
|
|
70
70
|
error.message = `Error processing ${action.meta.key}\n\nFull Schema: ${JSON.stringify(action.endpoint.schema, undefined, 2)}\n\nError:\n${error.message}`;
|
|
@@ -108,4 +108,4 @@ function reduceError(state, action, error) {
|
|
|
108
108
|
function filterOptimistic(state, resolvingAction) {
|
|
109
109
|
return state.optimistic.filter(optimisticAction => optimisticAction.meta.key !== resolvingAction.meta.key || (optimisticAction.type === OPTIMISTIC_TYPE ? optimisticAction.meta.fetchedAt !== resolvingAction.meta.fetchedAt : optimisticAction.meta.date > resolvingAction.meta.date));
|
|
110
110
|
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemUiLCJPUFRJTUlTVElDX1RZUEUiLCJzZXRSZWR1Y2VyIiwic3RhdGUiLCJhY3Rpb24iLCJjb250cm9sbGVyIiwiZXJyb3IiLCJyZWR1Y2VFcnJvciIsInBheWxvYWQiLCJfc3RhdGUkbWV0YSRhY3Rpb24kbWUiLCJ0eXBlIiwiZW5kcG9pbnQiLCJnZXRPcHRpbWlzdGljUmVzcG9uc2UiLCJjYWxsIiwic25hcHNob3QiLCJtZXRhIiwiZmV0Y2hlZEF0IiwiYXJncyIsImUiLCJfZSRjb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsInJlc3VsdCIsImVudGl0aWVzIiwiaW5kZXhlcyIsImVudGl0eU1ldGEiLCJzY2hlbWEiLCJyZXN1bHRzIiwia2V5IiwidXBkYXRlIiwidXBkYXRlcnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImNvbnNvbGUiLCJkYXRlIiwiZXhwaXJlc0F0IiwicHJldkV4cGlyZXNBdCIsIm9wdGltaXN0aWMiLCJmaWx0ZXJPcHRpbWlzdGljIiwibGFzdFJlc2V0IiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJzdGF0dXMiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJlcnJvclBvbGljeSIsInJlc29sdmluZ0FjdGlvbiIsImZpbHRlciIsIm9wdGltaXN0aWNBY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RhdGUvcmVkdWNlci9zZXRSZWR1Y2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vcm1hbGl6ZSB9IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuXG5pbXBvcnQgeyBPUFRJTUlTVElDX1RZUEUgfSBmcm9tICcuLi8uLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gJy4uLy4uL2NvbnRyb2xsZXIvQ29udHJvbGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTZXRBY3Rpb24sIE9wdGltaXN0aWNBY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZWR1Y2VyKFxuICBzdGF0ZTogU3RhdGU8dW5rbm93bj4sXG4gIGFjdGlvbjogT3B0aW1pc3RpY0FjdGlvbiB8IFNldEFjdGlvbixcbiAgY29udHJvbGxlcjogQ29udHJvbGxlcixcbikge1xuICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgcmV0dXJuIHJlZHVjZUVycm9yKHN0YXRlLCBhY3Rpb24sIGFjdGlvbi5wYXlsb2FkKTtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwYXlsb2FkOiBhbnk7XG4gICAgLy8gZm9yIHRydWUgc2V0J3MgcGF5bG9hZCBpcyBjb250YWluZWQgaW4gYWN0aW9uXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBPUFRJTUlTVElDX1RZUEUpIHtcbiAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgaWYgKCFhY3Rpb24uZW5kcG9pbnQuZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlKSByZXR1cm4gc3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBjb21wdXRlIG9wdGltaXN0aWMgcmVzcG9uc2UgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgICAgICBwYXlsb2FkID0gYWN0aW9uLmVuZHBvaW50LmdldE9wdGltaXN0aWNSZXNwb25zZS5jYWxsKFxuICAgICAgICAgIGFjdGlvbi5lbmRwb2ludCxcbiAgICAgICAgICBjb250cm9sbGVyLnNuYXBzaG90KHN0YXRlLCBhY3Rpb24ubWV0YS5mZXRjaGVkQXQpLFxuICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLmFyZ3MsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgLy8gQWJvcnRPcHRpbWlzdGljIG1lYW5zICdkbyBub3RoaW5nJywgb3RoZXJ3aXNlIHdlIGNvdW50IHRoZSBleGNlcHRpb24gYXMgZW5kcG9pbnQgZmFpbHVyZVxuICAgICAgICBpZiAoZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0Fib3J0T3B0aW1pc3RpYycpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF5bG9hZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc3VsdCwgZW50aXRpZXMsIGluZGV4ZXMsIGVudGl0eU1ldGEgfSA9IG5vcm1hbGl6ZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBhY3Rpb24uZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgYWN0aW9uLm1ldGEuYXJncyBhcyBhbnksXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICBzdGF0ZS5lbnRpdHlNZXRhLFxuICAgICAgYWN0aW9uLm1ldGEsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgLi4uc3RhdGUucmVzdWx0cyxcbiAgICAgIFthY3Rpb24ubWV0YS5rZXldOiByZXN1bHQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGlvbi5lbmRwb2ludC51cGRhdGUpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlcnMgPSBhY3Rpb24uZW5kcG9pbnQudXBkYXRlKHJlc3VsdCwgLi4uYWN0aW9uLm1ldGEuYXJncyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgcmVzdWx0c1trZXldID0gdXBkYXRlcnNba2V5XShyZXN1bHRzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIG5vIHJlYXNvbiB0byBjb21wbGV0ZWx5IGZhaWwgYmVjYXVzZSBvZiB1c2VyLWNvZGUgZXJyb3JcbiAgICAgIC8vIGludGVncml0eSBvZiB0aGlzIHN0YXRlIHVwZGF0ZSBpcyBzdGlsbCBndWFyYW50ZWVkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgZHVyaW5nIEVuZHBvaW50LnVwZGF0ZSgpIGZvciAke2FjdGlvbi5tZXRhLmtleX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZW50aXRpZXMsXG4gICAgICBpbmRleGVzLFxuICAgICAgcmVzdWx0cyxcbiAgICAgIGVudGl0eU1ldGEsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLnN0YXRlLm1ldGEsXG4gICAgICAgIFthY3Rpb24ubWV0YS5rZXldOiB7XG4gICAgICAgICAgZGF0ZTogYWN0aW9uLm1ldGEuZGF0ZSxcbiAgICAgICAgICBleHBpcmVzQXQ6IGFjdGlvbi5tZXRhLmV4cGlyZXNBdCxcbiAgICAgICAgICBwcmV2RXhwaXJlc0F0OiBzdGF0ZS5tZXRhW2FjdGlvbi5tZXRhLmtleV0/LmV4cGlyZXNBdCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcHRpbWlzdGljOiBmaWx0ZXJPcHRpbWlzdGljKHN0YXRlLCBhY3Rpb24pLFxuICAgICAgbGFzdFJlc2V0OiBzdGF0ZS5sYXN0UmVzZXQsXG4gICAgfTtcbiAgICAvLyByZWR1Y2VyIG11c3QgdXBkYXRlIHRoZSBzdGF0ZSwgc28gaW4gY2FzZSBvZiBwcm9jZXNzaW5nIGVycm9ycyB3ZSBzaW1wbHkgY29tcHV0ZSB0aGUgcmVzdWx0cyBpbmxpbmVcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvci5tZXNzYWdlID0gYEVycm9yIHByb2Nlc3NpbmcgJHtcbiAgICAgICAgYWN0aW9uLm1ldGEua2V5XG4gICAgICB9XFxuXFxuRnVsbCBTY2hlbWE6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGFjdGlvbi5lbmRwb2ludC5zY2hlbWEsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgMixcbiAgICAgICl9XFxuXFxuRXJyb3I6XFxuJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAoJ3BheWxvYWQnIGluIGFjdGlvbikgZXJyb3IucGF5bG9hZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gNDAwO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgbm90IGFsd2F5cyBidWJibGVkIHVwLCBzbyBsZXQncyBkb3VibGUgc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBzaWxlbnRseVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlRXJyb3Ioc3RhdGUsIGFjdGlvbiwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUVycm9yKFxuICBzdGF0ZTogU3RhdGU8dW5rbm93bj4sXG4gIGFjdGlvbjogU2V0QWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbiAgZXJyb3I6IGFueSxcbik6IFN0YXRlPHVua25vd24+IHtcbiAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgIC8vIEluIGNhc2Ugd2UgYWJvcnQgc2ltcGx5IHVuZG8gdGhlIG9wdGltaXN0aWMgdXBkYXRlIGFuZCBhY3QgbGlrZSBubyBmZXRjaCBldmVuIG9jY3VyZWRcbiAgICAvLyBXZSBzdGlsbCB3YW50IHRob3NlIHdhdGNoaW5nIHByb21pc2VzIGZyb20gZmV0Y2ggZGlyZWN0bHkgdG8gb2JzZXJ2ZWQgdGhlIGFib3J0LCBidXQgd2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIFRyaWdnZXIgZXJyb3JzIGluIHRoaXMgY2FzZS4gVGhpcyBtZWFucyB0aGVvcmV0aWNhbGx5IGltcHJvcGVybHkgYnVpbHQgYWJvcnRlcyB1c2VSZXNvdXJjZSgpIGNvdWxkIHN1c3BlbmQgZm9yZXZlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvcHRpbWlzdGljOiBmaWx0ZXJPcHRpbWlzdGljKHN0YXRlLCBhY3Rpb24pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtZXRhOiB7XG4gICAgICAuLi5zdGF0ZS5tZXRhLFxuICAgICAgW2FjdGlvbi5tZXRhLmtleV06IHtcbiAgICAgICAgZGF0ZTogYWN0aW9uLm1ldGEuZGF0ZSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGV4cGlyZXNBdDogYWN0aW9uLm1ldGEuZXhwaXJlc0F0LFxuICAgICAgICBlcnJvclBvbGljeTogYWN0aW9uLmVuZHBvaW50LmVycm9yUG9saWN5Py4oZXJyb3IpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wdGltaXN0aWM6IGZpbHRlck9wdGltaXN0aWMoc3RhdGUsIGFjdGlvbiksXG4gIH07XG59XG4vKiogRmlsdGVyIGFsbCByZXF1ZXN0cyB3aXRoIHNhbWUgc2VyaWFsaXphdGlvbiB0aGF0IGRpZCBub3Qgc3RhcnQgYWZ0ZXIgdGhlIHJlc29sdmluZyByZXF1ZXN0ICovXG5mdW5jdGlvbiBmaWx0ZXJPcHRpbWlzdGljKFxuICBzdGF0ZTogU3RhdGU8dW5rbm93bj4sXG4gIHJlc29sdmluZ0FjdGlvbjogU2V0QWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbikge1xuICByZXR1cm4gc3RhdGUub3B0aW1pc3RpYy5maWx0ZXIoXG4gICAgb3B0aW1pc3RpY0FjdGlvbiA9PlxuICAgICAgb3B0aW1pc3RpY0FjdGlvbi5tZXRhLmtleSAhPT0gcmVzb2x2aW5nQWN0aW9uLm1ldGEua2V5IHx8XG4gICAgICAob3B0aW1pc3RpY0FjdGlvbi50eXBlID09PSBPUFRJTUlTVElDX1RZUEUgP1xuICAgICAgICBvcHRpbWlzdGljQWN0aW9uLm1ldGEuZmV0Y2hlZEF0ICE9PSByZXNvbHZpbmdBY3Rpb24ubWV0YS5mZXRjaGVkQXRcbiAgICAgIDogb3B0aW1pc3RpY0FjdGlvbi5tZXRhLmRhdGUgPiByZXNvbHZpbmdBY3Rpb24ubWV0YS5kYXRlKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUFRLHdCQUF3QjtBQUVsRCxTQUFTQyxlQUFlLFFBQVEsc0JBQXNCO0FBSXRELE9BQU8sU0FBU0MsVUFBVUEsQ0FDeEJDLEtBQXFCLEVBQ3JCQyxNQUFvQyxFQUNwQ0MsVUFBc0IsRUFDdEI7RUFDQSxJQUFJRCxNQUFNLENBQUNFLEtBQUssRUFBRTtJQUNoQixPQUFPQyxXQUFXLENBQUNKLEtBQUssRUFBRUMsTUFBTSxFQUFFQSxNQUFNLENBQUNJLE9BQU8sQ0FBQztFQUNuRDtFQUNBLElBQUk7SUFBQSxJQUFBQyxxQkFBQTtJQUNGLElBQUlELE9BQVk7SUFDaEI7SUFDQSxJQUFJSixNQUFNLENBQUNNLElBQUksS0FBS1QsZUFBZSxFQUFFO01BQ25DO01BQ0EsSUFBSSxDQUFDRyxNQUFNLENBQUNPLFFBQVEsQ0FBQ0MscUJBQXFCLEVBQUUsT0FBT1QsS0FBSztNQUN4RCxJQUFJO1FBQ0Y7UUFDQUssT0FBTyxHQUFHSixNQUFNLENBQUNPLFFBQVEsQ0FBQ0MscUJBQXFCLENBQUNDLElBQUksQ0FDbERULE1BQU0sQ0FBQ08sUUFBUSxFQUNmTixVQUFVLENBQUNTLFFBQVEsQ0FBQ1gsS0FBSyxFQUFFQyxNQUFNLENBQUNXLElBQUksQ0FBQ0MsU0FBUyxDQUFDLEVBQ2pELEdBQUdaLE1BQU0sQ0FBQ1csSUFBSSxDQUFDRSxJQUNqQixDQUFDO01BQ0gsQ0FBQyxDQUFDLE9BQU9DLENBQU0sRUFBRTtRQUFBLElBQUFDLGNBQUE7UUFDZjtRQUNBLElBQUksRUFBQUEsY0FBQSxHQUFBRCxDQUFDLENBQUNFLFdBQVcscUJBQWJELGNBQUEsQ0FBZUUsSUFBSSxNQUFLLGlCQUFpQixFQUFFO1VBQzdDLE9BQU9sQixLQUFLO1FBQ2Q7UUFDQSxNQUFNZSxDQUFDO01BQ1Q7SUFDRixDQUFDLE1BQU07TUFDTFYsT0FBTyxHQUFHSixNQUFNLENB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
|
|
111
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemUiLCJPUFRJTUlTVElDX1RZUEUiLCJBYm9ydE9wdGltaXN0aWMiLCJzZXRSZWR1Y2VyIiwic3RhdGUiLCJhY3Rpb24iLCJjb250cm9sbGVyIiwiZXJyb3IiLCJyZWR1Y2VFcnJvciIsInBheWxvYWQiLCJfc3RhdGUkbWV0YSRhY3Rpb24kbWUiLCJ0eXBlIiwiZW5kcG9pbnQiLCJnZXRPcHRpbWlzdGljUmVzcG9uc2UiLCJjYWxsIiwic25hcHNob3QiLCJtZXRhIiwiZmV0Y2hlZEF0IiwiYXJncyIsImUiLCJjb25zdHJ1Y3RvciIsInJlc3VsdCIsImVudGl0aWVzIiwiaW5kZXhlcyIsImVudGl0eU1ldGEiLCJzY2hlbWEiLCJlbmRwb2ludHMiLCJrZXkiLCJ1cGRhdGUiLCJ1cGRhdGVycyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiY29uc29sZSIsImRhdGUiLCJleHBpcmVzQXQiLCJwcmV2RXhwaXJlc0F0Iiwib3B0aW1pc3RpYyIsImZpbHRlck9wdGltaXN0aWMiLCJsYXN0UmVzZXQiLCJtZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsInN0YXR1cyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIm5hbWUiLCJlcnJvclBvbGljeSIsInJlc29sdmluZ0FjdGlvbiIsImZpbHRlciIsIm9wdGltaXN0aWNBY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RhdGUvcmVkdWNlci9zZXRSZWR1Y2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vcm1hbGl6ZSB9IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuXG5pbXBvcnQgeyBPUFRJTUlTVElDX1RZUEUgfSBmcm9tICcuLi8uLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgQWJvcnRPcHRpbWlzdGljIGZyb20gJy4uLy4uL2NvbnRyb2xsZXIvQWJvcnRPcHRpbWlzdGljLmpzJztcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhdGUsIFNldEFjdGlvbiwgT3B0aW1pc3RpY0FjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlZHVjZXIoXG4gIHN0YXRlOiBTdGF0ZTx1bmtub3duPixcbiAgYWN0aW9uOiBPcHRpbWlzdGljQWN0aW9uIHwgU2V0QWN0aW9uLFxuICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuKSB7XG4gIGlmIChhY3Rpb24uZXJyb3IpIHtcbiAgICByZXR1cm4gcmVkdWNlRXJyb3Ioc3RhdGUsIGFjdGlvbiwgYWN0aW9uLnBheWxvYWQpO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHBheWxvYWQ6IGFueTtcbiAgICAvLyBmb3IgdHJ1ZSBzZXQncyBwYXlsb2FkIGlzIGNvbnRhaW5lZCBpbiBhY3Rpb25cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IE9QVElNSVNUSUNfVFlQRSkge1xuICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4gICAgICBpZiAoIWFjdGlvbi5lbmRwb2ludC5nZXRPcHRpbWlzdGljUmVzcG9uc2UpIHJldHVybiBzdGF0ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbXB1dGUgb3B0aW1pc3RpYyByZXNwb25zZSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAgICAgIHBheWxvYWQgPSBhY3Rpb24uZW5kcG9pbnQuZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlLmNhbGwoXG4gICAgICAgICAgYWN0aW9uLmVuZHBvaW50LFxuICAgICAgICAgIGNvbnRyb2xsZXIuc25hcHNob3Qoc3RhdGUsIGFjdGlvbi5tZXRhLmZldGNoZWRBdCksXG4gICAgICAgICAgLi4uYWN0aW9uLm1ldGEuYXJncyxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBBYm9ydE9wdGltaXN0aWMgbWVhbnMgJ2RvIG5vdGhpbmcnLCBvdGhlcndpc2Ugd2UgY291bnQgdGhlIGV4Y2VwdGlvbiBhcyBlbmRwb2ludCBmYWlsdXJlXG4gICAgICAgIGlmIChlLmNvbnN0cnVjdG9yID09PSBBYm9ydE9wdGltaXN0aWMpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF5bG9hZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc3VsdCwgZW50aXRpZXMsIGluZGV4ZXMsIGVudGl0eU1ldGEgfSA9IG5vcm1hbGl6ZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBhY3Rpb24uZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgYWN0aW9uLm1ldGEuYXJncyBhcyBhbnksXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICBzdGF0ZS5lbnRpdHlNZXRhLFxuICAgICAgYWN0aW9uLm1ldGEsXG4gICAgKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB7XG4gICAgICAuLi5zdGF0ZS5lbmRwb2ludHMsXG4gICAgICBbYWN0aW9uLm1ldGEua2V5XTogcmVzdWx0LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQudXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXJzID0gYWN0aW9uLmVuZHBvaW50LnVwZGF0ZShyZXN1bHQsIC4uLmFjdGlvbi5tZXRhLmFyZ3MpO1xuICAgICAgICBPYmplY3Qua2V5cyh1cGRhdGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGVuZHBvaW50c1trZXldID0gdXBkYXRlcnNba2V5XShlbmRwb2ludHNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gbm8gcmVhc29uIHRvIGNvbXBsZXRlbHkgZmFpbCBiZWNhdXNlIG9mIHVzZXItY29kZSBlcnJvclxuICAgICAgLy8gaW50ZWdyaXR5IG9mIHRoaXMgc3RhdGUgdXBkYXRlIGlzIHN0aWxsIGd1YXJhbnRlZWRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJlZCBkdXJpbmcgRW5kcG9pbnQudXBkYXRlKCkgZm9yICR7YWN0aW9uLm1ldGEua2V5fWAsXG4gICAgICApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBlbnRpdGllcyxcbiAgICAgIGluZGV4ZXMsXG4gICAgICBlbmRwb2ludHMsXG4gICAgICBlbnRpdHlNZXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5zdGF0ZS5tZXRhLFxuICAgICAgICBbYWN0aW9uLm1ldGEua2V5XToge1xuICAgICAgICAgIGRhdGU6IGFjdGlvbi5tZXRhLmRhdGUsXG4gICAgICAgICAgZXhwaXJlc0F0OiBhY3Rpb24ubWV0YS5leHBpcmVzQXQsXG4gICAgICAgICAgcHJldkV4cGlyZXNBdDogc3RhdGUubWV0YVthY3Rpb24ubWV0YS5rZXldPy5leHBpcmVzQXQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3B0aW1pc3RpYzogZmlsdGVyT3B0aW1pc3RpYyhzdGF0ZSwgYWN0aW9uKSxcbiAgICAgIGxhc3RSZXNldDogc3RhdGUubGFzdFJlc2V0LFxuICAgIH07XG4gICAgLy8gcmVkdWNlciBtdXN0IHVwZGF0ZSB0aGUgc3RhdGUsIHNvIGluIGNhc2Ugb2YgcHJvY2Vzc2luZyBlcnJvcnMgd2Ugc2ltcGx5IGNvbXB1dGUgdGhlIGVuZHBvaW50cyBpbmxpbmVcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvci5tZXNzYWdlID0gYEVycm9yIHByb2Nlc3NpbmcgJHtcbiAgICAgICAgYWN0aW9uLm1ldGEua2V5XG4gICAgICB9XFxuXFxuRnVsbCBTY2hlbWE6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGFjdGlvbi5lbmRwb2ludC5zY2hlbWEsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgMixcbiAgICAgICl9XFxuXFxuRXJyb3I6XFxuJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAoJ3BheWxvYWQnIGluIGFjdGlvbikgZXJyb3IucGF5bG9hZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gNDAwO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgbm90IGFsd2F5cyBidWJibGVkIHVwLCBzbyBsZXQncyBkb3VibGUgc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBzaWxlbnRseVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlRXJyb3Ioc3RhdGUsIGFjdGlvbiwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUVycm9yKFxuICBzdGF0ZTogU3RhdGU8dW5rbm93bj4sXG4gIGFjdGlvbjogU2V0QWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbiAgZXJyb3I6IGFueSxcbik6IFN0YXRlPHVua25vd24+IHtcbiAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgIC8vIEluIGNhc2Ugd2UgYWJvcnQgc2ltcGx5IHVuZG8gdGhlIG9wdGltaXN0aWMgdXBkYXRlIGFuZCBhY3QgbGlrZSBubyBmZXRjaCBldmVuIG9jY3VyZWRcbiAgICAvLyBXZSBzdGlsbCB3YW50IHRob3NlIHdhdGNoaW5nIHByb21pc2VzIGZyb20gZmV0Y2ggZGlyZWN0bHkgdG8gb2JzZXJ2ZWQgdGhlIGFib3J0LCBidXQgd2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIFRyaWdnZXIgZXJyb3JzIGluIHRoaXMgY2FzZS4gVGhpcyBtZWFucyB0aGVvcmV0aWNhbGx5IGltcHJvcGVybHkgYnVpbHQgYWJvcnRlcyB1c2VSZXNvdXJjZSgpIGNvdWxkIHN1c3BlbmQgZm9yZXZlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvcHRpbWlzdGljOiBmaWx0ZXJPcHRpbWlzdGljKHN0YXRlLCBhY3Rpb24pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtZXRhOiB7XG4gICAgICAuLi5zdGF0ZS5tZXRhLFxuICAgICAgW2FjdGlvbi5tZXRhLmtleV06IHtcbiAgICAgICAgZGF0ZTogYWN0aW9uLm1ldGEuZGF0ZSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGV4cGlyZXNBdDogYWN0aW9uLm1ldGEuZXhwaXJlc0F0LFxuICAgICAgICBlcnJvclBvbGljeTogYWN0aW9uLmVuZHBvaW50LmVycm9yUG9saWN5Py4oZXJyb3IpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wdGltaXN0aWM6IGZpbHRlck9wdGltaXN0aWMoc3RhdGUsIGFjdGlvbiksXG4gIH07XG59XG4vKiogRmlsdGVyIGFsbCByZXF1ZXN0cyB3aXRoIHNhbWUgc2VyaWFsaXphdGlvbiB0aGF0IGRpZCBub3Qgc3RhcnQgYWZ0ZXIgdGhlIHJlc29sdmluZyByZXF1ZXN0ICovXG5mdW5jdGlvbiBmaWx0ZXJPcHRpbWlzdGljKFxuICBzdGF0ZTogU3RhdGU8dW5rbm93bj4sXG4gIHJlc29sdmluZ0FjdGlvbjogU2V0QWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbikge1xuICByZXR1cm4gc3RhdGUub3B0aW1pc3RpYy5maWx0ZXIoXG4gICAgb3B0aW1pc3RpY0FjdGlvbiA9PlxuICAgICAgb3B0aW1pc3RpY0FjdGlvbi5tZXRhLmtleSAhPT0gcmVzb2x2aW5nQWN0aW9uLm1ldGEua2V5IHx8XG4gICAgICAob3B0aW1pc3RpY0FjdGlvbi50eXBlID09PSBPUFRJTUlTVElDX1RZUEUgP1xuICAgICAgICBvcHRpbWlzdGljQWN0aW9uLm1ldGEuZmV0Y2hlZEF0ICE9PSByZXNvbHZpbmdBY3Rpb24ubWV0YS5mZXRjaGVkQXRcbiAgICAgIDogb3B0aW1pc3RpY0FjdGlvbi5tZXRhLmRhdGUgPiByZXNvbHZpbmdBY3Rpb24ubWV0YS5kYXRlKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUFRLHdCQUF3QjtBQUVsRCxTQUFTQyxlQUFlLFFBQVEsc0JBQXNCO0FBQ3RELE9BQU9DLGVBQWUsTUFBTSxxQ0FBcUM7QUFJakUsT0FBTyxTQUFTQyxVQUFVQSxDQUN4QkMsS0FBcUIsRUFDckJDLE1BQW9DLEVBQ3BDQyxVQUFzQixFQUN0QjtFQUNBLElBQUlELE1BQU0sQ0FBQ0UsS0FBSyxFQUFFO0lBQ2hCLE9BQU9DLFdBQVcsQ0FBQ0osS0FBSyxFQUFFQyxNQUFNLEVBQUVBLE1BQU0sQ0FBQ0ksT0FBTyxDQUFDO0VBQ25EO0VBQ0EsSUFBSTtJQUFBLElBQUFDLHFCQUFBO0lBQ0YsSUFBSUQsT0FBWTtJQUNoQjtJQUNBLElBQUlKLE1BQU0sQ0FBQ00sSUFBSSxLQUFLVixlQUFlLEVBQUU7TUFDbkM7TUFDQSxJQUFJLENBQUNJLE1BQU0sQ0FBQ08sUUFBUSxDQUFDQyxxQkFBcUIsRUFBRSxPQUFPVCxLQUFLO01BQ3hELElBQUk7UUFDRjtRQUNBSyxPQUFPLEdBQUdKLE1BQU0sQ0FBQ08sUUFBUSxDQUFDQyxxQkFBcUIsQ0FBQ0MsSUFBSSxDQUNsRFQsTUFBTSxDQUFDTyxRQUFRLEVBQ2ZOLFVBQVUsQ0FBQ1MsUUFBUSxDQUFDWCxLQUFLLEVBQUVDLE1BQU0sQ0FBQ1csSUFBSSxDQUFDQyxTQUFTLENBQUMsRUFDakQsR0FBR1osTUFBTSxDQUFDVyxJQUFJLENBQUNFLElBQ2pCLENBQUM7TUFDSCxDQUFDLENBQUMsT0FBT0MsQ0FBTSxFQUFFO1FBQ2Y7UUFDQSxJQUFJQSxDQUFDLENBQUNDLFdBQVcsS0FBS2xCLGVBQWUsRUFBRTtVQUNyQyxPQUFPRSxLQUFLO1FBQ2Q7UUFDQSxNQUFNZSxD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QUFFO01BQ3pDZCxPQUFPLENBQUMxQixLQUFLLENBQUNBLEtBQUssQ0FBQztJQUN0QjtJQUNBLE9BQU9DLFdBQVcsQ0FBQ0osS0FBSyxFQUFFQyxNQUFNLEVBQUVFLEtBQUssQ0FBQztFQUMxQztBQUNGO0FBRUEsU0FBU0MsV0FBV0EsQ0FDbEJKLEtBQXFCLEVBQ3JCQyxNQUFvQyxFQUNwQ0UsS0FBVSxFQUNNO0VBQ2hCLElBQUlBLEtBQUssQ0FBQ3lDLElBQUksS0FBSyxZQUFZLEVBQUU7SUFDL0I7SUFDQTtJQUNBO0lBQ0EsT0FBTztNQUNMLEdBQUc1QyxLQUFLO01BQ1JpQyxVQUFVLEVBQUVDLGdCQUFnQixDQUFDbEMsS0FBSyxFQUFFQyxNQUFNO0lBQzVDLENBQUM7RUFDSDtFQUNBLE9BQU87SUFDTCxHQUFHRCxLQUFLO0lBQ1JZLElBQUksRUFBRTtNQUNKLEdBQUdaLEtBQUssQ0FBQ1ksSUFBSTtNQUNiLENBQUNYLE1BQU0sQ0FBQ1csSUFBSSxDQUFDVyxHQUFHLEdBQUc7UUFDakJPLElBQUksRUFBRTdCLE1BQU0sQ0FBQ1csSUFBSSxDQUFDa0IsSUFBSTtRQUN0QjNCLEtBQUs7UUFDTDRCLFNBQVMsRUFBRTlCLE1BQU0sQ0FBQ1csSUFBSSxDQUFDbUIsU0FBUztRQUNoQ2MsV0FBVyxFQUFFNUMsTUFBTSxDQUFDTyxRQUFRLENBQUNxQyxXQUFXLG9CQUEzQjVDLE1BQU0sQ0FBQ08sUUFBUSxDQUFDcUMsV0FBVyxDQUFHMUMsS0FBSztNQUNsRDtJQUNGLENBQUM7SUFDRDhCLFVBQVUsRUFBRUMsZ0JBQWdCLENBQUNsQyxLQUFLLEVBQUVDLE1BQU07RUFDNUMsQ0FBQztBQUNIO0FBQ0E7QUFDQSxTQUFTaUMsZ0JBQWdCQSxDQUN2QmxDLEtBQXFCLEVBQ3JCOEMsZUFBNkMsRUFDN0M7RUFDQSxPQUFPOUMsS0FBSyxDQUFDaUMsVUFBVSxDQUFDYyxNQUFNLENBQzVCQyxnQkFBZ0IsSUFDZEEsZ0JBQWdCLENBQUNwQyxJQUFJLENBQUNXLEdBQUcsS0FBS3VCLGVBQWUsQ0FBQ2xDLElBQUksQ0FBQ1csR0FBRyxLQUNyRHlCLGdCQUFnQixDQUFDekMsSUFBSSxLQUFLVixlQUFlLEdBQ3hDbUQsZ0JBQWdCLENBQUNwQyxJQUFJLENBQUNDLFNBQVMsS0FBS2lDLGVBQWUsQ0FBQ2xDLElBQUksQ0FBQ0MsU0FBUyxHQUNsRW1DLGdCQUFnQixDQUFDcEMsSUFBSSxDQUFDa0IsSUFBSSxHQUFHZ0IsZUFBZSxDQUFDbEMsSUFBSSxDQUFDa0IsSUFBSSxDQUM1RCxDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=
|
package/lib/state/selectMeta.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export default function selectMeta(state, fetchKey) {
|
|
2
2
|
return state.meta[fetchKey];
|
|
3
3
|
}
|
|
4
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzZWxlY3RNZXRhIiwic3RhdGUiLCJmZXRjaEtleSIsIm1ldGEiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGUvc2VsZWN0TWV0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWxlY3RNZXRhPFIgPSBhbnk+
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzZWxlY3RNZXRhIiwic3RhdGUiLCJmZXRjaEtleSIsIm1ldGEiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGUvc2VsZWN0TWV0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWxlY3RNZXRhPFIgPSBhbnk+KFxuICBzdGF0ZTogU3RhdGU8Uj4sXG4gIGZldGNoS2V5OiBzdHJpbmcsXG4pOiBTdGF0ZTxSPlsnbWV0YSddW3N0cmluZ10ge1xuICByZXR1cm4gc3RhdGUubWV0YVtmZXRjaEtleV07XG59XG4iXSwibWFwcGluZ3MiOiJBQUVBLGVBQWUsU0FBU0EsVUFBVUEsQ0FDaENDLEtBQWUsRUFDZkMsUUFBZ0IsRUFDVTtFQUMxQixPQUFPRCxLQUFLLENBQUNFLElBQUksQ0FBQ0QsUUFBUSxDQUFDO0FBQzdCIiwiaWdub3JlTGlzdCI6W119
|
package/lib/types.d.ts
CHANGED
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEhF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC;AAEvC,MAAM,MAAM,EAAE,GAAG,MAAM,CAAC;AAExB,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG;YAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAA;SAAE,GAAG,SAAS,CAAC;KACxE,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEhF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC;AAEvC,MAAM,MAAM,EAAE,GAAG,MAAM,CAAC;AAExB,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG;YAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAA;SAAE,GAAG,SAAS,CAAC;KACxE,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;KACzD,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;YACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;YAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;YAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;YAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;SACpD,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG;YAC5B,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG;gBACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;aAC5B,CAAC;SACH,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,cAAc,cAAc,CAAC;AAE7B,MAAM,WAAW,OAAO,CAAC,OAAO,GAAG,WAAW;IAC5C,aAAa,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;CACpC;AAED,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
|
package/lib/types.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './actions.js';
|
|
2
2
|
export {};
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vcm1hbGl6ZWRJbmRleCB9IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVGdW5jdGlvbixcbiAgQWJzdHJhY3RJbnN0YW5jZVR5cGUsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuaW1wb3J0IHR5cGUgeyBFcnJvclR5cGVzIH0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uVHlwZXMsIFNldEFjdGlvbiwgT3B0aW1pc3RpY0FjdGlvbiB9IGZyb20gJy4vYWN0aW9ucy5qcyc7XG5pbXBvcnQgeyBTRVRfVFlQRSB9IGZyb20gJy4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCwgTWlkZGxld2FyZSwgTWlkZGxld2FyZUFQSSB9IGZyb20gJy4vbWlkZGxld2FyZVR5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBBYnN0cmFjdEluc3RhbmNlVHlwZSwgVXBkYXRlRnVuY3Rpb24gfTtcblxuZXhwb3J0IHR5cGUgU2V0VHlwZXMgPSB0eXBlb2YgU0VUX1RZUEU7XG5cbmV4cG9ydCB0eXBlIFBLID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlPFQ+
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vcm1hbGl6ZWRJbmRleCB9IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVGdW5jdGlvbixcbiAgQWJzdHJhY3RJbnN0YW5jZVR5cGUsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuaW1wb3J0IHR5cGUgeyBFcnJvclR5cGVzIH0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uVHlwZXMsIFNldEFjdGlvbiwgT3B0aW1pc3RpY0FjdGlvbiB9IGZyb20gJy4vYWN0aW9ucy5qcyc7XG5pbXBvcnQgeyBTRVRfVFlQRSB9IGZyb20gJy4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCwgTWlkZGxld2FyZSwgTWlkZGxld2FyZUFQSSB9IGZyb20gJy4vbWlkZGxld2FyZVR5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBBYnN0cmFjdEluc3RhbmNlVHlwZSwgVXBkYXRlRnVuY3Rpb24gfTtcblxuZXhwb3J0IHR5cGUgU2V0VHlwZXMgPSB0eXBlb2YgU0VUX1RZUEU7XG5cbmV4cG9ydCB0eXBlIFBLID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlPFQ+IHtcbiAgcmVhZG9ubHkgZW50aXRpZXM6IHtcbiAgICByZWFkb25seSBbZW50aXR5S2V5OiBzdHJpbmddOiB7IHJlYWRvbmx5IFtwazogc3RyaW5nXTogVCB9IHwgdW5kZWZpbmVkO1xuICB9O1xuICByZWFkb25seSBpbmRleGVzOiBOb3JtYWxpemVkSW5kZXg7XG4gIHJlYWRvbmx5IGVuZHBvaW50czoge1xuICAgIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHVua25vd24gfCBQS1tdIHwgUEsgfCB1bmRlZmluZWQ7XG4gIH07XG4gIHJlYWRvbmx5IG1ldGE6IHtcbiAgICByZWFkb25seSBba2V5OiBzdHJpbmddOiB7XG4gICAgICByZWFkb25seSBkYXRlOiBudW1iZXI7XG4gICAgICByZWFkb25seSBlcnJvcj86IEVycm9yVHlwZXM7XG4gICAgICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIHJlYWRvbmx5IHByZXZFeHBpcmVzQXQ/OiBudW1iZXI7XG4gICAgICByZWFkb25seSBpbnZhbGlkYXRlZD86IGJvb2xlYW47XG4gICAgICByZWFkb25seSBlcnJvclBvbGljeT86ICdoYXJkJyB8ICdzb2Z0JyB8IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9O1xuICByZWFkb25seSBlbnRpdHlNZXRhOiB7XG4gICAgcmVhZG9ubHkgW2VudGl0eUtleTogc3RyaW5nXToge1xuICAgICAgcmVhZG9ubHkgW3BrOiBzdHJpbmddOiB7XG4gICAgICAgIHJlYWRvbmx5IGRhdGU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICByZWFkb25seSBvcHRpbWlzdGljOiAoU2V0QWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbilbXTtcbiAgcmVhZG9ubHkgbGFzdFJlc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9ucy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlcjxBY3Rpb25zID0gQWN0aW9uVHlwZXM+IHtcbiAgZ2V0TWlkZGxld2FyZSgpOiBNaWRkbGV3YXJlPEFjdGlvbnM+O1xuICBjbGVhbnVwKCk6IHZvaWQ7XG4gIGluaXQ/OiAoc3RhdGU6IFN0YXRlPGFueT4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIHsgRGlzcGF0Y2gsIE1pZGRsZXdhcmUsIE1pZGRsZXdhcmVBUEkgfTtcbiJdLCJtYXBwaW5ncyI6IkFBZ0RBLGNBQWMsY0FBYztBQUFDIiwiaWdub3JlTGlzdCI6W119
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@data-client/core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "High performance
|
|
3
|
+
"version": "0.11.4",
|
|
4
|
+
"description": "High performance mutable data framework.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"react-native": "legacy/index.js",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
},
|
|
121
121
|
"dependencies": {
|
|
122
122
|
"@babel/runtime": "^7.17.0",
|
|
123
|
-
"@data-client/normalizr": "^0.
|
|
123
|
+
"@data-client/normalizr": "^0.11.4",
|
|
124
124
|
"flux-standard-action": "^2.1.1"
|
|
125
125
|
},
|
|
126
126
|
"devDependencies": {
|
package/src/actions.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default class AbortOptimistic extends Error {}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
ErrorTypes,
|
|
3
3
|
SnapshotInterface,
|
|
4
|
-
DenormalizeCache,
|
|
5
4
|
Schema,
|
|
6
5
|
Denormalize,
|
|
6
|
+
Queryable,
|
|
7
|
+
SchemaArgs,
|
|
7
8
|
} from '@data-client/normalizr';
|
|
8
9
|
import {
|
|
9
|
-
WeakEntityMap,
|
|
10
10
|
ExpiryStatus,
|
|
11
11
|
EndpointInterface,
|
|
12
12
|
FetchFunction,
|
|
13
13
|
ResolveType,
|
|
14
14
|
DenormalizeNullable,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
EntityPath,
|
|
16
|
+
MemoCache,
|
|
17
17
|
isEntity,
|
|
18
18
|
denormalize,
|
|
19
|
+
validateQueryKey,
|
|
19
20
|
} from '@data-client/normalizr';
|
|
20
|
-
import { inferResults, validateInference } from '@data-client/normalizr';
|
|
21
21
|
|
|
22
|
+
import AbortOptimistic from './AbortOptimistic.js';
|
|
22
23
|
import createExpireAll from './createExpireAll.js';
|
|
23
24
|
import createFetch from './createFetch.js';
|
|
24
25
|
import createInvalidate from './createInvalidate.js';
|
|
@@ -41,7 +42,7 @@ export type DataClientDispatch = (value: ActionTypes) => Promise<void>;
|
|
|
41
42
|
interface ConstructorProps<D extends GenericDispatch = DataClientDispatch> {
|
|
42
43
|
dispatch?: D;
|
|
43
44
|
getState?: () => State<unknown>;
|
|
44
|
-
|
|
45
|
+
memo?: Pick<MemoCache, 'denormalize' | 'query' | 'buildQueryKey'>;
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
const unsetDispatch = (action: unknown): Promise<void> => {
|
|
@@ -77,19 +78,22 @@ export default class Controller<
|
|
|
77
78
|
* @see https://dataclient.io/docs/api/Controller#getState
|
|
78
79
|
*/
|
|
79
80
|
declare readonly getState: () => State<unknown>;
|
|
80
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Singleton to maintain referential equality between calls
|
|
83
|
+
*/
|
|
84
|
+
declare readonly memo: Pick<
|
|
85
|
+
MemoCache,
|
|
86
|
+
'denormalize' | 'query' | 'buildQueryKey'
|
|
87
|
+
>;
|
|
81
88
|
|
|
82
89
|
constructor({
|
|
83
90
|
dispatch = unsetDispatch as any,
|
|
84
91
|
getState = unsetState,
|
|
85
|
-
|
|
86
|
-
entities: {},
|
|
87
|
-
results: {},
|
|
88
|
-
},
|
|
92
|
+
memo = new MemoCache(),
|
|
89
93
|
}: ConstructorProps<D> = {}) {
|
|
90
94
|
this.dispatch = dispatch;
|
|
91
95
|
this.getState = getState;
|
|
92
|
-
this.
|
|
96
|
+
this.memo = memo;
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
/*************** Action Dispatchers ***************/
|
|
@@ -239,7 +243,7 @@ export default class Controller<
|
|
|
239
243
|
args: readonly [...Parameters<E>];
|
|
240
244
|
response: any;
|
|
241
245
|
fetchedAt: number;
|
|
242
|
-
error?: false;
|
|
246
|
+
error?: false | undefined;
|
|
243
247
|
},
|
|
244
248
|
): Promise<void> => {
|
|
245
249
|
return this.dispatch(createSet(endpoint, meta as any));
|
|
@@ -324,9 +328,9 @@ export default class Controller<
|
|
|
324
328
|
const key = endpoint.key(...args);
|
|
325
329
|
|
|
326
330
|
const meta = selectMeta(state, key);
|
|
327
|
-
const
|
|
331
|
+
const error = state.endpoints[key];
|
|
328
332
|
|
|
329
|
-
if (
|
|
333
|
+
if (error !== undefined && meta?.errorPolicy === 'soft') return;
|
|
330
334
|
|
|
331
335
|
return meta?.error as any;
|
|
332
336
|
};
|
|
@@ -335,85 +339,164 @@ export default class Controller<
|
|
|
335
339
|
* Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
|
|
336
340
|
* @see https://dataclient.io/docs/api/Controller#getResponse
|
|
337
341
|
*/
|
|
338
|
-
getResponse
|
|
342
|
+
getResponse<E extends EndpointInterface>(
|
|
343
|
+
endpoint: E,
|
|
344
|
+
...rest: readonly [null, State<unknown>]
|
|
345
|
+
): {
|
|
346
|
+
data: DenormalizeNullable<E['schema']>;
|
|
347
|
+
expiryStatus: ExpiryStatus;
|
|
348
|
+
expiresAt: number;
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
getResponse<E extends EndpointInterface>(
|
|
352
|
+
endpoint: E,
|
|
353
|
+
...rest: readonly [...Parameters<E>, State<unknown>]
|
|
354
|
+
): {
|
|
355
|
+
data: DenormalizeNullable<E['schema']>;
|
|
356
|
+
expiryStatus: ExpiryStatus;
|
|
357
|
+
expiresAt: number;
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
getResponse<
|
|
339
361
|
E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>,
|
|
340
|
-
Args extends readonly [...Parameters<E['key']>] | readonly [null],
|
|
341
362
|
>(
|
|
342
363
|
endpoint: E,
|
|
343
|
-
...rest: [
|
|
364
|
+
...rest: readonly [
|
|
365
|
+
...(readonly [...Parameters<E['key']>] | readonly [null]),
|
|
366
|
+
State<unknown>,
|
|
367
|
+
]
|
|
344
368
|
): {
|
|
345
369
|
data: DenormalizeNullable<E['schema']>;
|
|
346
370
|
expiryStatus: ExpiryStatus;
|
|
347
371
|
expiresAt: number;
|
|
348
|
-
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
getResponse(
|
|
375
|
+
endpoint: EndpointInterface,
|
|
376
|
+
...rest: readonly [...unknown[], State<unknown>]
|
|
377
|
+
): {
|
|
378
|
+
data: unknown;
|
|
379
|
+
expiryStatus: ExpiryStatus;
|
|
380
|
+
expiresAt: number;
|
|
381
|
+
} {
|
|
349
382
|
const state = rest[rest.length - 1] as State<unknown>;
|
|
350
383
|
// this is typescript generics breaking
|
|
351
384
|
const args: any = rest
|
|
352
385
|
.slice(0, rest.length - 1)
|
|
353
|
-
|
|
386
|
+
// handle FormData
|
|
387
|
+
.map(ensurePojo);
|
|
354
388
|
const isActive = args.length !== 1 || args[0] !== null;
|
|
355
389
|
const key = isActive ? endpoint.key(...args) : '';
|
|
356
|
-
const
|
|
390
|
+
const cacheEndpoints = isActive ? state.endpoints[key] : undefined;
|
|
357
391
|
const schema = endpoint.schema;
|
|
358
392
|
const meta = selectMeta(state, key);
|
|
359
393
|
let expiresAt = meta?.expiresAt;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
}
|
|
394
|
+
// if we have no endpoint entry, and our endpoint has a schema - try querying the store
|
|
395
|
+
const shouldQuery = cacheEndpoints === undefined && schema !== undefined;
|
|
396
|
+
|
|
397
|
+
const input =
|
|
398
|
+
shouldQuery ?
|
|
399
|
+
// nothing in endpoints cache, so try querying if we have a schema to do so
|
|
400
|
+
this.memo.buildQueryKey(
|
|
401
|
+
key,
|
|
402
|
+
schema,
|
|
403
|
+
args,
|
|
404
|
+
state.entities as any,
|
|
405
|
+
state.indexes,
|
|
406
|
+
)
|
|
407
|
+
: cacheEndpoints;
|
|
375
408
|
|
|
376
409
|
if (!isActive) {
|
|
410
|
+
// when not active simply return the query input without denormalizing
|
|
377
411
|
return {
|
|
378
|
-
data:
|
|
412
|
+
data: input as any,
|
|
379
413
|
expiryStatus: ExpiryStatus.Valid,
|
|
380
414
|
expiresAt: Infinity,
|
|
381
415
|
};
|
|
382
416
|
}
|
|
383
417
|
|
|
384
|
-
|
|
418
|
+
let isInvalid = false;
|
|
419
|
+
if (shouldQuery) {
|
|
420
|
+
isInvalid = !validateQueryKey(input);
|
|
421
|
+
} else if (!schema || !schemaHasEntity(schema)) {
|
|
385
422
|
return {
|
|
386
|
-
data:
|
|
423
|
+
data: cacheEndpoints,
|
|
387
424
|
expiryStatus:
|
|
388
425
|
meta?.invalidated ? ExpiryStatus.Invalid
|
|
389
|
-
:
|
|
426
|
+
: cacheEndpoints && !endpoint.invalidIfStale ? ExpiryStatus.Valid
|
|
390
427
|
: ExpiryStatus.InvalidIfStale,
|
|
391
428
|
expiresAt: expiresAt || 0,
|
|
392
|
-
} as {
|
|
393
|
-
data: DenormalizeNullable<E['schema']>;
|
|
394
|
-
expiryStatus: ExpiryStatus;
|
|
395
|
-
expiresAt: number;
|
|
396
429
|
};
|
|
397
430
|
}
|
|
398
431
|
|
|
399
|
-
if (!this.globalCache.results[key])
|
|
400
|
-
this.globalCache.results[key] = new WeakEntityMap();
|
|
401
|
-
|
|
402
432
|
// second argument is false if any entities are missing
|
|
403
433
|
// eslint-disable-next-line prefer-const
|
|
404
|
-
const { data, paths } =
|
|
405
|
-
|
|
434
|
+
const { data, paths } = this.memo.denormalize(
|
|
435
|
+
input,
|
|
406
436
|
schema,
|
|
407
437
|
state.entities,
|
|
408
|
-
this.globalCache.entities,
|
|
409
|
-
this.globalCache.results[key],
|
|
410
438
|
args,
|
|
411
|
-
) as { data:
|
|
439
|
+
) as { data: any; paths: EntityPath[] };
|
|
440
|
+
|
|
441
|
+
// note: isInvalid can only be true if shouldQuery is true
|
|
442
|
+
if (!expiresAt && isInvalid) expiresAt = 1;
|
|
443
|
+
|
|
444
|
+
return this.getSchemaResponse(
|
|
445
|
+
data,
|
|
446
|
+
paths,
|
|
447
|
+
state.entityMeta,
|
|
448
|
+
expiresAt,
|
|
449
|
+
endpoint.invalidIfStale || isInvalid,
|
|
450
|
+
meta,
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Queries the store for a Querable schema
|
|
456
|
+
* @see https://dataclient.io/docs/api/Controller#get
|
|
457
|
+
*/
|
|
458
|
+
get<S extends Queryable>(
|
|
459
|
+
schema: S,
|
|
460
|
+
...rest: readonly [
|
|
461
|
+
...SchemaArgs<S>,
|
|
462
|
+
Pick<State<unknown>, 'entities' | 'entityMeta'>,
|
|
463
|
+
]
|
|
464
|
+
): DenormalizeNullable<S> | undefined {
|
|
465
|
+
const state = rest[rest.length - 1] as State<any>;
|
|
466
|
+
// this is typescript generics breaking
|
|
467
|
+
const args: any = rest
|
|
468
|
+
.slice(0, rest.length - 1)
|
|
469
|
+
.map(ensurePojo) as SchemaArgs<S>;
|
|
470
|
+
|
|
471
|
+
// NOTE: different orders can result in cache busting here; but since it's just a perf penalty we will allow for now
|
|
472
|
+
const key = JSON.stringify(args);
|
|
473
|
+
|
|
474
|
+
return this.memo.query(
|
|
475
|
+
key,
|
|
476
|
+
schema,
|
|
477
|
+
args,
|
|
478
|
+
state.entities as any,
|
|
479
|
+
state.indexes,
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
private getSchemaResponse<T>(
|
|
484
|
+
data: T,
|
|
485
|
+
paths: EntityPath[],
|
|
486
|
+
entityMeta: State<unknown>['entityMeta'],
|
|
487
|
+
expiresAt: number,
|
|
488
|
+
invalidIfStale: boolean,
|
|
489
|
+
meta: { error?: unknown; invalidated?: unknown } = {},
|
|
490
|
+
): {
|
|
491
|
+
data: T;
|
|
492
|
+
expiryStatus: ExpiryStatus;
|
|
493
|
+
expiresAt: number;
|
|
494
|
+
} {
|
|
412
495
|
const invalidDenormalize = typeof data === 'symbol';
|
|
413
496
|
|
|
414
497
|
// fallback to entity expiry time
|
|
415
498
|
if (!expiresAt) {
|
|
416
|
-
expiresAt = entityExpiresAt(paths,
|
|
499
|
+
expiresAt = entityExpiresAt(paths, entityMeta);
|
|
417
500
|
}
|
|
418
501
|
|
|
419
502
|
// https://dataclient.io/docs/concepts/expiry-policy#expiry-status
|
|
@@ -422,18 +505,17 @@ export default class Controller<
|
|
|
422
505
|
const expiryStatus =
|
|
423
506
|
meta?.invalidated || (invalidDenormalize && !meta?.error) ?
|
|
424
507
|
ExpiryStatus.Invalid
|
|
425
|
-
: invalidDenormalize ||
|
|
426
|
-
ExpiryStatus.InvalidIfStale
|
|
508
|
+
: invalidDenormalize || invalidIfStale ? ExpiryStatus.InvalidIfStale
|
|
427
509
|
: ExpiryStatus.Valid;
|
|
428
510
|
|
|
429
511
|
return { data, expiryStatus, expiresAt };
|
|
430
|
-
}
|
|
512
|
+
}
|
|
431
513
|
}
|
|
432
514
|
|
|
433
515
|
// benchmark: https://www.measurethat.net/Benchmarks/Show/24691/0/min-reducer-vs-imperative-with-paths
|
|
434
516
|
// earliest expiry dictates age
|
|
435
517
|
function entityExpiresAt(
|
|
436
|
-
paths:
|
|
518
|
+
paths: EntityPath[],
|
|
437
519
|
entityMeta: {
|
|
438
520
|
readonly [entityKey: string]: {
|
|
439
521
|
readonly [pk: string]: {
|
|
@@ -455,7 +537,7 @@ function entityExpiresAt(
|
|
|
455
537
|
|
|
456
538
|
/** Determine whether the schema has any entities.
|
|
457
539
|
*
|
|
458
|
-
* Without entities, denormalization is not needed, and results should not be
|
|
540
|
+
* Without entities, denormalization is not needed, and results should not be queried.
|
|
459
541
|
*/
|
|
460
542
|
function schemaHasEntity(schema: Schema): boolean {
|
|
461
543
|
if (isEntity(schema)) return true;
|
|
@@ -478,6 +560,7 @@ class Snapshot<T = unknown> implements SnapshotInterface {
|
|
|
478
560
|
private state: State<T>;
|
|
479
561
|
private controller: Controller;
|
|
480
562
|
readonly fetchedAt: number;
|
|
563
|
+
readonly abort = new AbortOptimistic();
|
|
481
564
|
|
|
482
565
|
constructor(controller: Controller, state: State<T>, fetchedAt = 0) {
|
|
483
566
|
this.state = state;
|
|
@@ -487,20 +570,48 @@ class Snapshot<T = unknown> implements SnapshotInterface {
|
|
|
487
570
|
|
|
488
571
|
/*************** Data Access ***************/
|
|
489
572
|
/** @see https://dataclient.io/docs/api/Snapshot#getResponse */
|
|
490
|
-
getResponse
|
|
573
|
+
getResponse<E extends EndpointInterface>(
|
|
574
|
+
endpoint: E,
|
|
575
|
+
...args: readonly [null]
|
|
576
|
+
): {
|
|
577
|
+
data: DenormalizeNullable<E['schema']>;
|
|
578
|
+
expiryStatus: ExpiryStatus;
|
|
579
|
+
expiresAt: number;
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
getResponse<E extends EndpointInterface>(
|
|
583
|
+
endpoint: E,
|
|
584
|
+
...args: readonly [...Parameters<E>]
|
|
585
|
+
): {
|
|
586
|
+
data: DenormalizeNullable<E['schema']>;
|
|
587
|
+
expiryStatus: ExpiryStatus;
|
|
588
|
+
expiresAt: number;
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
getResponse<
|
|
491
592
|
E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>,
|
|
492
|
-
Args extends readonly [...Parameters<E['key']>],
|
|
493
593
|
>(
|
|
494
594
|
endpoint: E,
|
|
495
|
-
...args:
|
|
595
|
+
...args: readonly [...Parameters<E['key']>] | readonly [null]
|
|
496
596
|
): {
|
|
497
597
|
data: DenormalizeNullable<E['schema']>;
|
|
498
598
|
expiryStatus: ExpiryStatus;
|
|
499
599
|
expiresAt: number;
|
|
500
|
-
} => {
|
|
501
|
-
return this.controller.getResponse(endpoint, ...args, this.state);
|
|
502
600
|
};
|
|
503
601
|
|
|
602
|
+
getResponse<
|
|
603
|
+
E extends Pick<EndpointInterface, 'key' | 'schema' | 'invalidIfStale'>,
|
|
604
|
+
>(
|
|
605
|
+
endpoint: E,
|
|
606
|
+
...args: readonly [...Parameters<E['key']>] | readonly [null]
|
|
607
|
+
): {
|
|
608
|
+
data: DenormalizeNullable<E['schema']>;
|
|
609
|
+
expiryStatus: ExpiryStatus;
|
|
610
|
+
expiresAt: number;
|
|
611
|
+
} {
|
|
612
|
+
return this.controller.getResponse(endpoint, ...args, this.state);
|
|
613
|
+
}
|
|
614
|
+
|
|
504
615
|
/** @see https://dataclient.io/docs/api/Snapshot#getError */
|
|
505
616
|
getError = <
|
|
506
617
|
E extends Pick<EndpointInterface, 'key'>,
|
|
@@ -511,4 +622,15 @@ class Snapshot<T = unknown> implements SnapshotInterface {
|
|
|
511
622
|
): ErrorTypes | undefined => {
|
|
512
623
|
return this.controller.getError(endpoint, ...args, this.state);
|
|
513
624
|
};
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Retrieved memoized value for any Querable schema
|
|
628
|
+
* @see https://dataclient.io/docs/api/Snapshot#get
|
|
629
|
+
*/
|
|
630
|
+
get<S extends Queryable>(
|
|
631
|
+
schema: S,
|
|
632
|
+
...args: SchemaArgs<S>
|
|
633
|
+
): DenormalizeNullable<S> | undefined {
|
|
634
|
+
return this.controller.get(schema, ...args, this.state);
|
|
635
|
+
}
|
|
514
636
|
}
|