@data-client/core 0.8.1 → 0.9.2
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 +4 -4
- package/dist/index.js +86 -22
- package/dist/index.umd.min.js +1 -1
- package/legacy/manager/DevtoolsManager.js +87 -23
- package/lib/manager/DevtoolsManager.d.ts +5 -0
- package/lib/manager/DevtoolsManager.d.ts.map +1 -1
- package/lib/manager/DevtoolsManager.js +88 -23
- package/package.json +4 -4
- package/src/manager/DevtoolsManager.ts +107 -33
- package/ts3.4/manager/DevtoolsManager.d.ts +8 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# [](https://dataclient.io)
|
|
2
2
|
|
|
3
|
-
[](https://circleci.com/gh/reactive/data-client)
|
|
4
|
+
[](https://app.codecov.io/gh/reactive/data-client?branch=master)
|
|
5
5
|
[](https://www.npmjs.com/package/@data-client/core)
|
|
6
6
|
[](https://bundlephobia.com/result?p=@data-client/core)
|
|
7
7
|
[](https://www.npmjs.com/package/@data-client/core)
|
|
@@ -13,8 +13,8 @@ automatic expiry policies, data normalization. Consumes [TypeScript Standard End
|
|
|
13
13
|
<div align="center">
|
|
14
14
|
|
|
15
15
|
**[📖Read The Docs](https://dataclient.io/docs)** | [🏁Getting Started](https://dataclient.io/docs/getting-started/installation) |
|
|
16
|
-
[🎮Todo Demo](https://stackblitz.com/github/
|
|
17
|
-
[🎮Github Demo](https://stackblitz.com/github/
|
|
16
|
+
[🎮Todo Demo](https://stackblitz.com/github/reactive/data-client/tree/master/examples/todo-app?file=src%2Fpages%2FHome%2FTodoList.tsx) |
|
|
17
|
+
[🎮Github Demo](https://stackblitz.com/github/reactive/data-client/tree/master/examples/github-app?file=src%2Fpages%2FIssueList.tsx)
|
|
18
18
|
|
|
19
19
|
</div>
|
|
20
20
|
|
package/dist/index.js
CHANGED
|
@@ -1261,27 +1261,51 @@ class SubscriptionManager {
|
|
|
1261
1261
|
}
|
|
1262
1262
|
}
|
|
1263
1263
|
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
}
|
|
1281
|
-
return value;
|
|
1282
|
-
} : undefined
|
|
1264
|
+
/* eslint-disable no-inner-declarations */
|
|
1265
|
+
let DEFAULT_CONFIG = {};
|
|
1266
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
1267
|
+
var _globalThis$document;
|
|
1268
|
+
const extraEndpointKeys = ['dataExpiryLength', 'errorExpiryLength', 'errorPolicy', 'invalidIfStale', 'pollFrequency', 'getOptimisticResponse', 'update'];
|
|
1269
|
+
function serializeEndpoint(endpoint) {
|
|
1270
|
+
var _toJSON, _endpoint$schema;
|
|
1271
|
+
const serial = {
|
|
1272
|
+
name: endpoint.name,
|
|
1273
|
+
schema: (_toJSON = (_endpoint$schema = endpoint.schema) == null ? void 0 : _endpoint$schema.toJSON == null ? void 0 : _endpoint$schema.toJSON()) != null ? _toJSON : endpoint.schema,
|
|
1274
|
+
sideEffect: endpoint.sideEffect
|
|
1275
|
+
};
|
|
1276
|
+
extraEndpointKeys.forEach(key => {
|
|
1277
|
+
if (key in endpoint) serial[key] = endpoint[key];
|
|
1278
|
+
});
|
|
1279
|
+
return serial;
|
|
1283
1280
|
}
|
|
1284
|
-
|
|
1281
|
+
const HASINTL = typeof Intl !== 'undefined';
|
|
1282
|
+
DEFAULT_CONFIG = {
|
|
1283
|
+
name: `Data Client: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
|
|
1284
|
+
autoPause: true,
|
|
1285
|
+
actionSanitizer: action => {
|
|
1286
|
+
if (!('endpoint' in action)) return action;
|
|
1287
|
+
return {
|
|
1288
|
+
...action,
|
|
1289
|
+
endpoint: serializeEndpoint(action.endpoint)
|
|
1290
|
+
};
|
|
1291
|
+
},
|
|
1292
|
+
serialize: {
|
|
1293
|
+
options: undefined,
|
|
1294
|
+
/* istanbul ignore next */
|
|
1295
|
+
replacer: HASINTL ? (key, value) => {
|
|
1296
|
+
if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
|
|
1297
|
+
return Intl.DateTimeFormat('en-US', {
|
|
1298
|
+
hour: 'numeric',
|
|
1299
|
+
minute: 'numeric',
|
|
1300
|
+
second: 'numeric',
|
|
1301
|
+
fractionalSecondDigits: 3
|
|
1302
|
+
}).format(value);
|
|
1303
|
+
}
|
|
1304
|
+
return value;
|
|
1305
|
+
} : undefined
|
|
1306
|
+
}
|
|
1307
|
+
};
|
|
1308
|
+
}
|
|
1285
1309
|
|
|
1286
1310
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
1287
1311
|
*
|
|
@@ -1291,23 +1315,55 @@ const DEFAULT_CONFIG = {
|
|
|
1291
1315
|
*/
|
|
1292
1316
|
class DevToolsManager {
|
|
1293
1317
|
constructor(config, skipLogging) {
|
|
1318
|
+
this.started = false;
|
|
1319
|
+
this.actions = [];
|
|
1294
1320
|
/* istanbul ignore next */
|
|
1295
1321
|
this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect({
|
|
1296
1322
|
...DEFAULT_CONFIG,
|
|
1297
1323
|
config
|
|
1298
1324
|
});
|
|
1325
|
+
if (process.env.NODE_ENV !== 'production' && this.devTools) {
|
|
1326
|
+
this.devTools.subscribe(msg => {
|
|
1327
|
+
switch (msg.type) {
|
|
1328
|
+
case 'START':
|
|
1329
|
+
this.started = true;
|
|
1330
|
+
if (this.actions.length) {
|
|
1331
|
+
this.actions.forEach(([action, state]) => {
|
|
1332
|
+
this.handleAction(action, state);
|
|
1333
|
+
});
|
|
1334
|
+
this.actions = [];
|
|
1335
|
+
}
|
|
1336
|
+
break;
|
|
1337
|
+
case 'STOP':
|
|
1338
|
+
this.started = false;
|
|
1339
|
+
break;
|
|
1340
|
+
case 'DISPATCH':
|
|
1341
|
+
if (msg.payload.type === 'RESET') {
|
|
1342
|
+
this.controller.resetEntireStore();
|
|
1343
|
+
}
|
|
1344
|
+
break;
|
|
1345
|
+
}
|
|
1346
|
+
});
|
|
1347
|
+
}
|
|
1299
1348
|
|
|
1300
1349
|
/* istanbul ignore if */
|
|
1301
1350
|
/* istanbul ignore next */
|
|
1302
1351
|
if (this.devTools) {
|
|
1303
1352
|
this.middleware = controller => {
|
|
1353
|
+
this.controller = controller;
|
|
1304
1354
|
const reducer = createReducer(controller);
|
|
1355
|
+
let state = controller.getState();
|
|
1305
1356
|
return next => action => {
|
|
1306
1357
|
const ret = next(action);
|
|
1358
|
+
if (this.started) {
|
|
1359
|
+
// we track state changes here since getState() will only update after a batch commit
|
|
1360
|
+
state = reducer(state, action);
|
|
1361
|
+
} else {
|
|
1362
|
+
state = controller.getState();
|
|
1363
|
+
}
|
|
1307
1364
|
ret.then(() => {
|
|
1308
1365
|
if (skipLogging != null && skipLogging(action)) return;
|
|
1309
|
-
|
|
1310
|
-
this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
|
|
1366
|
+
this.handleAction(action, state.optimistic.reduce(reducer, state));
|
|
1311
1367
|
});
|
|
1312
1368
|
return ret;
|
|
1313
1369
|
};
|
|
@@ -1316,6 +1372,14 @@ class DevToolsManager {
|
|
|
1316
1372
|
this.middleware = () => next => action => next(action);
|
|
1317
1373
|
}
|
|
1318
1374
|
}
|
|
1375
|
+
handleAction(action, state) {
|
|
1376
|
+
if (this.started) {
|
|
1377
|
+
this.devTools.send(action, state, undefined, 'RDC');
|
|
1378
|
+
} else {
|
|
1379
|
+
// queue actions
|
|
1380
|
+
this.actions.push([action, state]);
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1319
1383
|
|
|
1320
1384
|
/** Called when initial state is ready */
|
|
1321
1385
|
init(state) {
|
package/dist/index.umd.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@data-client/normalizr")):"function"==typeof define&&define.amd?define(["exports","@data-client/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).dataClientCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const i="rdc/fetch",r="rdc/set",n="rdc/optimistic",a="rdc/reset",o="rdc/subscribe",l="rdc/unsubscribe",c="rdc/invalidate",h="rdc/invalidateall",d="rdc/expireall",u="rdc/gc";var p=Object.freeze({__proto__:null,FETCH_TYPE:i,SET_TYPE:r,OPTIMISTIC_TYPE:n,RESET_TYPE:a,SUBSCRIBE_TYPE:o,UNSUBSCRIBE_TYPE:l,INVALIDATE_TYPE:c,INVALIDATEALL_TYPE:h,EXPIREALL_TYPE:d,GC_TYPE:u});function f(e,t){let s;return t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect?(s=function(e,{args:t,fetchedAt:s}){var i;const r=null!=(i=e.dataExpiryLength)?i:6e4,a=Date.now(),o={args:t,fetchedAt:s,date:a,expiresAt:a+r,key:e.key(...t)};return{type:n,endpoint:e,meta:o}}(t.endpoint,{args:t.meta.args,fetchedAt:t.meta.createdAt}),Object.assign({},e,{optimistic:[...e.optimistic,s]})):e}function m(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:y(e,t)}):Object.assign({},e,{meta:Object.assign({},e.meta,{[t.meta.key]:{date:t.meta.date,error:s,expiresAt:t.meta.expiresAt,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(s)}}),optimistic:y(e,t)})}function y(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===n?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function g(e){return function(s,o){switch(s||(s=v),o.type){case u:return o.entities.forEach((([e,t])=>{var i,r;null==(i=s.entities[e])||delete i[t],null==(r=s.entityMeta[e])||delete r[t]})),o.results.forEach((e=>{delete s.results[e],delete s.meta[e]})),s;case i:return f(s,o);case n:case r:return function(e,s,i){if(s.error)return m(e,s,s.payload);try{var r;let o;if(s.type===n){if(!s.endpoint.getOptimisticResponse)return e;try{o=s.endpoint.getOptimisticResponse.call(s.endpoint,i.snapshot(e,s.meta.fetchedAt),...s.meta.args)}catch(t){var a;if("AbortOptimistic"===(null==(a=t.constructor)?void 0:a.name))return e;throw t}}else o=s.payload;const{result:l,entities:c,indexes:h,entityMeta:d}=t.normalize(o,s.endpoint.schema,s.meta.args,e.entities,e.indexes,e.entityMeta,s.meta),u=Object.assign({},e.results,{[s.meta.key]:l});try{if(s.endpoint.update){const e=s.endpoint.update(l,...s.meta.args);Object.keys(e).forEach((t=>{u[t]=e[t](u[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${s.meta.key}`),console.error(e)}return{entities:c,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(r=e.meta[s.meta.key])?void 0:r.expiresAt}}),optimistic:y(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.endpoint.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),m(e,s,t)}}(s,o,e);case h:case c:return function(e,t){const s=Object.assign({},e.results),i=Object.assign({},e.meta),r=e=>{delete s[e];const t=Object.assign({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===c?r(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&r(e)})),Object.assign({},e,{results:s,meta:i})}(s,o);case d:return function(e,t){const s=Object.assign({},e.meta);return Object.keys(s).forEach((e=>{t.testKey(e)&&(s[e]=Object.assign({},s[e],{expiresAt:1}))})),Object.assign({},e,{meta:s})}(s,o);case a:return Object.assign({},v,{lastReset:o.date});default:return s}}}const v={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var b=Object.freeze({__proto__:null,inferResults:t.inferResults,INVALID:t.INVALID,RIC:s,initialState:v});function E(e,{args:t}){const s=e.key(...t);let r=0,n=0;const a=new Promise(((e,t)=>{[r,n]=[e,t]})),o={args:t,key:s,throttle:!e.sideEffect,resolve:r,reject:n,promise:a,createdAt:Date.now(),nm:!1};return{type:i,payload:()=>e(...t),meta:o,endpoint:e}}var L="undefined"!=typeof FormData?e=>e instanceof FormData?Object.fromEntries(e.entries()):e:e=>e;function I(e,{args:t,fetchedAt:s,response:i,error:n=!1}){var a,o;const l=n?null!=(a=e.errorExpiryLength)?a:1e3:null!=(o=e.dataExpiryLength)?o:6e4,c=Date.now(),h={args:t.map(L),fetchedAt:null!=s?s:c,date:c,expiresAt:c+l,key:e.key(...t)},d={type:r,payload:i,endpoint:e,meta:h};return n&&(d.error=!0),d}function O(e,t){return e.meta[t]}const S=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},w=()=>v;class A{constructor({dispatch:e=S,getState:s=w,globalCache:i={entities:{},results:{}}}={}){this.fetch=(e,...s)=>{const i=E(e,{args:s});return this.dispatch(i),e.schema?i.meta.promise.then((i=>t.denormalize(i,e.schema,{},s))):i.meta.promise},this.fetchIfStale=(e,...s)=>{const{data:i,expiresAt:r,expiryStatus:n}=this.getResponse(e,...s,this.getState());return n!==t.ExpiryStatus.Invalid&&Date.now()<=r?i:this.fetch(e,...s)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,meta:{key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch({type:h,testKey:t=>e.testKey(t)}),this.expireAll=e=>this.dispatch({type:d,testKey:t=>e.testKey(t)}),this.resetEntireStore=()=>this.dispatch({type:a,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],i=I(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(i)},this.setError=(e,...t)=>{const s=t[t.length-1],i=I(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(i)},this.resolve=(e,t)=>this.dispatch(I(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:o,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new x(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],i=t.slice(0,t.length-1),r=e.key(...i),n=O(s,r);return void 0===s.results[r]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const i=s[s.length-1],r=s.slice(0,s.length-1).map(L),n=1!==r.length||null!==r[0],a=n?e.key(...r):"",o=n?i.results[a]:void 0,l=e.schema,c=O(i,a);let h,d=null==c?void 0:c.expiresAt,u=!1;if(void 0===o&&void 0!==e.schema?(h=t.inferResults(e.schema,r,i.indexes,i.entities),u=!t.validateInference(h),!d&&u&&(d=1)):h=o,!n)return{data:h,expiryStatus:t.ExpiryStatus.Valid,expiresAt:1/0};if(!e.schema||!k(e.schema))return{data:h,expiryStatus:null!=c&&c.invalidated?t.ExpiryStatus.Invalid:o&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:d||0};this.globalCache.results[a]||(this.globalCache.results[a]=new t.WeakEntityMap);const{data:p,paths:f}=t.denormalizeCached(h,l,i.entities,this.globalCache.entities,this.globalCache.results[a],r),m="symbol"==typeof p;d||(d=function(e,t){let s=1/0;for(const{pk:n,key:a}of e){var i,r;const e=null==(i=t[a])||null==(r=i[n])?void 0:r.expiresAt;e<s&&(s=e)}return s}(f,i.entityMeta));return{data:p,expiryStatus:null!=c&&c.invalidated||m&&(null==c||!c.error)?t.ExpiryStatus.Invalid:m||e.invalidIfStale||u?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:d}},this.dispatch=e,this.getState=s,this.globalCache=i}}function k(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&k(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?k(t):Object.values(t).some((e=>k(e)))}return!1}class x{constructor(e,t,s=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.getResponse=(e,...t)=>this.controller.getResponse(e,...t,this.state),this.getError=(e,...t)=>this.controller.getError(e,...t,this.state),this.state=t,this.controller=e,this.fetchedAt=s}}class j extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}class T{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class _{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let R;R="undefined"!=typeof navigator&&"function"==typeof addEventListener?T:_;var q,P=R;const D="undefined"!=typeof Intl,M={name:`RDC: ${null==(q=globalThis.document)?void 0:q.title}`,autoPause:!0,serialize:{options:void 0,replacer:D?(e,t)=>"number"==typeof t&&"string"==typeof e&&isFinite(t)&&("date"===e||e.endsWith("At"))?Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"numeric",second:"numeric",fractionalSecondDigits:3}).format(t):t:void 0}};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},Object.defineProperty(e,"ExpiryStatus",{enumerable:!0,get:function(){return t.ExpiryStatus}}),e.Controller=A,e.DefaultConnectionListener=P,e.DevToolsManager=class{constructor(e,t){this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({},M,{config:e})),this.devTools?this.middleware=e=>{const s=g(e);return i=>r=>{const n=i(r);return n.then((()=>{if(null!=t&&t(r))return;const i=e.getState();this.devTools.send(r,i.optimistic.reduce(s,i),void 0,"RDC")})),n}}:this.middleware=()=>e=>t=>e(t)}init(e){this.devTools&&this.devTools.init(e)}cleanup(){}getMiddleware(){return this.middleware}},e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){e&&(this.handleLogout=e),t&&(this.shouldLogout=t),this.middleware=e=>t=>async s=>{await t(s),s.type===r&&s.error&&this.shouldLogout(s.payload)&&this.handleLogout(e)}}cleanup(){}getMiddleware(){return this.middleware}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor(e=6e4,t=1e3){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new A,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=e=>(this.controller=e,t=>s=>{switch(s.type){case i:return this.handleFetch(s),void 0!==s.endpoint.getOptimisticResponse&&s.endpoint.sideEffect?t(s):Promise.resolve();case r:return t(s).then((()=>{if(s.meta.key in this.fetched){var t;const i=null==(t=e.getState().meta[s.meta.key])?void 0:t.error;i?this.handleSet(I(s.endpoint,{args:s.meta.args,response:i,fetchedAt:s.meta.fetchedAt,error:!0})):this.handleSet(s)}}));case a:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(s).then((()=>{for(const t in e)e[t](new j)}))}default:return t(s)}})}skipLogging(e){return e.type===i&&e.meta.key in this.fetched}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const t=e.payload,{key:s,throttle:i,resolve:r,reject:n,createdAt:a}=e.meta,o=()=>{let s=t();return i||(s=(e=>e.then((e=>(r(e),e))).catch((e=>{throw n(e),e})))(s)),s=s.then((t=>{let s=this.getLastReset();return a>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:a}),t})).catch((t=>{const s=this.getLastReset();throw a>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:a,error:!0}),t})),s};return i?this.throttle(s,o,a).then((e=>r(e))).catch((e=>n(e))):o().catch((()=>{}))}handleSet(e){if(e.meta.key in this.fetched){let t;t=e.error?this.rejectors[e.meta.key]:this.resolvers[e.meta.key],t(e.payload),this.clear(e.meta.key)}}getMiddleware(){return this.middleware}throttle(e,t,i){const r=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>r||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=i,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor(e,t,s){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.meta.args,this.key=e.meta.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=s||new P,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=j,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new A,this.Subscription=e,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case o:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case l:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}})}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].add(s)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].remove(s)&&delete this.subscriptions[t]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=b,e.actionTypes=p,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:i})=>(t.dispatch=e,t.getState=i,s(t))}))},e.createFetch=E,e.createReducer=g,e.createSet=I,e.initialState=v,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@data-client/normalizr")):"function"==typeof define&&define.amd?define(["exports","@data-client/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).dataClientCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const i="rdc/fetch",r="rdc/set",n="rdc/optimistic",a="rdc/reset",o="rdc/subscribe",l="rdc/unsubscribe",c="rdc/invalidate",h="rdc/invalidateall",d="rdc/expireall",u="rdc/gc";var p=Object.freeze({__proto__:null,FETCH_TYPE:i,SET_TYPE:r,OPTIMISTIC_TYPE:n,RESET_TYPE:a,SUBSCRIBE_TYPE:o,UNSUBSCRIBE_TYPE:l,INVALIDATE_TYPE:c,INVALIDATEALL_TYPE:h,EXPIREALL_TYPE:d,GC_TYPE:u});function f(e,t){let s;return t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect?(s=function(e,{args:t,fetchedAt:s}){var i;const r=null!=(i=e.dataExpiryLength)?i:6e4,a=Date.now(),o={args:t,fetchedAt:s,date:a,expiresAt:a+r,key:e.key(...t)};return{type:n,endpoint:e,meta:o}}(t.endpoint,{args:t.meta.args,fetchedAt:t.meta.createdAt}),Object.assign({},e,{optimistic:[...e.optimistic,s]})):e}function y(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:m(e,t)}):Object.assign({},e,{meta:Object.assign({},e.meta,{[t.meta.key]:{date:t.meta.date,error:s,expiresAt:t.meta.expiresAt,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(s)}}),optimistic:m(e,t)})}function m(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===n?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function g(e){return function(s,o){switch(s||(s=v),o.type){case u:return o.entities.forEach((([e,t])=>{var i,r;null==(i=s.entities[e])||delete i[t],null==(r=s.entityMeta[e])||delete r[t]})),o.results.forEach((e=>{delete s.results[e],delete s.meta[e]})),s;case i:return f(s,o);case n:case r:return function(e,s,i){if(s.error)return y(e,s,s.payload);try{var r;let o;if(s.type===n){if(!s.endpoint.getOptimisticResponse)return e;try{o=s.endpoint.getOptimisticResponse.call(s.endpoint,i.snapshot(e,s.meta.fetchedAt),...s.meta.args)}catch(t){var a;if("AbortOptimistic"===(null==(a=t.constructor)?void 0:a.name))return e;throw t}}else o=s.payload;const{result:l,entities:c,indexes:h,entityMeta:d}=t.normalize(o,s.endpoint.schema,s.meta.args,e.entities,e.indexes,e.entityMeta,s.meta),u=Object.assign({},e.results,{[s.meta.key]:l});try{if(s.endpoint.update){const e=s.endpoint.update(l,...s.meta.args);Object.keys(e).forEach((t=>{u[t]=e[t](u[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${s.meta.key}`),console.error(e)}return{entities:c,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(r=e.meta[s.meta.key])?void 0:r.expiresAt}}),optimistic:m(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.endpoint.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),y(e,s,t)}}(s,o,e);case h:case c:return function(e,t){const s=Object.assign({},e.results),i=Object.assign({},e.meta),r=e=>{delete s[e];const t=Object.assign({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===c?r(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&r(e)})),Object.assign({},e,{results:s,meta:i})}(s,o);case d:return function(e,t){const s=Object.assign({},e.meta);return Object.keys(s).forEach((e=>{t.testKey(e)&&(s[e]=Object.assign({},s[e],{expiresAt:1}))})),Object.assign({},e,{meta:s})}(s,o);case a:return Object.assign({},v,{lastReset:o.date});default:return s}}}const v={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var b=Object.freeze({__proto__:null,inferResults:t.inferResults,INVALID:t.INVALID,RIC:s,initialState:v});function E(e,{args:t}){const s=e.key(...t);let r=0,n=0;const a=new Promise(((e,t)=>{[r,n]=[e,t]})),o={args:t,key:s,throttle:!e.sideEffect,resolve:r,reject:n,promise:a,createdAt:Date.now(),nm:!1};return{type:i,payload:()=>e(...t),meta:o,endpoint:e}}var L="undefined"!=typeof FormData?e=>e instanceof FormData?Object.fromEntries(e.entries()):e:e=>e;function O(e,{args:t,fetchedAt:s,response:i,error:n=!1}){var a,o;const l=n?null!=(a=e.errorExpiryLength)?a:1e3:null!=(o=e.dataExpiryLength)?o:6e4,c=Date.now(),h={args:t.map(L),fetchedAt:null!=s?s:c,date:c,expiresAt:c+l,key:e.key(...t)},d={type:r,payload:i,endpoint:e,meta:h};return n&&(d.error=!0),d}function I(e,t){return e.meta[t]}const S=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},w=()=>v;class A{constructor({dispatch:e=S,getState:s=w,globalCache:i={entities:{},results:{}}}={}){this.fetch=(e,...s)=>{const i=E(e,{args:s});return this.dispatch(i),e.schema?i.meta.promise.then((i=>t.denormalize(i,e.schema,{},s))):i.meta.promise},this.fetchIfStale=(e,...s)=>{const{data:i,expiresAt:r,expiryStatus:n}=this.getResponse(e,...s,this.getState());return n!==t.ExpiryStatus.Invalid&&Date.now()<=r?i:this.fetch(e,...s)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,meta:{key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch({type:h,testKey:t=>e.testKey(t)}),this.expireAll=e=>this.dispatch({type:d,testKey:t=>e.testKey(t)}),this.resetEntireStore=()=>this.dispatch({type:a,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(i)},this.setError=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(i)},this.resolve=(e,t)=>this.dispatch(O(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:o,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new x(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],i=t.slice(0,t.length-1),r=e.key(...i),n=I(s,r);return void 0===s.results[r]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const i=s[s.length-1],r=s.slice(0,s.length-1).map(L),n=1!==r.length||null!==r[0],a=n?e.key(...r):"",o=n?i.results[a]:void 0,l=e.schema,c=I(i,a);let h,d=null==c?void 0:c.expiresAt,u=!1;if(void 0===o&&void 0!==e.schema?(h=t.inferResults(e.schema,r,i.indexes,i.entities),u=!t.validateInference(h),!d&&u&&(d=1)):h=o,!n)return{data:h,expiryStatus:t.ExpiryStatus.Valid,expiresAt:1/0};if(!e.schema||!k(e.schema))return{data:h,expiryStatus:null!=c&&c.invalidated?t.ExpiryStatus.Invalid:o&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:d||0};this.globalCache.results[a]||(this.globalCache.results[a]=new t.WeakEntityMap);const{data:p,paths:f}=t.denormalizeCached(h,l,i.entities,this.globalCache.entities,this.globalCache.results[a],r),y="symbol"==typeof p;d||(d=function(e,t){let s=1/0;for(const{pk:n,key:a}of e){var i,r;const e=null==(i=t[a])||null==(r=i[n])?void 0:r.expiresAt;e<s&&(s=e)}return s}(f,i.entityMeta));return{data:p,expiryStatus:null!=c&&c.invalidated||y&&(null==c||!c.error)?t.ExpiryStatus.Invalid:y||e.invalidIfStale||u?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:d}},this.dispatch=e,this.getState=s,this.globalCache=i}}function k(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&k(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?k(t):Object.values(t).some((e=>k(e)))}return!1}class x{constructor(e,t,s=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.getResponse=(e,...t)=>this.controller.getResponse(e,...t,this.state),this.getError=(e,...t)=>this.controller.getError(e,...t,this.state),this.state=t,this.controller=e,this.fetchedAt=s}}class j extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}class T{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class _{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let R;R="undefined"!=typeof navigator&&"function"==typeof addEventListener?T:_;var q=R;let P={};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},Object.defineProperty(e,"ExpiryStatus",{enumerable:!0,get:function(){return t.ExpiryStatus}}),e.Controller=A,e.DefaultConnectionListener=q,e.DevToolsManager=class{constructor(e,t){this.started=!1,this.actions=[],this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({},P,{config:e})),this.devTools?this.middleware=e=>{this.controller=e;const s=g(e);let i=e.getState();return r=>n=>{const a=r(n);return i=this.started?s(i,n):e.getState(),a.then((()=>{null!=t&&t(n)||this.handleAction(n,i.optimistic.reduce(s,i))})),a}}:this.middleware=()=>e=>t=>e(t)}handleAction(e,t){this.started?this.devTools.send(e,t,void 0,"RDC"):this.actions.push([e,t])}init(e){this.devTools&&this.devTools.init(e)}cleanup(){}getMiddleware(){return this.middleware}},e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){e&&(this.handleLogout=e),t&&(this.shouldLogout=t),this.middleware=e=>t=>async s=>{await t(s),s.type===r&&s.error&&this.shouldLogout(s.payload)&&this.handleLogout(e)}}cleanup(){}getMiddleware(){return this.middleware}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor(e=6e4,t=1e3){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new A,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=e=>(this.controller=e,t=>s=>{switch(s.type){case i:return this.handleFetch(s),void 0!==s.endpoint.getOptimisticResponse&&s.endpoint.sideEffect?t(s):Promise.resolve();case r:return t(s).then((()=>{if(s.meta.key in this.fetched){var t;const i=null==(t=e.getState().meta[s.meta.key])?void 0:t.error;i?this.handleSet(O(s.endpoint,{args:s.meta.args,response:i,fetchedAt:s.meta.fetchedAt,error:!0})):this.handleSet(s)}}));case a:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(s).then((()=>{for(const t in e)e[t](new j)}))}default:return t(s)}})}skipLogging(e){return e.type===i&&e.meta.key in this.fetched}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const t=e.payload,{key:s,throttle:i,resolve:r,reject:n,createdAt:a}=e.meta,o=()=>{let s=t();return i||(s=(e=>e.then((e=>(r(e),e))).catch((e=>{throw n(e),e})))(s)),s=s.then((t=>{let s=this.getLastReset();return a>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:a}),t})).catch((t=>{const s=this.getLastReset();throw a>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:a,error:!0}),t})),s};return i?this.throttle(s,o,a).then((e=>r(e))).catch((e=>n(e))):o().catch((()=>{}))}handleSet(e){if(e.meta.key in this.fetched){let t;t=e.error?this.rejectors[e.meta.key]:this.resolvers[e.meta.key],t(e.payload),this.clear(e.meta.key)}}getMiddleware(){return this.middleware}throttle(e,t,i){const r=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>r||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=i,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor(e,t,s){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.meta.args,this.key=e.meta.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=s||new q,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=j,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new A,this.Subscription=e,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case o:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case l:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}})}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].add(s)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].remove(s)&&delete this.subscriptions[t]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=b,e.actionTypes=p,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:i})=>(t.dispatch=e,t.getState=i,s(t))}))},e.createFetch=E,e.createReducer=g,e.createSet=O,e.initialState=v,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
@@ -1,25 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable no-inner-declarations */
|
|
2
|
+
|
|
2
3
|
import createReducer from '../state/reducer/createReducer.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
return value;
|
|
20
|
-
} : undefined
|
|
4
|
+
let DEFAULT_CONFIG = {};
|
|
5
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
6
|
+
var _globalThis$document;
|
|
7
|
+
const extraEndpointKeys = ['dataExpiryLength', 'errorExpiryLength', 'errorPolicy', 'invalidIfStale', 'pollFrequency', 'getOptimisticResponse', 'update'];
|
|
8
|
+
function serializeEndpoint(endpoint) {
|
|
9
|
+
var _toJSON, _endpoint$schema;
|
|
10
|
+
const serial = {
|
|
11
|
+
name: endpoint.name,
|
|
12
|
+
schema: (_toJSON = (_endpoint$schema = endpoint.schema) == null ? void 0 : _endpoint$schema.toJSON == null ? void 0 : _endpoint$schema.toJSON()) != null ? _toJSON : endpoint.schema,
|
|
13
|
+
sideEffect: endpoint.sideEffect
|
|
14
|
+
};
|
|
15
|
+
extraEndpointKeys.forEach(key => {
|
|
16
|
+
if (key in endpoint) serial[key] = endpoint[key];
|
|
17
|
+
});
|
|
18
|
+
return serial;
|
|
21
19
|
}
|
|
22
|
-
|
|
20
|
+
const HASINTL = typeof Intl !== 'undefined';
|
|
21
|
+
DEFAULT_CONFIG = {
|
|
22
|
+
name: `Data Client: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
|
|
23
|
+
autoPause: true,
|
|
24
|
+
actionSanitizer: action => {
|
|
25
|
+
if (!('endpoint' in action)) return action;
|
|
26
|
+
return Object.assign({}, action, {
|
|
27
|
+
endpoint: serializeEndpoint(action.endpoint)
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
serialize: {
|
|
31
|
+
options: undefined,
|
|
32
|
+
/* istanbul ignore next */
|
|
33
|
+
replacer: HASINTL ? (key, value) => {
|
|
34
|
+
if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
|
|
35
|
+
return Intl.DateTimeFormat('en-US', {
|
|
36
|
+
hour: 'numeric',
|
|
37
|
+
minute: 'numeric',
|
|
38
|
+
second: 'numeric',
|
|
39
|
+
fractionalSecondDigits: 3
|
|
40
|
+
}).format(value);
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
} : undefined
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
23
47
|
|
|
24
48
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
25
49
|
*
|
|
@@ -29,22 +53,54 @@ const DEFAULT_CONFIG = {
|
|
|
29
53
|
*/
|
|
30
54
|
export default class DevToolsManager {
|
|
31
55
|
constructor(config, skipLogging) {
|
|
56
|
+
this.started = false;
|
|
57
|
+
this.actions = [];
|
|
32
58
|
/* istanbul ignore next */
|
|
33
59
|
this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({}, DEFAULT_CONFIG, {
|
|
34
60
|
config
|
|
35
61
|
}));
|
|
62
|
+
if (process.env.NODE_ENV !== 'production' && this.devTools) {
|
|
63
|
+
this.devTools.subscribe(msg => {
|
|
64
|
+
switch (msg.type) {
|
|
65
|
+
case 'START':
|
|
66
|
+
this.started = true;
|
|
67
|
+
if (this.actions.length) {
|
|
68
|
+
this.actions.forEach(([action, state]) => {
|
|
69
|
+
this.handleAction(action, state);
|
|
70
|
+
});
|
|
71
|
+
this.actions = [];
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
case 'STOP':
|
|
75
|
+
this.started = false;
|
|
76
|
+
break;
|
|
77
|
+
case 'DISPATCH':
|
|
78
|
+
if (msg.payload.type === 'RESET') {
|
|
79
|
+
this.controller.resetEntireStore();
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
36
85
|
|
|
37
86
|
/* istanbul ignore if */
|
|
38
87
|
/* istanbul ignore next */
|
|
39
88
|
if (this.devTools) {
|
|
40
89
|
this.middleware = controller => {
|
|
90
|
+
this.controller = controller;
|
|
41
91
|
const reducer = createReducer(controller);
|
|
92
|
+
let state = controller.getState();
|
|
42
93
|
return next => action => {
|
|
43
94
|
const ret = next(action);
|
|
95
|
+
if (this.started) {
|
|
96
|
+
// we track state changes here since getState() will only update after a batch commit
|
|
97
|
+
state = reducer(state, action);
|
|
98
|
+
} else {
|
|
99
|
+
state = controller.getState();
|
|
100
|
+
}
|
|
44
101
|
ret.then(() => {
|
|
45
102
|
if (skipLogging != null && skipLogging(action)) return;
|
|
46
|
-
|
|
47
|
-
this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
|
|
103
|
+
this.handleAction(action, state.optimistic.reduce(reducer, state));
|
|
48
104
|
});
|
|
49
105
|
return ret;
|
|
50
106
|
};
|
|
@@ -53,6 +109,14 @@ export default class DevToolsManager {
|
|
|
53
109
|
this.middleware = () => next => action => next(action);
|
|
54
110
|
}
|
|
55
111
|
}
|
|
112
|
+
handleAction(action, state) {
|
|
113
|
+
if (this.started) {
|
|
114
|
+
this.devTools.send(action, state, undefined, 'RDC');
|
|
115
|
+
} else {
|
|
116
|
+
// queue actions
|
|
117
|
+
this.actions.push([action, state]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
56
120
|
|
|
57
121
|
/** Called when initial state is ready */
|
|
58
122
|
init(state) {
|
|
@@ -70,4 +134,4 @@ export default class DevToolsManager {
|
|
|
70
134
|
return this.middleware;
|
|
71
135
|
}
|
|
72
136
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiSEFTSU5UTCIsIkludGwiLCJERUZBVUxUX0NPTkZJRyIsIm5hbWUiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImdsb2JhbFRoaXMiLCJkb2N1bWVudCIsInRpdGxlIiwiYXV0b1BhdXNlIiwic2VyaWFsaXplIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc0Zpbml0ZSIsImVuZHNXaXRoIiwiRGF0ZVRpbWVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiZnJhY3Rpb25hbFNlY29uZERpZ2l0cyIsImZvcm1hdCIsIkRldlRvb2xzTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwic2tpcExvZ2dpbmciLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwiT2JqZWN0IiwiYXNzaWduIiwibWlkZGxld2FyZSIsImNvbnRyb2xsZXIiLCJyZWR1Y2VyIiwibmV4dCIsImFjdGlvbiIsInJldCIsInRoZW4iLCJzdGF0ZSIsImdldFN0YXRlIiwic2VuZCIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiLCJpbml0IiwiY2xlYW51cCIsImdldE1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IGNyZWF0ZVJlZHVjZXIgZnJvbSAnLi4vc3RhdGUvcmVkdWNlci9jcmVhdGVSZWR1Y2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuYWdlciwgU3RhdGUsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IERldlRvb2xzQ29uZmlnIH07XG5cbmNvbnN0IEhBU0lOVEwgPSB0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcbiAgbmFtZTogYFJEQzogJHtnbG9iYWxUaGlzLmRvY3VtZW50Py50aXRsZX1gLFxuICBhdXRvUGF1c2U6IHRydWUsXG4gIHNlcmlhbGl6ZToge1xuICAgIG9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlcGxhY2VyOiBIQVNJTlRMXG4gICAgICA/IChrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAoa2V5ID09PSAnZGF0ZScgfHwga2V5LmVuZHNXaXRoKCdBdCcpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgZnJhY3Rpb25hbFNlY29uZERpZ2l0czogMyxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKiogSW50ZWdyYXRlcyB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzXG4gKlxuICogT3B0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVkdXgtZGV2dG9vbHMvYmxvYi9tYWluL2V4dGVuc2lvbi9kb2NzL0FQSS9Bcmd1bWVudHMubWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBkZWNsYXJlIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLmRldlRvb2xzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdCh7XG4gICAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgICBjb25maWcsXG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZXZUb29scy5zZW5kKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnUkRDJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9ICgpID0+IG5leHQgPT4gYWN0aW9uID0+IG5leHQoYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gaW5pdGlhbCBzdGF0ZSBpcyByZWFkeSAqL1xuICBpbml0KHN0YXRlOiBTdGF0ZTxhbnk+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHRoaXMuZGV2VG9vbHMuaW5pdChzdGF0ZSk7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHt9XG5cbiAgLyoqIEF0dGFjaGVzIE1hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsT0FBT0EsYUFBYSxNQUFNLG1DQUFtQztBQUs3RCxNQUFNQyxPQUFP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
|
|
137
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsIk9iamVjdCIsImFzc2lnbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwic3RhcnRlZCIsImFjdGlvbnMiLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0Iiwic3Vic2NyaWJlIiwibXNnIiwidHlwZSIsImxlbmd0aCIsInN0YXRlIiwiaGFuZGxlQWN0aW9uIiwicGF5bG9hZCIsImNvbnRyb2xsZXIiLCJyZXNldEVudGlyZVN0b3JlIiwibWlkZGxld2FyZSIsInJlZHVjZXIiLCJnZXRTdGF0ZSIsIm5leHQiLCJyZXQiLCJ0aGVuIiwib3B0aW1pc3RpYyIsInJlZHVjZSIsInNlbmQiLCJwdXNoIiwiaW5pdCIsImNsZWFudXAiLCJnZXRNaWRkbGV3YXJlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvRGV2dG9vbHNNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWlubmVyLWRlY2xhcmF0aW9ucyAqL1xuaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgRW5kcG9pbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVkdWNlciBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VyLCBTdGF0ZSwgQWN0aW9uVHlwZXMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfTtcblxubGV0IERFRkFVTFRfQ09ORklHID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGNvbnN0IGV4dHJhRW5kcG9pbnRLZXlzID0gW1xuICAgICdkYXRhRXhwaXJ5TGVuZ3RoJyxcbiAgICAnZXJyb3JFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvclBvbGljeScsXG4gICAgJ2ludmFsaWRJZlN0YWxlJyxcbiAgICAncG9sbEZyZXF1ZW5jeScsXG4gICAgJ2dldE9wdGltaXN0aWNSZXNwb25zZScsXG4gICAgJ3VwZGF0ZScsXG4gIF07XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplRW5kcG9pbnQoZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlKSB7XG4gICAgY29uc3Qgc2VyaWFsOiBhbnkgPSB7XG4gICAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgICAgc2NoZW1hOiAoZW5kcG9pbnQuc2NoZW1hIGFzIGFueSk/LnRvSlNPTj8uKCkgPz8gZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgc2lkZUVmZmVjdDogZW5kcG9pbnQuc2lkZUVmZmVjdCxcbiAgICB9O1xuICAgIGV4dHJhRW5kcG9pbnRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZW5kcG9pbnQpXG4gICAgICAgIHNlcmlhbFtrZXldID0gZW5kcG9pbnRba2V5IGFzIGtleW9mIEVuZHBvaW50SW50ZXJmYWNlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VyaWFsO1xuICB9XG5cbiAgY29uc3QgSEFTSU5UTCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgbmFtZTogYERhdGEgQ2xpZW50OiAke2dsb2JhbFRoaXMuZG9jdW1lbnQ/LnRpdGxlfWAsXG4gICAgYXV0b1BhdXNlOiB0cnVlLFxuICAgIGFjdGlvblNhbml0aXplcjogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IHtcbiAgICAgIGlmICghKCdlbmRwb2ludCcgaW4gYWN0aW9uKSkgcmV0dXJuIGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNlcmlhbGl6ZUVuZHBvaW50KGFjdGlvbi5lbmRwb2ludCksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiB7XG4gICAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmVwbGFjZXI6IEhBU0lOVExcbiAgICAgICAgPyAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgIChrZXkgPT09ICdkYXRlJyB8fCBrZXkuZW5kc1dpdGgoJ0F0JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvRGV2VG9vbHNNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldlRvb2xzTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBkZXZUb29sczogdW5kZWZpbmVkIHwgYW55O1xuICBwcm90ZWN0ZWQgc3RhcnRlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYWN0aW9uczogW0FjdGlvblR5cGVzLCBTdGF0ZTx1bmtub3duPl1bXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZz86IERldlRvb2xzQ29uZmlnLFxuICAgIHNraXBMb2dnaW5nPzogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5kZXZUb29scyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3Qoe1xuICAgICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdTVEFSVCc6XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoW2FjdGlvbiwgc3RhdGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ1NUT1AnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdESVNQQVRDSCc6XG4gICAgICAgICAgICBpZiAobXNnLnBheWxvYWQudHlwZSA9PT0gJ1JFU0VUJykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXRFbnRpcmVTdG9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCByZXQgPSBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgLy8gd2UgdHJhY2sgc3RhdGUgY2hhbmdlcyBoZXJlIHNpbmNlIGdldFN0YXRlKCkgd2lsbCBvbmx5IHVwZGF0ZSBhZnRlciBhIGJhdGNoIGNvbW1pdFxuICAgICAgICAgICAgc3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNraXBMb2dnaW5nPy4oYWN0aW9uKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZS5vcHRpbWlzdGljLnJlZHVjZShyZWR1Y2VyLCBzdGF0ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5kZXZUb29scy5zZW5kKGFjdGlvbiwgc3RhdGUsIHVuZGVmaW5lZCwgJ1JEQycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBxdWV1ZSBhY3Rpb25zXG4gICAgICB0aGlzLmFjdGlvbnMucHVzaChbYWN0aW9uLCBzdGF0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBpbml0aWFsIHN0YXRlIGlzIHJlYWR5ICovXG4gIGluaXQoc3RhdGU6IFN0YXRlPGFueT4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5kZXZUb29scykgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIGFsbCBzdWJzY3JpcHRpb25zIGFyZSBjbGVhbmVkIHVwLiAqL1xuICBjbGVhbnVwKCkge31cblxuICAvKiogQXR0YWNoZXMgTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKi9cbiAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUlBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2QixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxLQUFLLFlBQVksRUFBRTtFQUFBLElBQUFDLG9CQUFBO0VBQ3pDLE1BQU1DLGlC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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DevToolsConfig } from './devtoolsTypes.js';
|
|
2
2
|
import type { Middleware } from './LogoutManager.js';
|
|
3
|
+
import { Controller } from '../index.js';
|
|
3
4
|
import type { Manager, State, ActionTypes } from '../types.js';
|
|
4
5
|
export type { DevToolsConfig };
|
|
5
6
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
@@ -11,7 +12,11 @@ export type { DevToolsConfig };
|
|
|
11
12
|
export default class DevToolsManager implements Manager {
|
|
12
13
|
protected middleware: Middleware;
|
|
13
14
|
protected devTools: undefined | any;
|
|
15
|
+
protected started: boolean;
|
|
16
|
+
protected actions: [ActionTypes, State<unknown>][];
|
|
17
|
+
protected controller: Controller;
|
|
14
18
|
constructor(config?: DevToolsConfig, skipLogging?: (action: ActionTypes) => boolean);
|
|
19
|
+
handleAction(action: any, state: any): void;
|
|
15
20
|
/** Called when initial state is ready */
|
|
16
21
|
init(state: State<any>): void;
|
|
17
22
|
/** Ensures all subscriptions are cleaned up. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevtoolsManager.d.ts","sourceRoot":"","sources":["../../src/manager/DevtoolsManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DevtoolsManager.d.ts","sourceRoot":"","sources":["../../src/manager/DevtoolsManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,YAAY,EAAE,cAAc,EAAE,CAAC;AAgE/B;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,OAAO;IACrD,UAAkB,UAAU,EAAE,UAAU,CAAC;IACzC,UAAkB,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC;IAC5C,SAAS,CAAC,OAAO,UAAS;IAC1B,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAM;IACxD,UAAkB,UAAU,EAAE,UAAU,CAAC;gBAGvC,MAAM,CAAC,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO;IA8DhD,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;IASpC,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAKtB,gDAAgD;IAChD,OAAO;IAEP;;OAEG;IACH,aAAa;CAGd"}
|
|
@@ -1,25 +1,50 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable no-inner-declarations */
|
|
2
|
+
|
|
2
3
|
import createReducer from '../state/reducer/createReducer.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
return value;
|
|
20
|
-
} : undefined
|
|
4
|
+
let DEFAULT_CONFIG = {};
|
|
5
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
6
|
+
var _globalThis$document;
|
|
7
|
+
const extraEndpointKeys = ['dataExpiryLength', 'errorExpiryLength', 'errorPolicy', 'invalidIfStale', 'pollFrequency', 'getOptimisticResponse', 'update'];
|
|
8
|
+
function serializeEndpoint(endpoint) {
|
|
9
|
+
var _toJSON, _endpoint$schema;
|
|
10
|
+
const serial = {
|
|
11
|
+
name: endpoint.name,
|
|
12
|
+
schema: (_toJSON = (_endpoint$schema = endpoint.schema) == null ? void 0 : _endpoint$schema.toJSON == null ? void 0 : _endpoint$schema.toJSON()) != null ? _toJSON : endpoint.schema,
|
|
13
|
+
sideEffect: endpoint.sideEffect
|
|
14
|
+
};
|
|
15
|
+
extraEndpointKeys.forEach(key => {
|
|
16
|
+
if (key in endpoint) serial[key] = endpoint[key];
|
|
17
|
+
});
|
|
18
|
+
return serial;
|
|
21
19
|
}
|
|
22
|
-
|
|
20
|
+
const HASINTL = typeof Intl !== 'undefined';
|
|
21
|
+
DEFAULT_CONFIG = {
|
|
22
|
+
name: `Data Client: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
|
|
23
|
+
autoPause: true,
|
|
24
|
+
actionSanitizer: action => {
|
|
25
|
+
if (!('endpoint' in action)) return action;
|
|
26
|
+
return {
|
|
27
|
+
...action,
|
|
28
|
+
endpoint: serializeEndpoint(action.endpoint)
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
serialize: {
|
|
32
|
+
options: undefined,
|
|
33
|
+
/* istanbul ignore next */
|
|
34
|
+
replacer: HASINTL ? (key, value) => {
|
|
35
|
+
if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
|
|
36
|
+
return Intl.DateTimeFormat('en-US', {
|
|
37
|
+
hour: 'numeric',
|
|
38
|
+
minute: 'numeric',
|
|
39
|
+
second: 'numeric',
|
|
40
|
+
fractionalSecondDigits: 3
|
|
41
|
+
}).format(value);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
} : undefined
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
23
48
|
|
|
24
49
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
25
50
|
*
|
|
@@ -29,23 +54,55 @@ const DEFAULT_CONFIG = {
|
|
|
29
54
|
*/
|
|
30
55
|
export default class DevToolsManager {
|
|
31
56
|
constructor(config, skipLogging) {
|
|
57
|
+
this.started = false;
|
|
58
|
+
this.actions = [];
|
|
32
59
|
/* istanbul ignore next */
|
|
33
60
|
this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect({
|
|
34
61
|
...DEFAULT_CONFIG,
|
|
35
62
|
config
|
|
36
63
|
});
|
|
64
|
+
if (process.env.NODE_ENV !== 'production' && this.devTools) {
|
|
65
|
+
this.devTools.subscribe(msg => {
|
|
66
|
+
switch (msg.type) {
|
|
67
|
+
case 'START':
|
|
68
|
+
this.started = true;
|
|
69
|
+
if (this.actions.length) {
|
|
70
|
+
this.actions.forEach(([action, state]) => {
|
|
71
|
+
this.handleAction(action, state);
|
|
72
|
+
});
|
|
73
|
+
this.actions = [];
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'STOP':
|
|
77
|
+
this.started = false;
|
|
78
|
+
break;
|
|
79
|
+
case 'DISPATCH':
|
|
80
|
+
if (msg.payload.type === 'RESET') {
|
|
81
|
+
this.controller.resetEntireStore();
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
37
87
|
|
|
38
88
|
/* istanbul ignore if */
|
|
39
89
|
/* istanbul ignore next */
|
|
40
90
|
if (this.devTools) {
|
|
41
91
|
this.middleware = controller => {
|
|
92
|
+
this.controller = controller;
|
|
42
93
|
const reducer = createReducer(controller);
|
|
94
|
+
let state = controller.getState();
|
|
43
95
|
return next => action => {
|
|
44
96
|
const ret = next(action);
|
|
97
|
+
if (this.started) {
|
|
98
|
+
// we track state changes here since getState() will only update after a batch commit
|
|
99
|
+
state = reducer(state, action);
|
|
100
|
+
} else {
|
|
101
|
+
state = controller.getState();
|
|
102
|
+
}
|
|
45
103
|
ret.then(() => {
|
|
46
104
|
if (skipLogging != null && skipLogging(action)) return;
|
|
47
|
-
|
|
48
|
-
this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
|
|
105
|
+
this.handleAction(action, state.optimistic.reduce(reducer, state));
|
|
49
106
|
});
|
|
50
107
|
return ret;
|
|
51
108
|
};
|
|
@@ -54,6 +111,14 @@ export default class DevToolsManager {
|
|
|
54
111
|
this.middleware = () => next => action => next(action);
|
|
55
112
|
}
|
|
56
113
|
}
|
|
114
|
+
handleAction(action, state) {
|
|
115
|
+
if (this.started) {
|
|
116
|
+
this.devTools.send(action, state, undefined, 'RDC');
|
|
117
|
+
} else {
|
|
118
|
+
// queue actions
|
|
119
|
+
this.actions.push([action, state]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
57
122
|
|
|
58
123
|
/** Called when initial state is ready */
|
|
59
124
|
init(state) {
|
|
@@ -71,4 +136,4 @@ export default class DevToolsManager {
|
|
|
71
136
|
return this.middleware;
|
|
72
137
|
}
|
|
73
138
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiSEFTSU5UTCIsIkludGwiLCJERUZBVUxUX0NPTkZJRyIsIm5hbWUiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImdsb2JhbFRoaXMiLCJkb2N1bWVudCIsInRpdGxlIiwiYXV0b1BhdXNlIiwic2VyaWFsaXplIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc0Zpbml0ZSIsImVuZHNXaXRoIiwiRGF0ZVRpbWVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiZnJhY3Rpb25hbFNlY29uZERpZ2l0cyIsImZvcm1hdCIsIkRldlRvb2xzTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwic2tpcExvZ2dpbmciLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwibWlkZGxld2FyZSIsImNvbnRyb2xsZXIiLCJyZWR1Y2VyIiwibmV4dCIsImFjdGlvbiIsInJldCIsInRoZW4iLCJzdGF0ZSIsImdldFN0YXRlIiwic2VuZCIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiLCJpbml0IiwiY2xlYW51cCIsImdldE1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IGNyZWF0ZVJlZHVjZXIgZnJvbSAnLi4vc3RhdGUvcmVkdWNlci9jcmVhdGVSZWR1Y2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuYWdlciwgU3RhdGUsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IERldlRvb2xzQ29uZmlnIH07XG5cbmNvbnN0IEhBU0lOVEwgPSB0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcbiAgbmFtZTogYFJEQzogJHtnbG9iYWxUaGlzLmRvY3VtZW50Py50aXRsZX1gLFxuICBhdXRvUGF1c2U6IHRydWUsXG4gIHNlcmlhbGl6ZToge1xuICAgIG9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlcGxhY2VyOiBIQVNJTlRMXG4gICAgICA/IChrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAoa2V5ID09PSAnZGF0ZScgfHwga2V5LmVuZHNXaXRoKCdBdCcpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgZnJhY3Rpb25hbFNlY29uZERpZ2l0czogMyxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKiogSW50ZWdyYXRlcyB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzXG4gKlxuICogT3B0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVkdXgtZGV2dG9vbHMvYmxvYi9tYWluL2V4dGVuc2lvbi9kb2NzL0FQSS9Bcmd1bWVudHMubWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBkZWNsYXJlIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLmRldlRvb2xzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdCh7XG4gICAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgICBjb25maWcsXG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZXZUb29scy5zZW5kKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnUkRDJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9ICgpID0+IG5leHQgPT4gYWN0aW9uID0+IG5leHQoYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gaW5pdGlhbCBzdGF0ZSBpcyByZWFkeSAqL1xuICBpbml0KHN0YXRlOiBTdGF0ZTxhbnk+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHRoaXMuZGV2VG9vbHMuaW5pdChzdGF0ZSk7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHt9XG5cbiAgLyoqIEF0dGFjaGVzIE1hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsT0FBT0EsYUFBYSxNQUFNLG1DQUFtQztBQUs3RCxNQUFNQyxPQUFPLEdBQUcsT0FBT0MsSUFBSSxL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
|
|
139
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwic3RhcnRlZCIsImFjdGlvbnMiLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0Iiwic3Vic2NyaWJlIiwibXNnIiwidHlwZSIsImxlbmd0aCIsInN0YXRlIiwiaGFuZGxlQWN0aW9uIiwicGF5bG9hZCIsImNvbnRyb2xsZXIiLCJyZXNldEVudGlyZVN0b3JlIiwibWlkZGxld2FyZSIsInJlZHVjZXIiLCJnZXRTdGF0ZSIsIm5leHQiLCJyZXQiLCJ0aGVuIiwib3B0aW1pc3RpYyIsInJlZHVjZSIsInNlbmQiLCJwdXNoIiwiaW5pdCIsImNsZWFudXAiLCJnZXRNaWRkbGV3YXJlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvRGV2dG9vbHNNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWlubmVyLWRlY2xhcmF0aW9ucyAqL1xuaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgRW5kcG9pbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVkdWNlciBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VyLCBTdGF0ZSwgQWN0aW9uVHlwZXMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfTtcblxubGV0IERFRkFVTFRfQ09ORklHID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGNvbnN0IGV4dHJhRW5kcG9pbnRLZXlzID0gW1xuICAgICdkYXRhRXhwaXJ5TGVuZ3RoJyxcbiAgICAnZXJyb3JFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvclBvbGljeScsXG4gICAgJ2ludmFsaWRJZlN0YWxlJyxcbiAgICAncG9sbEZyZXF1ZW5jeScsXG4gICAgJ2dldE9wdGltaXN0aWNSZXNwb25zZScsXG4gICAgJ3VwZGF0ZScsXG4gIF07XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplRW5kcG9pbnQoZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlKSB7XG4gICAgY29uc3Qgc2VyaWFsOiBhbnkgPSB7XG4gICAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgICAgc2NoZW1hOiAoZW5kcG9pbnQuc2NoZW1hIGFzIGFueSk/LnRvSlNPTj8uKCkgPz8gZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgc2lkZUVmZmVjdDogZW5kcG9pbnQuc2lkZUVmZmVjdCxcbiAgICB9O1xuICAgIGV4dHJhRW5kcG9pbnRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZW5kcG9pbnQpXG4gICAgICAgIHNlcmlhbFtrZXldID0gZW5kcG9pbnRba2V5IGFzIGtleW9mIEVuZHBvaW50SW50ZXJmYWNlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VyaWFsO1xuICB9XG5cbiAgY29uc3QgSEFTSU5UTCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgbmFtZTogYERhdGEgQ2xpZW50OiAke2dsb2JhbFRoaXMuZG9jdW1lbnQ/LnRpdGxlfWAsXG4gICAgYXV0b1BhdXNlOiB0cnVlLFxuICAgIGFjdGlvblNhbml0aXplcjogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IHtcbiAgICAgIGlmICghKCdlbmRwb2ludCcgaW4gYWN0aW9uKSkgcmV0dXJuIGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNlcmlhbGl6ZUVuZHBvaW50KGFjdGlvbi5lbmRwb2ludCksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiB7XG4gICAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmVwbGFjZXI6IEhBU0lOVExcbiAgICAgICAgPyAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgIChrZXkgPT09ICdkYXRlJyB8fCBrZXkuZW5kc1dpdGgoJ0F0JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvRGV2VG9vbHNNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldlRvb2xzTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBkZXZUb29sczogdW5kZWZpbmVkIHwgYW55O1xuICBwcm90ZWN0ZWQgc3RhcnRlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYWN0aW9uczogW0FjdGlvblR5cGVzLCBTdGF0ZTx1bmtub3duPl1bXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZz86IERldlRvb2xzQ29uZmlnLFxuICAgIHNraXBMb2dnaW5nPzogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5kZXZUb29scyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3Qoe1xuICAgICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdTVEFSVCc6XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoW2FjdGlvbiwgc3RhdGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ1NUT1AnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdESVNQQVRDSCc6XG4gICAgICAgICAgICBpZiAobXNnLnBheWxvYWQudHlwZSA9PT0gJ1JFU0VUJykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXRFbnRpcmVTdG9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCByZXQgPSBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgLy8gd2UgdHJhY2sgc3RhdGUgY2hhbmdlcyBoZXJlIHNpbmNlIGdldFN0YXRlKCkgd2lsbCBvbmx5IHVwZGF0ZSBhZnRlciBhIGJhdGNoIGNvbW1pdFxuICAgICAgICAgICAgc3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNraXBMb2dnaW5nPy4oYWN0aW9uKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZS5vcHRpbWlzdGljLnJlZHVjZShyZWR1Y2VyLCBzdGF0ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5kZXZUb29scy5zZW5kKGFjdGlvbiwgc3RhdGUsIHVuZGVmaW5lZCwgJ1JEQycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBxdWV1ZSBhY3Rpb25zXG4gICAgICB0aGlzLmFjdGlvbnMucHVzaChbYWN0aW9uLCBzdGF0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBpbml0aWFsIHN0YXRlIGlzIHJlYWR5ICovXG4gIGluaXQoc3RhdGU6IFN0YXRlPGFueT4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5kZXZUb29scykgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIGFsbCBzdWJzY3JpcHRpb25zIGFyZSBjbGVhbmVkIHVwLiAqL1xuICBjbGVhbnVwKCkge31cblxuICAvKiogQXR0YWNoZXMgTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKi9cbiAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUlBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2QixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxLQUFLLFlBQVksRUFBRTtFQUFBLElBQUFDLG9CQUFBO0VBQ3pDLE1BQU1DLGlCQUFpQixHQUFHLENBQ3hCLGtC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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@data-client/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "High performance reactive framework for async data.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -112,15 +112,15 @@
|
|
|
112
112
|
"homepage": "https://dataclient.io",
|
|
113
113
|
"repository": {
|
|
114
114
|
"type": "git",
|
|
115
|
-
"url": "git+ssh://git@github.com:
|
|
115
|
+
"url": "git+ssh://git@github.com:reactive/data-client.git",
|
|
116
116
|
"directory": "packages/core"
|
|
117
117
|
},
|
|
118
118
|
"bugs": {
|
|
119
|
-
"url": "https://github.com/
|
|
119
|
+
"url": "https://github.com/reactive/data-client/issues"
|
|
120
120
|
},
|
|
121
121
|
"dependencies": {
|
|
122
122
|
"@babel/runtime": "^7.17.0",
|
|
123
|
-
"@data-client/normalizr": "^0.
|
|
123
|
+
"@data-client/normalizr": "^0.9.2",
|
|
124
124
|
"flux-standard-action": "^2.1.1"
|
|
125
125
|
},
|
|
126
126
|
"devDependencies": {
|
|
@@ -1,37 +1,73 @@
|
|
|
1
|
+
/* eslint-disable no-inner-declarations */
|
|
1
2
|
import type { DevToolsConfig } from './devtoolsTypes.js';
|
|
2
3
|
import type { Middleware } from './LogoutManager.js';
|
|
4
|
+
import { Controller, EndpointInterface } from '../index.js';
|
|
3
5
|
import createReducer from '../state/reducer/createReducer.js';
|
|
4
6
|
import type { Manager, State, ActionTypes } from '../types.js';
|
|
5
7
|
|
|
6
8
|
export type { DevToolsConfig };
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
let DEFAULT_CONFIG = {};
|
|
11
|
+
|
|
12
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
13
|
+
const extraEndpointKeys = [
|
|
14
|
+
'dataExpiryLength',
|
|
15
|
+
'errorExpiryLength',
|
|
16
|
+
'errorPolicy',
|
|
17
|
+
'invalidIfStale',
|
|
18
|
+
'pollFrequency',
|
|
19
|
+
'getOptimisticResponse',
|
|
20
|
+
'update',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
function serializeEndpoint(endpoint: EndpointInterface) {
|
|
24
|
+
const serial: any = {
|
|
25
|
+
name: endpoint.name,
|
|
26
|
+
schema: (endpoint.schema as any)?.toJSON?.() ?? endpoint.schema,
|
|
27
|
+
sideEffect: endpoint.sideEffect,
|
|
28
|
+
};
|
|
29
|
+
extraEndpointKeys.forEach(key => {
|
|
30
|
+
if (key in endpoint)
|
|
31
|
+
serial[key] = endpoint[key as keyof EndpointInterface];
|
|
32
|
+
});
|
|
33
|
+
return serial;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const HASINTL = typeof Intl !== 'undefined';
|
|
37
|
+
DEFAULT_CONFIG = {
|
|
38
|
+
name: `Data Client: ${globalThis.document?.title}`,
|
|
39
|
+
autoPause: true,
|
|
40
|
+
actionSanitizer: (action: ActionTypes) => {
|
|
41
|
+
if (!('endpoint' in action)) return action;
|
|
42
|
+
return {
|
|
43
|
+
...action,
|
|
44
|
+
endpoint: serializeEndpoint(action.endpoint),
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
serialize: {
|
|
48
|
+
options: undefined,
|
|
49
|
+
/* istanbul ignore next */
|
|
50
|
+
replacer: HASINTL
|
|
51
|
+
? (key: string | number | symbol, value: unknown) => {
|
|
52
|
+
if (
|
|
53
|
+
typeof value === 'number' &&
|
|
54
|
+
typeof key === 'string' &&
|
|
55
|
+
isFinite(value) &&
|
|
56
|
+
(key === 'date' || key.endsWith('At'))
|
|
57
|
+
) {
|
|
58
|
+
return Intl.DateTimeFormat('en-US', {
|
|
59
|
+
hour: 'numeric',
|
|
60
|
+
minute: 'numeric',
|
|
61
|
+
second: 'numeric',
|
|
62
|
+
fractionalSecondDigits: 3,
|
|
63
|
+
}).format(value);
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
29
66
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
67
|
+
: undefined,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
35
71
|
|
|
36
72
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
37
73
|
*
|
|
@@ -42,6 +78,9 @@ const DEFAULT_CONFIG = {
|
|
|
42
78
|
export default class DevToolsManager implements Manager {
|
|
43
79
|
protected declare middleware: Middleware;
|
|
44
80
|
protected declare devTools: undefined | any;
|
|
81
|
+
protected started = false;
|
|
82
|
+
protected actions: [ActionTypes, State<unknown>][] = [];
|
|
83
|
+
protected declare controller: Controller;
|
|
45
84
|
|
|
46
85
|
constructor(
|
|
47
86
|
config?: DevToolsConfig,
|
|
@@ -55,23 +94,49 @@ export default class DevToolsManager implements Manager {
|
|
|
55
94
|
...DEFAULT_CONFIG,
|
|
56
95
|
config,
|
|
57
96
|
});
|
|
97
|
+
if (process.env.NODE_ENV !== 'production' && this.devTools) {
|
|
98
|
+
this.devTools.subscribe((msg: any) => {
|
|
99
|
+
switch (msg.type) {
|
|
100
|
+
case 'START':
|
|
101
|
+
this.started = true;
|
|
102
|
+
|
|
103
|
+
if (this.actions.length) {
|
|
104
|
+
this.actions.forEach(([action, state]) => {
|
|
105
|
+
this.handleAction(action, state);
|
|
106
|
+
});
|
|
107
|
+
this.actions = [];
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case 'STOP':
|
|
111
|
+
this.started = false;
|
|
112
|
+
break;
|
|
113
|
+
case 'DISPATCH':
|
|
114
|
+
if (msg.payload.type === 'RESET') {
|
|
115
|
+
this.controller.resetEntireStore();
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
58
121
|
|
|
59
122
|
/* istanbul ignore if */
|
|
60
123
|
/* istanbul ignore next */
|
|
61
124
|
if (this.devTools) {
|
|
62
125
|
this.middleware = controller => {
|
|
126
|
+
this.controller = controller;
|
|
63
127
|
const reducer = createReducer(controller as any);
|
|
128
|
+
let state = controller.getState();
|
|
64
129
|
return next => action => {
|
|
65
130
|
const ret = next(action);
|
|
131
|
+
if (this.started) {
|
|
132
|
+
// we track state changes here since getState() will only update after a batch commit
|
|
133
|
+
state = reducer(state, action);
|
|
134
|
+
} else {
|
|
135
|
+
state = controller.getState();
|
|
136
|
+
}
|
|
66
137
|
ret.then(() => {
|
|
67
138
|
if (skipLogging?.(action)) return;
|
|
68
|
-
|
|
69
|
-
this.devTools.send(
|
|
70
|
-
action,
|
|
71
|
-
state.optimistic.reduce(reducer, state),
|
|
72
|
-
undefined,
|
|
73
|
-
'RDC',
|
|
74
|
-
);
|
|
139
|
+
this.handleAction(action, state.optimistic.reduce(reducer, state));
|
|
75
140
|
});
|
|
76
141
|
return ret;
|
|
77
142
|
};
|
|
@@ -81,6 +146,15 @@ export default class DevToolsManager implements Manager {
|
|
|
81
146
|
}
|
|
82
147
|
}
|
|
83
148
|
|
|
149
|
+
handleAction(action: any, state: any) {
|
|
150
|
+
if (this.started) {
|
|
151
|
+
this.devTools.send(action, state, undefined, 'RDC');
|
|
152
|
+
} else {
|
|
153
|
+
// queue actions
|
|
154
|
+
this.actions.push([action, state]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
84
158
|
/** Called when initial state is ready */
|
|
85
159
|
init(state: State<any>) {
|
|
86
160
|
/* istanbul ignore if */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DevToolsConfig } from './devtoolsTypes.js';
|
|
2
2
|
import { Middleware } from './LogoutManager.js';
|
|
3
|
+
import { Controller } from '../index.js';
|
|
3
4
|
import { Manager, State, ActionTypes } from '../types.js';
|
|
4
5
|
export { DevToolsConfig };
|
|
5
6
|
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
@@ -11,7 +12,14 @@ export { DevToolsConfig };
|
|
|
11
12
|
export default class DevToolsManager implements Manager {
|
|
12
13
|
protected middleware: Middleware;
|
|
13
14
|
protected devTools: undefined | any;
|
|
15
|
+
protected started: boolean;
|
|
16
|
+
protected actions: [
|
|
17
|
+
ActionTypes,
|
|
18
|
+
State<unknown>
|
|
19
|
+
][];
|
|
20
|
+
protected controller: Controller;
|
|
14
21
|
constructor(config?: DevToolsConfig, skipLogging?: (action: ActionTypes) => boolean);
|
|
22
|
+
handleAction(action: any, state: any): void;
|
|
15
23
|
/** Called when initial state is ready */
|
|
16
24
|
init(state: State<any>): void;
|
|
17
25
|
/** Ensures all subscriptions are cleaned up. */
|