@data-client/core 0.8.0 → 0.9.0

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/dist/index.js CHANGED
@@ -1261,27 +1261,51 @@ class SubscriptionManager {
1261
1261
  }
1262
1262
  }
1263
1263
 
1264
- var _globalThis$document;
1265
- const HASINTL = typeof Intl !== 'undefined';
1266
- const DEFAULT_CONFIG = {
1267
- name: `RDC: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
1268
- autoPause: true,
1269
- serialize: {
1270
- options: undefined,
1271
- /* istanbul ignore next */
1272
- replacer: HASINTL ? (key, value) => {
1273
- if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
1274
- return Intl.DateTimeFormat('en-US', {
1275
- hour: 'numeric',
1276
- minute: 'numeric',
1277
- second: 'numeric',
1278
- fractionalSecondDigits: 3
1279
- }).format(value);
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,49 @@ 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);
1305
1355
  return next => action => {
1306
1356
  const ret = next(action);
1307
1357
  ret.then(() => {
1308
1358
  if (skipLogging != null && skipLogging(action)) return;
1309
1359
  const state = controller.getState();
1310
- this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
1360
+ this.handleAction(action, state.optimistic.reduce(reducer, state));
1311
1361
  });
1312
1362
  return ret;
1313
1363
  };
@@ -1316,6 +1366,14 @@ class DevToolsManager {
1316
1366
  this.middleware = () => next => action => next(action);
1317
1367
  }
1318
1368
  }
1369
+ handleAction(action, state) {
1370
+ if (this.started) {
1371
+ this.devTools.send(action, state, undefined, 'RDC');
1372
+ } else {
1373
+ // queue actions
1374
+ this.actions.push([action, state]);
1375
+ }
1376
+ }
1319
1377
 
1320
1378
  /** Called when initial state is ready */
1321
1379
  init(state) {
@@ -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 w=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},S=()=>v;class A{constructor({dispatch:e=w,getState:s=S,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);return i=>r=>{const n=i(r);return n.then((()=>{if(null!=t&&t(r))return;const i=e.getState();this.handleAction(r,i.optimistic.reduce(s,i))})),n}}: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
- var _globalThis$document;
1
+ /* eslint-disable no-inner-declarations */
2
+
2
3
  import createReducer from '../state/reducer/createReducer.js';
3
- const HASINTL = typeof Intl !== 'undefined';
4
- const DEFAULT_CONFIG = {
5
- name: `RDC: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
6
- autoPause: true,
7
- serialize: {
8
- options: undefined,
9
- /* istanbul ignore next */
10
- replacer: HASINTL ? (key, value) => {
11
- if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
12
- return Intl.DateTimeFormat('en-US', {
13
- hour: 'numeric',
14
- minute: 'numeric',
15
- second: 'numeric',
16
- fractionalSecondDigits: 3
17
- }).format(value);
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,48 @@ 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);
42
92
  return next => action => {
43
93
  const ret = next(action);
44
94
  ret.then(() => {
45
95
  if (skipLogging != null && skipLogging(action)) return;
46
96
  const state = controller.getState();
47
- this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
97
+ this.handleAction(action, state.optimistic.reduce(reducer, state));
48
98
  });
49
99
  return ret;
50
100
  };
@@ -53,6 +103,14 @@ export default class DevToolsManager {
53
103
  this.middleware = () => next => action => next(action);
54
104
  }
55
105
  }
106
+ handleAction(action, state) {
107
+ if (this.started) {
108
+ this.devTools.send(action, state, undefined, 'RDC');
109
+ } else {
110
+ // queue actions
111
+ this.actions.push([action, state]);
112
+ }
113
+ }
56
114
 
57
115
  /** Called when initial state is ready */
58
116
  init(state) {
@@ -70,4 +128,4 @@ export default class DevToolsManager {
70
128
  return this.middleware;
71
129
  }
72
130
  }
73
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiSEFTSU5UTCIsIkludGwiLCJERUZBVUxUX0NPTkZJRyIsIm5hbWUiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImdsb2JhbFRoaXMiLCJkb2N1bWVudCIsInRpdGxlIiwiYXV0b1BhdXNlIiwic2VyaWFsaXplIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc0Zpbml0ZSIsImVuZHNXaXRoIiwiRGF0ZVRpbWVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiZnJhY3Rpb25hbFNlY29uZERpZ2l0cyIsImZvcm1hdCIsIkRldlRvb2xzTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwic2tpcExvZ2dpbmciLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwiT2JqZWN0IiwiYXNzaWduIiwibWlkZGxld2FyZSIsImNvbnRyb2xsZXIiLCJyZWR1Y2VyIiwibmV4dCIsImFjdGlvbiIsInJldCIsInRoZW4iLCJzdGF0ZSIsImdldFN0YXRlIiwic2VuZCIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiLCJpbml0IiwiY2xlYW51cCIsImdldE1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IGNyZWF0ZVJlZHVjZXIgZnJvbSAnLi4vc3RhdGUvcmVkdWNlci9jcmVhdGVSZWR1Y2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuYWdlciwgU3RhdGUsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IERldlRvb2xzQ29uZmlnIH07XG5cbmNvbnN0IEhBU0lOVEwgPSB0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcbiAgbmFtZTogYFJEQzogJHtnbG9iYWxUaGlzLmRvY3VtZW50Py50aXRsZX1gLFxuICBhdXRvUGF1c2U6IHRydWUsXG4gIHNlcmlhbGl6ZToge1xuICAgIG9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlcGxhY2VyOiBIQVNJTlRMXG4gICAgICA/IChrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAoa2V5ID09PSAnZGF0ZScgfHwga2V5LmVuZHNXaXRoKCdBdCcpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgZnJhY3Rpb25hbFNlY29uZERpZ2l0czogMyxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKiogSW50ZWdyYXRlcyB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzXG4gKlxuICogT3B0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVkdXgtZGV2dG9vbHMvYmxvYi9tYWluL2V4dGVuc2lvbi9kb2NzL0FQSS9Bcmd1bWVudHMubWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBkZWNsYXJlIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLmRldlRvb2xzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdCh7XG4gICAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgICBjb25maWcsXG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZXZUb29scy5zZW5kKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnUkRDJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9ICgpID0+IG5leHQgPT4gYWN0aW9uID0+IG5leHQoYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gaW5pdGlhbCBzdGF0ZSBpcyByZWFkeSAqL1xuICBpbml0KHN0YXRlOiBTdGF0ZTxhbnk+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHRoaXMuZGV2VG9vbHMuaW5pdChzdGF0ZSk7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHt9XG5cbiAgLyoqIEF0dGFjaGVzIE1hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsT0FBT0EsYUFBYSxNQUFNLG1DQUFtQztBQUs3RCxNQUFNQyxPQUFP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
131
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsIk9iamVjdCIsImFzc2lnbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwic3RhcnRlZCIsImFjdGlvbnMiLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0Iiwic3Vic2NyaWJlIiwibXNnIiwidHlwZSIsImxlbmd0aCIsInN0YXRlIiwiaGFuZGxlQWN0aW9uIiwicGF5bG9hZCIsImNvbnRyb2xsZXIiLCJyZXNldEVudGlyZVN0b3JlIiwibWlkZGxld2FyZSIsInJlZHVjZXIiLCJuZXh0IiwicmV0IiwidGhlbiIsImdldFN0YXRlIiwib3B0aW1pc3RpYyIsInJlZHVjZSIsInNlbmQiLCJwdXNoIiwiaW5pdCIsImNsZWFudXAiLCJnZXRNaWRkbGV3YXJlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvRGV2dG9vbHNNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWlubmVyLWRlY2xhcmF0aW9ucyAqL1xuaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgRW5kcG9pbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVkdWNlciBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VyLCBTdGF0ZSwgQWN0aW9uVHlwZXMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfTtcblxubGV0IERFRkFVTFRfQ09ORklHID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGNvbnN0IGV4dHJhRW5kcG9pbnRLZXlzID0gW1xuICAgICdkYXRhRXhwaXJ5TGVuZ3RoJyxcbiAgICAnZXJyb3JFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvclBvbGljeScsXG4gICAgJ2ludmFsaWRJZlN0YWxlJyxcbiAgICAncG9sbEZyZXF1ZW5jeScsXG4gICAgJ2dldE9wdGltaXN0aWNSZXNwb25zZScsXG4gICAgJ3VwZGF0ZScsXG4gIF07XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplRW5kcG9pbnQoZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlKSB7XG4gICAgY29uc3Qgc2VyaWFsOiBhbnkgPSB7XG4gICAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgICAgc2NoZW1hOiAoZW5kcG9pbnQuc2NoZW1hIGFzIGFueSk/LnRvSlNPTj8uKCkgPz8gZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgc2lkZUVmZmVjdDogZW5kcG9pbnQuc2lkZUVmZmVjdCxcbiAgICB9O1xuICAgIGV4dHJhRW5kcG9pbnRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZW5kcG9pbnQpXG4gICAgICAgIHNlcmlhbFtrZXldID0gZW5kcG9pbnRba2V5IGFzIGtleW9mIEVuZHBvaW50SW50ZXJmYWNlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VyaWFsO1xuICB9XG5cbiAgY29uc3QgSEFTSU5UTCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgbmFtZTogYERhdGEgQ2xpZW50OiAke2dsb2JhbFRoaXMuZG9jdW1lbnQ/LnRpdGxlfWAsXG4gICAgYXV0b1BhdXNlOiB0cnVlLFxuICAgIGFjdGlvblNhbml0aXplcjogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IHtcbiAgICAgIGlmICghKCdlbmRwb2ludCcgaW4gYWN0aW9uKSkgcmV0dXJuIGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNlcmlhbGl6ZUVuZHBvaW50KGFjdGlvbi5lbmRwb2ludCksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiB7XG4gICAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmVwbGFjZXI6IEhBU0lOVExcbiAgICAgICAgPyAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgIChrZXkgPT09ICdkYXRlJyB8fCBrZXkuZW5kc1dpdGgoJ0F0JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvRGV2VG9vbHNNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldlRvb2xzTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBkZXZUb29sczogdW5kZWZpbmVkIHwgYW55O1xuICBwcm90ZWN0ZWQgc3RhcnRlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYWN0aW9uczogW0FjdGlvblR5cGVzLCBTdGF0ZTx1bmtub3duPl1bXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZz86IERldlRvb2xzQ29uZmlnLFxuICAgIHNraXBMb2dnaW5nPzogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5kZXZUb29scyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3Qoe1xuICAgICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdTVEFSVCc6XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoW2FjdGlvbiwgc3RhdGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ1NUT1AnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdESVNQQVRDSCc6XG4gICAgICAgICAgICBpZiAobXNnLnBheWxvYWQudHlwZSA9PT0gJ1JFU0VUJykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXRFbnRpcmVTdG9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZS5vcHRpbWlzdGljLnJlZHVjZShyZWR1Y2VyLCBzdGF0ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5kZXZUb29scy5zZW5kKGFjdGlvbiwgc3RhdGUsIHVuZGVmaW5lZCwgJ1JEQycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBxdWV1ZSBhY3Rpb25zXG4gICAgICB0aGlzLmFjdGlvbnMucHVzaChbYWN0aW9uLCBzdGF0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBpbml0aWFsIHN0YXRlIGlzIHJlYWR5ICovXG4gIGluaXQoc3RhdGU6IFN0YXRlPGFueT4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5kZXZUb29scykgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIGFsbCBzdWJzY3JpcHRpb25zIGFyZSBjbGVhbmVkIHVwLiAqL1xuICBjbGVhbnVwKCkge31cblxuICAvKiogQXR0YWNoZXMgTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKi9cbiAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUlBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2QixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxLQUFLLFlBQVksRUFBRTtFQUFBLElBQUFDLG9CQUFBO0VBQ3pDLE1BQU1DLGlCQUFpQixHQUFHLENBQ3hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFFBQVEsQ0FDVDtFQUVELFNBQVNDLGlCQUFpQkEsQ0FBQ0MsUUFBMkIsRUFBRTtJQUFBLElBQUFDLE9BQUEsRUFBQUMsZ0JBQUE7SUFDdEQsTUFBTUMsTUFBVyxHQUFHO01BQ2xCQyxJQUFJLEVBQUVKLFFBQVEsQ0FBQ0ksSUFBSTtNQUNuQkMsTUFBTSxHQUFBSixPQUFBLElBQUFD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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":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,YAAY,EAAE,cAAc,EAAE,CAAC;AA8B/B;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,OAAO;IACrD,UAAkB,UAAU,EAAE,UAAU,CAAC;IACzC,UAAkB,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC;gBAG1C,MAAM,CAAC,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO;IAoChD,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAKtB,gDAAgD;IAChD,OAAO;IAEP;;OAEG;IACH,aAAa;CAGd"}
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;IAwDhD,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
- var _globalThis$document;
1
+ /* eslint-disable no-inner-declarations */
2
+
2
3
  import createReducer from '../state/reducer/createReducer.js';
3
- const HASINTL = typeof Intl !== 'undefined';
4
- const DEFAULT_CONFIG = {
5
- name: `RDC: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
6
- autoPause: true,
7
- serialize: {
8
- options: undefined,
9
- /* istanbul ignore next */
10
- replacer: HASINTL ? (key, value) => {
11
- if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
12
- return Intl.DateTimeFormat('en-US', {
13
- hour: 'numeric',
14
- minute: 'numeric',
15
- second: 'numeric',
16
- fractionalSecondDigits: 3
17
- }).format(value);
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,49 @@ 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);
43
94
  return next => action => {
44
95
  const ret = next(action);
45
96
  ret.then(() => {
46
97
  if (skipLogging != null && skipLogging(action)) return;
47
98
  const state = controller.getState();
48
- this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'RDC');
99
+ this.handleAction(action, state.optimistic.reduce(reducer, state));
49
100
  });
50
101
  return ret;
51
102
  };
@@ -54,6 +105,14 @@ export default class DevToolsManager {
54
105
  this.middleware = () => next => action => next(action);
55
106
  }
56
107
  }
108
+ handleAction(action, state) {
109
+ if (this.started) {
110
+ this.devTools.send(action, state, undefined, 'RDC');
111
+ } else {
112
+ // queue actions
113
+ this.actions.push([action, state]);
114
+ }
115
+ }
57
116
 
58
117
  /** Called when initial state is ready */
59
118
  init(state) {
@@ -71,4 +130,4 @@ export default class DevToolsManager {
71
130
  return this.middleware;
72
131
  }
73
132
  }
74
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiSEFTSU5UTCIsIkludGwiLCJERUZBVUxUX0NPTkZJRyIsIm5hbWUiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImdsb2JhbFRoaXMiLCJkb2N1bWVudCIsInRpdGxlIiwiYXV0b1BhdXNlIiwic2VyaWFsaXplIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc0Zpbml0ZSIsImVuZHNXaXRoIiwiRGF0ZVRpbWVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiZnJhY3Rpb25hbFNlY29uZERpZ2l0cyIsImZvcm1hdCIsIkRldlRvb2xzTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwic2tpcExvZ2dpbmciLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwibWlkZGxld2FyZSIsImNvbnRyb2xsZXIiLCJyZWR1Y2VyIiwibmV4dCIsImFjdGlvbiIsInJldCIsInRoZW4iLCJzdGF0ZSIsImdldFN0YXRlIiwic2VuZCIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiLCJpbml0IiwiY2xlYW51cCIsImdldE1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IGNyZWF0ZVJlZHVjZXIgZnJvbSAnLi4vc3RhdGUvcmVkdWNlci9jcmVhdGVSZWR1Y2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuYWdlciwgU3RhdGUsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IERldlRvb2xzQ29uZmlnIH07XG5cbmNvbnN0IEhBU0lOVEwgPSB0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcbiAgbmFtZTogYFJEQzogJHtnbG9iYWxUaGlzLmRvY3VtZW50Py50aXRsZX1gLFxuICBhdXRvUGF1c2U6IHRydWUsXG4gIHNlcmlhbGl6ZToge1xuICAgIG9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlcGxhY2VyOiBIQVNJTlRMXG4gICAgICA/IChrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAoa2V5ID09PSAnZGF0ZScgfHwga2V5LmVuZHNXaXRoKCdBdCcpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgZnJhY3Rpb25hbFNlY29uZERpZ2l0czogMyxcbiAgICAgICAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKiogSW50ZWdyYXRlcyB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzXG4gKlxuICogT3B0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVkdXgtZGV2dG9vbHMvYmxvYi9tYWluL2V4dGVuc2lvbi9kb2NzL0FQSS9Bcmd1bWVudHMubWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBkZWNsYXJlIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLmRldlRvb2xzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdCh7XG4gICAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgICBjb25maWcsXG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZXZUb29scy5zZW5kKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnUkRDJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9ICgpID0+IG5leHQgPT4gYWN0aW9uID0+IG5leHQoYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gaW5pdGlhbCBzdGF0ZSBpcyByZWFkeSAqL1xuICBpbml0KHN0YXRlOiBTdGF0ZTxhbnk+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHRoaXMuZGV2VG9vbHMuaW5pdChzdGF0ZSk7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHt9XG5cbiAgLyoqIEF0dGFjaGVzIE1hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsT0FBT0EsYUFBYSxNQUFNLG1DQUFtQztBQUs3RCxNQUFNQyxPQUFPLEdBQUcsT0FBT0MsSUFBSSxLQUFLLFdBQVc7QUFDM0MsTUFBTUMsY0FBYyxHQUFHO0VBQ3JCQyxJQUFJLEVBQUcsUUFBSyxDQUFBQyxvQkFBQSxHQUFFQyxVQUFVLENBQUNDLFFBQVEscUJBQW5CRixvQkFBQSxDQUFxQkcsS0FBTSxFQUFDO0VBQzFDQyxTQUFTLEVBQUUsSUFBSTtFQUNmQyxTQUFTLEVBQUU7SUFDVEMsT0FBTyxFQUFFQyxTQUFTO0lBQ2xCO0lBQ0FDLFFBQVEsRUFBRVosT0FBTyxHQUNiLENBQUNhLEdBQTZCLEVBQUVDLEtBQWMsS0FBSztNQUNqRCxJQUNFLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQ3pCLE9BQU9ELEdBQUcsS0FBSyxRQUFRLElBQ3ZCRSxRQUFRLENBQUNELEtBQUssQ0FBQyxLQUNkRCxHQUFHLEtBQUssTUFBTSxJQUFJQSxHQUFHLENBQUNHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN0QztRQUNBLE9BQU9mLElBQUksQ0FBQ2dCLGNBQWMsQ0FBQyxPQUFPLEVBQUU7VUFDbENDLElBQUksRUFBRSxTQUFTO1VBQ2ZDLE1BQU0sRUFBRSxTQUFTO1VBQ2pCQyxNQUFNLEVBQUUsU0FBUztVQUNqQkMsc0JBQXNCLEVBQUU7UUFDMUIsQ0FBQyxDQUFDLENBQUNDLE1BQU0sQ0FBQ1IsS0FBSyxDQUFDO01BQ2xCO01BQ0EsT0FBT0EsS0FBSztJQUNkLENBQUMsR0FDREg7RUFDTjtBQUNGLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFNWSxlQUFlLENBQW9CO0VBSXREQyxXQUFXQSxDQUNUQyxNQUF1QixFQUN2QkMsV0FBOEMsRUFDOUM7SUFDQTtJQUNBLElBQUksQ0FBQ0MsUUFBUSxHQUNYLE9BQU9DLE1BQU0sS0FBSyxXQUFXLElBQzVCQSxNQUFNLENBQVNDLDRCQUE0QixJQUMzQ0QsTUFBTSxDQUFTQyw0QkFBNEIsQ0FBQ0MsT0FBTyxDQUFDO01BQ25ELEdBQUc1QixjQUFjO01BQ2pCdUI7SUFDRixDQUFDLENBQUM7O0lBRUo7SUFDQTtJQUNBLElBQUksSUFBSSxDQUFDRSxRQUFRLEVBQUU7TUFDakIsSUFBSSxDQUFDSSxVQUFVLEdBQUdDLFVBQVUsSUFBSTtRQUM5QixNQUFNQyxPQUFPLEdBQUdsQyxhQUFhLENBQUNpQyxVQUFpQixDQUFDO1FBQ2hELE9BQU9FLElBQUksSUFBSUMsTUFBTSxJQUFJO1VBQ3ZCLE1BQU1DLEdBQUcsR0FBR0YsSUFBSSxDQUFDQyxNQUFNLENBQUM7VUFDeEJDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLE1BQU07WUFDYixJQUFJWCxXQUFXLFlBQVhBLFdBQVcsQ0FBR1MsTUFBTSxDQUFDLEVBQUU7WUFDM0IsTUFBTUcsS0FBSyxHQUFHTixVQUFVLENBQUNPLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQ1osUUFBUSxDQUFDYSxJQUFJLENBQ2hCTCxNQUFNLEVBQ05HLEtBQUssQ0FBQ0csVUFBVSxDQUFDQyxNQUFNLENBQUNULE9BQU8sRUFBRUssS0FBSyxDQUFDLEVBQ3ZDM0IsU0FBUyxFQUNULEtBQ0YsQ0FBQztVQUNILENBQUMsQ0FBQztVQUNGLE9BQU95QixHQUFHO1FBQ1osQ0FBQztNQUNILENBQUM7SUFDSCxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNMLFVBQVUsR0FBRyxNQUFNRyxJQUFJLElBQUlDLE1BQU0sSUFBSUQsSUFBSSxDQUFDQyxNQUFNLENBQUM7SUFDeEQ7RUFDRjs7RUFFQTtFQUNBUSxJQUFJQSxDQUFDTCxLQUFpQixFQUFFO0lBQ3RCO0lBQ0EsSUFBSSxJQUFJLENBQUNYLFFBQVEsRUFBRSxJQUFJLENBQUNBLFFBQVEsQ0FBQ2dCLElBQUksQ0FBQ0wsS0FBSyxDQUFDO0VBQzlDOztFQUVBO0VBQ0FNLE9BQU9BLENBQUEsRUFBRyxDQUFDOztFQUVYO0FBQ0Y7QUFDQTtFQUNFQyxhQUFhQSxDQUFBLEVBQUc7SUFDZCxPQUFPLElBQUksQ0FBQ2QsVUFBVTtFQUN4QjtBQUNGIn0=
133
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwic3RhcnRlZCIsImFjdGlvbnMiLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0Iiwic3Vic2NyaWJlIiwibXNnIiwidHlwZSIsImxlbmd0aCIsInN0YXRlIiwiaGFuZGxlQWN0aW9uIiwicGF5bG9hZCIsImNvbnRyb2xsZXIiLCJyZXNldEVudGlyZVN0b3JlIiwibWlkZGxld2FyZSIsInJlZHVjZXIiLCJuZXh0IiwicmV0IiwidGhlbiIsImdldFN0YXRlIiwib3B0aW1pc3RpYyIsInJlZHVjZSIsInNlbmQiLCJwdXNoIiwiaW5pdCIsImNsZWFudXAiLCJnZXRNaWRkbGV3YXJlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvRGV2dG9vbHNNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWlubmVyLWRlY2xhcmF0aW9ucyAqL1xuaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgRW5kcG9pbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVkdWNlciBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VyLCBTdGF0ZSwgQWN0aW9uVHlwZXMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfTtcblxubGV0IERFRkFVTFRfQ09ORklHID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGNvbnN0IGV4dHJhRW5kcG9pbnRLZXlzID0gW1xuICAgICdkYXRhRXhwaXJ5TGVuZ3RoJyxcbiAgICAnZXJyb3JFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvclBvbGljeScsXG4gICAgJ2ludmFsaWRJZlN0YWxlJyxcbiAgICAncG9sbEZyZXF1ZW5jeScsXG4gICAgJ2dldE9wdGltaXN0aWNSZXNwb25zZScsXG4gICAgJ3VwZGF0ZScsXG4gIF07XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplRW5kcG9pbnQoZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlKSB7XG4gICAgY29uc3Qgc2VyaWFsOiBhbnkgPSB7XG4gICAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgICAgc2NoZW1hOiAoZW5kcG9pbnQuc2NoZW1hIGFzIGFueSk/LnRvSlNPTj8uKCkgPz8gZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgc2lkZUVmZmVjdDogZW5kcG9pbnQuc2lkZUVmZmVjdCxcbiAgICB9O1xuICAgIGV4dHJhRW5kcG9pbnRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZW5kcG9pbnQpXG4gICAgICAgIHNlcmlhbFtrZXldID0gZW5kcG9pbnRba2V5IGFzIGtleW9mIEVuZHBvaW50SW50ZXJmYWNlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VyaWFsO1xuICB9XG5cbiAgY29uc3QgSEFTSU5UTCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgbmFtZTogYERhdGEgQ2xpZW50OiAke2dsb2JhbFRoaXMuZG9jdW1lbnQ/LnRpdGxlfWAsXG4gICAgYXV0b1BhdXNlOiB0cnVlLFxuICAgIGFjdGlvblNhbml0aXplcjogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IHtcbiAgICAgIGlmICghKCdlbmRwb2ludCcgaW4gYWN0aW9uKSkgcmV0dXJuIGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNlcmlhbGl6ZUVuZHBvaW50KGFjdGlvbi5lbmRwb2ludCksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiB7XG4gICAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmVwbGFjZXI6IEhBU0lOVExcbiAgICAgICAgPyAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgIChrZXkgPT09ICdkYXRlJyB8fCBrZXkuZW5kc1dpdGgoJ0F0JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvRGV2VG9vbHNNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldlRvb2xzTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBkZXZUb29sczogdW5kZWZpbmVkIHwgYW55O1xuICBwcm90ZWN0ZWQgc3RhcnRlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYWN0aW9uczogW0FjdGlvblR5cGVzLCBTdGF0ZTx1bmtub3duPl1bXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZz86IERldlRvb2xzQ29uZmlnLFxuICAgIHNraXBMb2dnaW5nPzogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5kZXZUb29scyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3Qoe1xuICAgICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdTVEFSVCc6XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoW2FjdGlvbiwgc3RhdGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ1NUT1AnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdESVNQQVRDSCc6XG4gICAgICAgICAgICBpZiAobXNnLnBheWxvYWQudHlwZSA9PT0gJ1JFU0VUJykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXRFbnRpcmVTdG9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZS5vcHRpbWlzdGljLnJlZHVjZShyZWR1Y2VyLCBzdGF0ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5kZXZUb29scy5zZW5kKGFjdGlvbiwgc3RhdGUsIHVuZGVmaW5lZCwgJ1JEQycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBxdWV1ZSBhY3Rpb25zXG4gICAgICB0aGlzLmFjdGlvbnMucHVzaChbYWN0aW9uLCBzdGF0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBpbml0aWFsIHN0YXRlIGlzIHJlYWR5ICovXG4gIGluaXQoc3RhdGU6IFN0YXRlPGFueT4pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5kZXZUb29scykgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIGFsbCBzdWJzY3JpcHRpb25zIGFyZSBjbGVhbmVkIHVwLiAqL1xuICBjbGVhbnVwKCkge31cblxuICAvKiogQXR0YWNoZXMgTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKi9cbiAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUlBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2QixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxLQUFLLFlBQVksRUFBRTtFQUFBLElBQUFDLG9CQUFBO0VBQ3pDLE1BQU1DLGlCQUFpQixHQUFHLENBQ3hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFFBQVEsQ0FDVDtFQUVELFNBQVNDLGlCQUFpQkEsQ0FBQ0MsUUFBMkIsRUFBRTtJQUFBLElBQUFDLE9BQUEsRUFBQUMsZ0JBQUE7SUFDdEQsTUFBTUMsTUFBVyxHQUFHO01BQ2xCQyxJQUFJLEVBQUVKLFFBQVEsQ0FBQ0ksSUFBSTtNQUNuQkMsTUFBTSxHQUFBSixPQUFBLElBQUFDLGdCQUFBLEdBQUdGLFFBQVEs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-client/core",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "High performance reactive framework for async data.",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",
@@ -120,7 +120,7 @@
120
120
  },
121
121
  "dependencies": {
122
122
  "@babel/runtime": "^7.17.0",
123
- "@data-client/normalizr": "workspace:^",
123
+ "@data-client/normalizr": "^0.8.0",
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
- const HASINTL = typeof Intl !== 'undefined';
9
- const DEFAULT_CONFIG = {
10
- name: `RDC: ${globalThis.document?.title}`,
11
- autoPause: true,
12
- serialize: {
13
- options: undefined,
14
- /* istanbul ignore next */
15
- replacer: HASINTL
16
- ? (key: string | number | symbol, value: unknown) => {
17
- if (
18
- typeof value === 'number' &&
19
- typeof key === 'string' &&
20
- isFinite(value) &&
21
- (key === 'date' || key.endsWith('At'))
22
- ) {
23
- return Intl.DateTimeFormat('en-US', {
24
- hour: 'numeric',
25
- minute: 'numeric',
26
- second: 'numeric',
27
- fractionalSecondDigits: 3,
28
- }).format(value);
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
- return value;
31
- }
32
- : undefined,
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,43 @@ 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);
64
128
  return next => action => {
65
129
  const ret = next(action);
66
130
  ret.then(() => {
67
131
  if (skipLogging?.(action)) return;
68
132
  const state = controller.getState();
69
- this.devTools.send(
70
- action,
71
- state.optimistic.reduce(reducer, state),
72
- undefined,
73
- 'RDC',
74
- );
133
+ this.handleAction(action, state.optimistic.reduce(reducer, state));
75
134
  });
76
135
  return ret;
77
136
  };
@@ -81,6 +140,15 @@ export default class DevToolsManager implements Manager {
81
140
  }
82
141
  }
83
142
 
143
+ handleAction(action: any, state: any) {
144
+ if (this.started) {
145
+ this.devTools.send(action, state, undefined, 'RDC');
146
+ } else {
147
+ // queue actions
148
+ this.actions.push([action, state]);
149
+ }
150
+ }
151
+
84
152
  /** Called when initial state is ready */
85
153
  init(state: State<any>) {
86
154
  /* 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. */