From 96bb89c1ede0ac122b00cf461ac7b8d4731d63ee Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 20 Nov 2018 21:44:31 +0200 Subject: [PATCH 01/67] Upgrade remotedev-serialize to fix #581 regression --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df070f06..6c7df1fe 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "redux-devtools-instrument": "^1.9.0", "remotedev-app": "^0.10.8", "remotedev-monitor-components": "^0.0.5", - "remotedev-serialize": "^0.1.2", + "remotedev-serialize": "^0.1.3", "remotedev-slider": "^1.1.1", "remotedev-utils": "0.0.1" } From 1f9b1924dd017c641d97a5a77b5bc1c6771ee7ac Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 20 Nov 2018 22:05:09 +0200 Subject: [PATCH 02/67] v2.15.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c7df1fe..702ce15c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.15.4", + "version": "2.15.5", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { From c89aa205d6b124b7575baf4407d6417c9ff3f819 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Thu, 22 Nov 2018 16:10:34 +0200 Subject: [PATCH 03/67] [Recipes] Using in a typescript project From #134 --- docs/Recipes.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/Recipes.md b/docs/Recipes.md index ff696fff..07c1a9f3 100644 --- a/docs/Recipes.md +++ b/docs/Recipes.md @@ -1,5 +1,17 @@ # Recipes +### Using in a typescript project + +```js +const store = createStore( + rootReducer, + initialState, + (window as any).__REDUX_DEVTOOLS_EXTENSION__ && + (window as any).__REDUX_DEVTOOLS_EXTENSION__() +); +``` +Note that you many need to set `no-any` to false in your `tslint.json` file. + ### Export from browser console or from application ```js From 8bbdf99a36f05d731d31fd6968579ac96c39b38a Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Thu, 22 Nov 2018 16:20:13 +0200 Subject: [PATCH 04/67] [Recipes] Applying multiple times with different sets of options From #451 --- docs/Recipes.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/Recipes.md b/docs/Recipes.md index 07c1a9f3..53b56bf6 100644 --- a/docs/Recipes.md +++ b/docs/Recipes.md @@ -19,3 +19,25 @@ store.liftedStore.getState() ``` The extension is not sharing `store` object, so you should take care of that. + +### Applying multiple times with different sets of options + +We're [not allowing that from instrumentation part](https://github.com/zalmoxisus/redux-devtools-instrument/blob/master/src/instrument.js#L676), because that would re-dispatch every app action in case we'd have many liftedStores, but there's [a helper for logging only](https://github.com/zalmoxisus/redux-devtools-extension/blob/master/npm-package/logOnly.js), which can be used it like so: + +```js +import { createStore, compose } from 'redux'; +import { devToolsEnhancer } from 'redux-devtools-extension/logOnly'; + +const store = createStore(reducer, /* preloadedState, */ compose( +devToolsEnhancer({ + instaceID: 1, + name: 'Blacklisted', + actionsBlacklist: '...' +}), +devToolsEnhancer({ + instaceID: 2, + name: 'Whitelisted', + actionsWhitelist: '...' +}) +)); +``` From a66dd4673ec6c4986e549fe86fb92a4ae2421d18 Mon Sep 17 00:00:00 2001 From: Sean Scally Date: Sat, 24 Nov 2018 10:16:44 -0800 Subject: [PATCH 05/67] Restore store typings (Fix #539) (#578) --- npm-package/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-package/index.d.ts b/npm-package/index.d.ts index 7169659d..4e9f17ad 100644 --- a/npm-package/index.d.ts +++ b/npm-package/index.d.ts @@ -156,6 +156,6 @@ export interface EnhancerOptions { }; } -export function composeWithDevTools(...funcs: Function[]): StoreEnhancer; +export function composeWithDevTools(...funcs: Array>): StoreEnhancer; export function composeWithDevTools(options: EnhancerOptions): typeof compose; export function devToolsEnhancer(options: EnhancerOptions): StoreEnhancer; From ede072e8f27901971460acf5f0a061b3cec36dc5 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sat, 24 Nov 2018 20:18:47 +0200 Subject: [PATCH 06/67] Bump npm package version --- npm-package/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-package/package.json b/npm-package/package.json index b69e70c7..1b989a74 100644 --- a/npm-package/package.json +++ b/npm-package/package.json @@ -1,6 +1,6 @@ { "name": "redux-devtools-extension", - "version": "2.13.5", + "version": "2.13.6", "description": "Wrappers for Redux DevTools Extension.", "main": "index.js", "repository": { From 9f6c7aaaeb8287d8e8b79d885bd8e9930fe3ba48 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sun, 25 Nov 2018 15:30:15 +0200 Subject: [PATCH 07/67] Deprecate window.devToolsExtension Related to #220 --- src/app/api/index.js | 2 +- src/app/stores/windowStore.js | 2 +- src/browser/extension/inject/index.js | 2 +- src/browser/extension/inject/pageScript.js | 66 +++++++++++++++++----- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/app/api/index.js b/src/app/api/index.js index c596b51e..bc9412db 100644 --- a/src/app/api/index.js +++ b/src/app/api/index.js @@ -280,7 +280,7 @@ export function connect(preConfig) { export function updateStore(stores) { return function(newStore, instanceId) { /* eslint-disable no-console */ - console.warn('`devToolsExtension.updateStore` is deprecated, remove it and just use ' + + console.warn('`__REDUX_DEVTOOLS_EXTENSION__.updateStore` is deprecated, remove it and just use ' + '`__REDUX_DEVTOOLS_EXTENSION_COMPOSE__` instead of the extension\'s store enhancer: ' + 'https://github.com/zalmoxisus/redux-devtools-extension#12-advanced-store-setup'); /* eslint-enable no-console */ diff --git a/src/app/stores/windowStore.js b/src/app/stores/windowStore.js index b5f18307..2d6ca568 100644 --- a/src/app/stores/windowStore.js +++ b/src/app/stores/windowStore.js @@ -16,7 +16,7 @@ export default function configureStore(baseStore, position, preloadedState) { } else { enhancer = compose( applyMiddleware(...middlewares), - window.devToolsExtension ? window.devToolsExtension() : noop => noop + window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : noop => noop ); } const store = createStore(rootReducer, preloadedState, enhancer); diff --git a/src/browser/extension/inject/index.js b/src/browser/extension/inject/index.js index c48712c0..c380d216 100644 --- a/src/browser/extension/inject/index.js +++ b/src/browser/extension/inject/index.js @@ -12,5 +12,5 @@ chrome.runtime.sendMessage(window.devToolsExtensionID, { type: 'GET_OPTIONS' }, } window.devToolsOptions = response.options; - window.devToolsExtension.notifyErrors(); + window.__REDUX_DEVTOOLS_EXTENSION__.notifyErrors(); }); diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index 89bfbac5..466c52fb 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -24,7 +24,7 @@ function deprecateParam(oldParam, newParam) { /* eslint-enable no-console */ } -const devToolsExtension = function(reducer, preloadedState, config) { +const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { /* eslint-disable no-param-reassign */ if (typeof reducer === 'object') { config = reducer; reducer = undefined; @@ -288,16 +288,56 @@ const devToolsExtension = function(reducer, preloadedState, config) { }; // noinspection JSAnnotator -window.devToolsExtension = devToolsExtension; -window.devToolsExtension.open = openWindow; -window.devToolsExtension.updateStore = updateStore(stores); -window.devToolsExtension.notifyErrors = notifyErrors; -window.devToolsExtension.send = sendMessage; -window.devToolsExtension.listen = setListener; -window.devToolsExtension.connect = connect; -window.devToolsExtension.disconnect = disconnect; - -window.__REDUX_DEVTOOLS_EXTENSION__ = window.devToolsExtension; +window.__REDUX_DEVTOOLS_EXTENSION__ = __REDUX_DEVTOOLS_EXTENSION__; +window.__REDUX_DEVTOOLS_EXTENSION__.open = openWindow; +window.__REDUX_DEVTOOLS_EXTENSION__.updateStore = updateStore(stores); +window.__REDUX_DEVTOOLS_EXTENSION__.notifyErrors = notifyErrors; +window.__REDUX_DEVTOOLS_EXTENSION__.send = sendMessage; +window.__REDUX_DEVTOOLS_EXTENSION__.listen = setListener; +window.__REDUX_DEVTOOLS_EXTENSION__.connect = connect; +window.__REDUX_DEVTOOLS_EXTENSION__.disconnect = disconnect; + +// Deprecated +/* eslint-disable no-console */ +let varNameDeprecatedWarned; +const varNameDeprecatedWarn = () => { + if (varNameDeprecatedWarned) return; + console.warn('`window.devToolsExtension` is deprecated in favor of `window.__REDUX_DEVTOOLS_EXTENSION__`, and will be removed in next version of Redux DevTools: https://git.io/fpEJZ'); + varNameDeprecatedWarned = true; +}; +/* eslint-enable no-console */ +window.devToolsExtension = (...args) => { + varNameDeprecatedWarn(); + return __REDUX_DEVTOOLS_EXTENSION__.apply(null, args); +}; +window.devToolsExtension.open = (...args) => { + varNameDeprecatedWarn(); + return openWindow.apply(null, args); +}; +window.devToolsExtension.updateStore = (...args) => { + varNameDeprecatedWarn(); + return updateStore(stores).apply(null, args); +}; +window.devToolsExtension.notifyErrors = (...args) => { + varNameDeprecatedWarn(); + return notifyErrors.apply(null, args); +}; +window.devToolsExtension.send = (...args) => { + varNameDeprecatedWarn(); + return sendMessage.apply(null, args); +}; +window.devToolsExtension.listen = (...args) => { + varNameDeprecatedWarn(); + return setListener.apply(null, args); +}; +window.devToolsExtension.connect = (...args) => { + varNameDeprecatedWarn(); + return connect.apply(null, args); +}; +window.devToolsExtension.disconnect = (...args) => { + varNameDeprecatedWarn(); + return disconnect.apply(null, args); +}; const preEnhancer = instanceId => next => (reducer, preloadedState, enhancer) => { @@ -322,14 +362,14 @@ const extensionCompose = (config) => (...funcs) => { return (...args) => { const instanceId = generateId(config.instanceId); return [preEnhancer(instanceId), ...funcs].reduceRight( - (composed, f) => f(composed), devToolsExtension({ ...config, instanceId })(...args) + (composed, f) => f(composed), __REDUX_DEVTOOLS_EXTENSION__({ ...config, instanceId })(...args) ); }; }; window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ = (...funcs) => { if (funcs.length === 0) { - return devToolsExtension(); + return __REDUX_DEVTOOLS_EXTENSION__(); } if (funcs.length === 1 && typeof funcs[0] === 'object') { return extensionCompose(funcs[0]); From 44e898e61257cc906975d04263b1335dbcad03f3 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sun, 25 Nov 2018 20:11:47 +0200 Subject: [PATCH 08/67] Remove store mutations as looking to be not necessary anymore Related to #556 --- src/browser/extension/inject/pageScript.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index 466c52fb..fe1e0d2e 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -343,11 +343,8 @@ const preEnhancer = instanceId => next => (reducer, preloadedState, enhancer) => { const store = next(reducer, preloadedState, enhancer); - // Mutate the store in order to keep the reference if (stores[instanceId]) { stores[instanceId].initialDispatch = store.dispatch; - stores[instanceId].liftedStore = store.liftedStore; - stores[instanceId].getState = store.getState; } return { From 3299e2a3b4f3caad93413bec56ce34166f420830 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 26 Nov 2018 15:10:16 +0200 Subject: [PATCH 09/67] Freeze jsan version to fix reviver issue Related to #540 and kolodny/jsan/issues/24 --- package.json | 6 +++--- yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 702ce15c..540addd1 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "webpack": "^3.1.0" }, "dependencies": { - "jsan": "^3.1.11", + "jsan": "3.1.9", "lodash": "^4.17.2", "react": "^15.4.1", "react-dom": "^15.4.1", @@ -82,9 +82,9 @@ "redux": "^3.5.2", "redux-devtools": "^3.4.1", "redux-devtools-instrument": "^1.9.0", - "remotedev-app": "^0.10.8", + "remotedev-app": "^0.10.9", "remotedev-monitor-components": "^0.0.5", - "remotedev-serialize": "^0.1.3", + "remotedev-serialize": "0.1.4", "remotedev-slider": "^1.1.1", "remotedev-utils": "0.0.1" } diff --git a/yarn.lock b/yarn.lock index 73b76121..b932e263 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4529,12 +4529,12 @@ js-yaml@3.4.5: argparse "^1.0.2" esprima "^2.6.0" -jsan@^3.1.11: - version "3.1.11" - resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.11.tgz#9ab1807e5e77ba691e92f90c29a0a6002d1259db" - integrity sha512-8KtxvhQhAUKMQF+S/jer33XZKujglnicpCeMnVaJN5iZJ1q5zCLoX1p8awG1SgnMELX9o36LF5uUUmN5HPIqSA== +jsan@3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" + integrity sha1-JwVnbBBY8KfZrCZq0Daldpz6fJY= -jsan@^3.1.2, jsan@^3.1.3: +jsan@^3.1.3: version "3.1.10" resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.10.tgz#ba9917b864defff567e0c990a34ae7a8d5eb1d90" integrity sha512-Rpme/mJFG3BlIM8/9L+0qAIGccx6dyYEODdkZUHYKyJI3NIl6d13buXa7aE3lO1kZAGMalG0/6QzalXdDdUc4g== @@ -7462,15 +7462,15 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -remotedev-app@^0.10.8: - version "0.10.8" - resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.8.tgz#7cca9be39674993b81dd400fc094ff85c361c64e" - integrity sha1-fMqb45Z0mTuB3UAPwJT/hcNhxk4= +remotedev-app@^0.10.9: + version "0.10.9" + resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.9.tgz#415e0bfa7328a9e8f47a2a9fc86595738fbb4484" + integrity sha512-m/NfJ3t50XgIwFO2Z0+Wv2xzZ1jyH7U0eUBe/k/wtwJTU6UHdARwKeZPJ43wotqWFB1QOPBe/8k9V/uAOI4bKw== dependencies: chrome-storage-local "^0.1.6" d3-state-visualizer "^1.3.1" javascript-stringify "^1.5.0" - jsan "^3.1.2" + jsan "3.1.9" jsondiffpatch "^0.2.4" lodash "^4.0.0" material-ui "0.16.4" @@ -7527,12 +7527,12 @@ remotedev-monitor-components@^0.0.5: codemirror "^5.21.0" styled-components "^1.1.1" -remotedev-serialize@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.2.tgz#2dd6bcd9af57bd1dc4fb720d3364ac531c7c1e91" - integrity sha512-oFUMLf92AjR/StREwTpmMTYcZ4q1+T0jviEiWf36BEb8nBnZh6Cx94j6I/qeOhWN/JFN3Jo5QyJ43Nu/OxGC7g== +remotedev-serialize@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.4.tgz#2a15e4e514fd393c20328ef978504b4fc272e367" + integrity sha512-xFUjsHi/qY14uJmyk1uZynRJli5j5JdTE8Qm2jNCHMQVRSdKRqGh2vqQh6eoOiRX4K8yxjEXqtcxd4Oj2dmK4Q== dependencies: - jsan "^3.1.11" + jsan "3.1.9" remotedev-slider@1.1.3, remotedev-slider@^1.1.1: version "1.1.3" From 2922a54b91efa092b68d6537e0b3c17eab881ea8 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 26 Nov 2018 20:10:57 +0200 Subject: [PATCH 10/67] Implement dynamic maxAge and fix getting it from options page Related to #480 and #316 --- package.json | 4 ++-- src/app/stores/enhancerStore.js | 2 +- src/browser/extension/inject/contentScript.js | 3 ++- src/browser/extension/inject/pageScript.js | 12 ++++++------ yarn.lock | 18 +++++++++++++----- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 540addd1..cb8f6821 100644 --- a/package.json +++ b/package.json @@ -81,8 +81,8 @@ "react-redux": "^4.4.5", "redux": "^3.5.2", "redux-devtools": "^3.4.1", - "redux-devtools-instrument": "^1.9.0", - "remotedev-app": "^0.10.9", + "redux-devtools-instrument": "^1.9.2", + "remotedev-app": "^0.10.10", "remotedev-monitor-components": "^0.0.5", "remotedev-serialize": "0.1.4", "remotedev-slider": "^1.1.1", diff --git a/src/app/stores/enhancerStore.js b/src/app/stores/enhancerStore.js index 4117a766..dff3a4b4 100644 --- a/src/app/stores/enhancerStore.js +++ b/src/app/stores/enhancerStore.js @@ -12,7 +12,7 @@ export default function configureStore(next, monitorReducer, config) { instrument( monitorReducer, { - maxAge: config.maxAge || window.devToolsOptions.maxAge || 50, + maxAge: config.maxAge, shouldCatchErrors: config.shouldCatchErrors || window.shouldCatchErrors, shouldHotReload: config.shouldHotReload, shouldRecordChanges: config.shouldRecordChanges, diff --git a/src/browser/extension/inject/contentScript.js b/src/browser/extension/inject/contentScript.js index fab54d11..12cabe03 100644 --- a/src/browser/extension/inject/contentScript.js +++ b/src/browser/extension/inject/contentScript.js @@ -1,4 +1,4 @@ -import { injectOptions, isAllowed } from '../options/syncOptions'; +import { injectOptions, getOptionsFromBg, isAllowed } from '../options/syncOptions'; const source = '@devtools-extension'; let connected = false; let bg; @@ -58,6 +58,7 @@ function tryCatch(fn, args) { function send(message) { if (!connected) connect(); if (message.type === 'INIT_INSTANCE') { + getOptionsFromBg(); bg.postMessage({ name: 'INIT_INSTANCE', instanceId: message.instanceId }); } else { bg.postMessage({ name: 'RELAY', message }); diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index fe1e0d2e..f52a9167 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -34,7 +34,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { let store; let errorOccurred = false; - let maxAge; + let maxAge = config.maxAge; let actionCreators; let sendingActionId = 1; const instanceId = generateId(config.instanceId); @@ -91,7 +91,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { if (type === 'ACTION') { message.action = !actionSanitizer ? action : actionSanitizer(action.action, nextActionId - 1); - message.maxAge = maxAge; + message.maxAge = getMaxAge(); message.nextActionId = nextActionId; } else if (libConfig) { message.libConfig = libConfig; @@ -144,7 +144,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { payload, source, instanceId, - maxAge + maxAge: getMaxAge() }, serializeState, serializeAction); }, latency); @@ -233,9 +233,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } } - function init() { - maxAge = config.maxAge || window.devToolsOptions.maxAge || 50; + const getMaxAge = () => maxAge || window.devToolsOptions.maxAge || 50; + function init() { setListener(onMessage, instanceId); notifyErrors(() => { errorOccurred = true; @@ -274,7 +274,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { if (!isAllowed(window.devToolsOptions)) return next(reducer_, initialState_, enhancer_); store = stores[instanceId] = - configureStore(next, monitor.reducer, config)(reducer_, initialState_, enhancer_); + configureStore(next, monitor.reducer, { ...config, maxAge: getMaxAge })(reducer_, initialState_, enhancer_); if (isInIframe()) setTimeout(init, 3000); else init(); diff --git a/yarn.lock b/yarn.lock index b932e263..f1a1e66c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7341,7 +7341,7 @@ redux-devtools-chart-monitor@^1.6.1: react-pure-render "^1.0.2" redux-devtools-themes "^1.0.0" -redux-devtools-instrument@^1.0.1, redux-devtools-instrument@^1.9.0: +redux-devtools-instrument@^1.0.1: version "1.9.0" resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.0.tgz#2faed9ac3292c783284b21843edfaa0567764a0c" integrity sha512-pLFQoja1ojpsSRTWbC9yyc/a+z8uwOD7FPKLp+Abs7qjsah6khA5o8HBE2wa0VipE5vniYINdkNyxV/2iWADKg== @@ -7349,6 +7349,14 @@ redux-devtools-instrument@^1.0.1, redux-devtools-instrument@^1.9.0: lodash "^4.2.0" symbol-observable "^1.0.2" +redux-devtools-instrument@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.2.tgz#c8bb81f295c60f1629164391c9c8552346d551c0" + integrity sha512-6ydVkHuAWPDRmEoVjPyJNF60y5pT6nIVyDXpTz2klGHu7oR+j3QJRMvRyyPYZMThePd8JIkh8/6L4zDXKED6aA== + dependencies: + lodash "^4.2.0" + symbol-observable "^1.0.2" + redux-devtools-log-monitor@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redux-devtools-log-monitor/-/redux-devtools-log-monitor-1.2.0.tgz#136a202f999c659a13fbb5c50793106e80722311" @@ -7462,10 +7470,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -remotedev-app@^0.10.9: - version "0.10.9" - resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.9.tgz#415e0bfa7328a9e8f47a2a9fc86595738fbb4484" - integrity sha512-m/NfJ3t50XgIwFO2Z0+Wv2xzZ1jyH7U0eUBe/k/wtwJTU6UHdARwKeZPJ43wotqWFB1QOPBe/8k9V/uAOI4bKw== +remotedev-app@^0.10.10: + version "0.10.10" + resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.10.tgz#846572cc08bcaaa80d53390dfba97eb7a020ef63" + integrity sha512-ChmS1Z+TWX+HNIuO5GPi+Gdd2JKVvUeEyB2rIxUliOx8Y127T9vqBqbASBc8S+t43S7QdWCHt1nbI/0iPyErZA== dependencies: chrome-storage-local "^0.1.6" d3-state-visualizer "^1.3.1" From 4bd69c82b9dfd9e2da90ac79a34aca28579d59f3 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 26 Nov 2018 20:47:46 +0200 Subject: [PATCH 11/67] If filter options provided in arguments, should ignore from option page --- src/app/api/filters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index 506b6ebf..6bd1da3e 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -18,7 +18,7 @@ export function getLocalFilter(config) { export function isFiltered(action, localFilter) { if ( - !localFilter || window.devToolsOptions && + !localFilter && window.devToolsOptions && window.devToolsOptions.filter === FilterState.DO_NOT_FILTER || typeof action.type.match !== 'function' ) return false; From 725247782588272b4162728d76e3fe44db1d7352 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 26 Nov 2018 20:49:01 +0200 Subject: [PATCH 12/67] Fix actionsBlacklist/Whitelist to be also string as per documentation --- src/app/api/filters.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index 6bd1da3e..189d0fc5 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -9,8 +9,8 @@ export const FilterState = { export function getLocalFilter(config) { if (config.actionsBlacklist || config.actionsWhitelist) { return { - whitelist: config.actionsWhitelist && config.actionsWhitelist.join('|'), - blacklist: config.actionsBlacklist && config.actionsBlacklist.join('|') + whitelist: typeof config.actionsWhitelist === 'object' ? config.actionsWhitelist.join('|') : config.actionsWhitelist, + blacklist: typeof config.actionsBlacklist === 'object' ? config.actionsBlacklist.join('|') : config.actionsBlacklist }; } return undefined; From 37f31ce378b41f7bad8f5f4bc3dcdf3a7ad59b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Peer=20St=C3=B6cklmair?= Date: Tue, 27 Nov 2018 16:46:46 +0100 Subject: [PATCH 13/67] Fix: TS require 1 type (closes #584) (#585) --- npm-package/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-package/index.d.ts b/npm-package/index.d.ts index 4e9f17ad..abc68df7 100644 --- a/npm-package/index.d.ts +++ b/npm-package/index.d.ts @@ -156,6 +156,6 @@ export interface EnhancerOptions { }; } -export function composeWithDevTools(...funcs: Array>): StoreEnhancer; +export function composeWithDevTools(...funcs: Array>): StoreEnhancer; export function composeWithDevTools(options: EnhancerOptions): typeof compose; export function devToolsEnhancer(options: EnhancerOptions): StoreEnhancer; From 560c8ea7793b78cea4ae9fb80a5941e8b8e8c65d Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 27 Nov 2018 17:49:25 +0200 Subject: [PATCH 14/67] Bump npm package version --- npm-package/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-package/package.json b/npm-package/package.json index 1b989a74..5d86942d 100644 --- a/npm-package/package.json +++ b/npm-package/package.json @@ -1,6 +1,6 @@ { "name": "redux-devtools-extension", - "version": "2.13.6", + "version": "2.13.7", "description": "Wrappers for Redux DevTools Extension.", "main": "index.js", "repository": { From 9d4923cff8a9c95abd1e020261df345d2e36bd54 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 27 Nov 2018 17:58:44 +0200 Subject: [PATCH 15/67] Upgrade d3-state-visualizer subdependency to fix #269 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f1a1e66c..aedeb153 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2096,9 +2096,9 @@ custom-event@1.0.0: integrity sha1-LkYovhncSyFLXAJjDFlx6BFhgGI= d3-state-visualizer@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/d3-state-visualizer/-/d3-state-visualizer-1.3.1.tgz#14c9fc31509c51db909ed715a41c05686870f182" - integrity sha1-FMn8MVCcUduQntcVpBwFaGhw8YI= + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-state-visualizer/-/d3-state-visualizer-1.3.2.tgz#8e3ac418aa7ee7e3f46025309f9d1c215ee385eb" + integrity sha512-XgTRC6FXeoTt8l79cc2f3Zaah+K7DUQb3GL0zfbvoIi7zWWHV4l7OfuX9/JxxvwilKApMZwHMBJ7cJ2yWAc5IQ== dependencies: d3 "^3.5.6" d3tooltip "^1.2.2" From 5f94fc0940c2b001039333a366e36ef89dd259a0 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 27 Nov 2018 22:22:05 +0200 Subject: [PATCH 16/67] Auto adjust maxAge according to blacklisted actions Related to #316 --- src/app/api/filters.js | 12 ++++++---- src/browser/extension/inject/pageScript.js | 28 +++++++++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index 189d0fc5..6705322f 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -16,12 +16,14 @@ export function getLocalFilter(config) { return undefined; } +export const noFiltersApplied = (localFilter) => ( + // predicate || + !localFilter && window.devToolsOptions && + window.devToolsOptions.filter === FilterState.DO_NOT_FILTER +); + export function isFiltered(action, localFilter) { - if ( - !localFilter && window.devToolsOptions && - window.devToolsOptions.filter === FilterState.DO_NOT_FILTER || - typeof action.type.match !== 'function' - ) return false; + if (noFiltersApplied(localFilter) || typeof action.type.match !== 'function') return false; const { whitelist, blacklist } = localFilter || window.devToolsOptions; return ( diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index f52a9167..8ab13143 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -4,7 +4,9 @@ import createStore from '../../../app/stores/createStore'; import configureStore, { getUrlParam } from '../../../app/stores/enhancerStore'; import { isAllowed } from '../options/syncOptions'; import Monitor from '../../../app/service/Monitor'; -import { getLocalFilter, isFiltered, filterState, startingFrom } from '../../../app/api/filters'; +import { + noFiltersApplied, getLocalFilter, isFiltered, filterState, startingFrom +} from '../../../app/api/filters'; import notifyErrors from '../../../app/api/notifyErrors'; import importState from '../../../app/api/importState'; import openWindow from '../../../app/api/openWindow'; @@ -34,7 +36,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { let store; let errorOccurred = false; - let maxAge = config.maxAge; + let maxAge; let actionCreators; let sendingActionId = 1; const instanceId = generateId(config.instanceId); @@ -233,7 +235,27 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } } - const getMaxAge = () => maxAge || window.devToolsOptions.maxAge || 50; + const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length + const getMaxAge = (liftedAction) => { + let m = config.maxAge || window.devToolsOptions.maxAge || 50; + if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) return m; + if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page + if (isFiltered(liftedAction.action, localFilter)) { + // TODO: check also predicate && !predicate(state, action) with current state + maxAge++; + } else { + filteredActionIds.push(store.liftedStore.getState().nextActionId); + if (filteredActionIds.length >= m) { + const stagedActionIds = store.liftedStore.getState().stagedActionIds; + let i = 1; + while (maxAge > m && filteredActionIds.indexOf(stagedActionIds[i]) === -1) { + maxAge--; i++; + } + filteredActionIds.shift(); + } + } + return maxAge; + }; function init() { setListener(onMessage, instanceId); From 1134822acfecc574f8d1ddfa3cd61f1ee56c81b5 Mon Sep 17 00:00:00 2001 From: Mihail Diordiev Date: Tue, 27 Nov 2018 22:33:07 +0200 Subject: [PATCH 17/67] [WIP] Improve performance for Chrome devpanel (#580) * Use window page instead of devpanel when getBackgroundPage exists * Support multiple devpanels * Select tab instance also when devpanel is decoupled * Select current tab instance for devPanel and pageAction * Show default message for devpanel when no store found * Fix tests * Port should always exist, but check just in case --- src/app/containers/App.js | 7 +++++ src/app/middlewares/api.js | 10 +++---- src/app/middlewares/instanceSelector.js | 35 +++++++++++++++++++++++++ src/app/middlewares/popupSelector.js | 25 ------------------ src/app/stores/windowStore.js | 6 +++-- src/browser/extension/devtools/index.js | 2 +- src/browser/extension/window/index.js | 4 ++- test/app/containers/App.spec.js | 2 +- test/chrome/extension.spec.js | 4 +-- 9 files changed, 58 insertions(+), 37 deletions(-) create mode 100644 src/app/middlewares/instanceSelector.js delete mode 100644 src/app/middlewares/popupSelector.js diff --git a/src/app/containers/App.js b/src/app/containers/App.js index 1787bf73..43977798 100644 --- a/src/app/containers/App.js +++ b/src/app/containers/App.js @@ -37,6 +37,13 @@ class App extends Component { monitor, position, togglePersist, dispatcherIsOpen, sliderIsOpen, options, liftedState } = this.props; + if (!position && (!options || !options.features)) { + return ( +
+ No store found. Make sure to follow the instructions. +
+ ); + } const features = options.features || {}; return (
diff --git a/src/app/middlewares/api.js b/src/app/middlewares/api.js index 382c9248..64867d06 100644 --- a/src/app/middlewares/api.js +++ b/src/app/middlewares/api.js @@ -15,7 +15,7 @@ const connections = { let monitors = 0; let isMonitored = false; -const getId = sender => sender.tab ? sender.tab.id : sender.id; +const getId = (sender, name) => sender.tab ? sender.tab.id : name || sender.id; function toMonitors(action, tabId, verbose) { Object.keys(connections.monitor).forEach(id => { @@ -137,8 +137,8 @@ function messaging(request, sender, sendResponse) { function disconnect(type, id, listener) { return function disconnectListener() { const p = connections[type][id]; - if (listener) p.onMessage.removeListener(listener); - p.onDisconnect.removeListener(disconnectListener); + if (listener && p) p.onMessage.removeListener(listener); + if (p) p.onDisconnect.removeListener(disconnectListener); delete connections[type][id]; if (type === 'tab') { if (!window.store.getState().persistStates) { @@ -186,8 +186,8 @@ function onConnect(port) { }; port.onMessage.addListener(listener); port.onDisconnect.addListener(disconnect('tab', id, listener)); - } else if (port.name === 'monitor') { - id = getId(port.sender); + } else if (port.name && port.name.indexOf('monitor') === 0) { + id = getId(port.sender, port.name); connections.monitor[id] = port; monitorInstances(true); monitors++; diff --git a/src/app/middlewares/instanceSelector.js b/src/app/middlewares/instanceSelector.js new file mode 100644 index 00000000..6dc15040 --- /dev/null +++ b/src/app/middlewares/instanceSelector.js @@ -0,0 +1,35 @@ +import { SELECT_INSTANCE, UPDATE_STATE } from 'remotedev-app/lib/constants/actionTypes'; + +function selectInstance(tabId, store, next) { + const instances = store.getState().instances; + if (instances.current === 'default') return; + const connections = instances.connections[tabId]; + if (connections && connections.length === 1) { + next({ type: SELECT_INSTANCE, selected: connections[0] }); + } +} + +function getCurrentTabId(next) { + chrome.tabs.query({ + active: true, + lastFocusedWindow: true + }, tabs => { + const tab = tabs[0]; + if (!tab) return; + next(tab.id); + }); +} + +export default function popupSelector(store) { + return next => action => { + const result = next(action); + if (action.type === UPDATE_STATE) { + if (chrome.devtools && chrome.devtools.inspectedWindow) { + selectInstance(chrome.devtools.inspectedWindow.tabId, store, next); + } else { + getCurrentTabId(tabId => selectInstance(tabId, store, next)); + } + } + return result; + }; +} diff --git a/src/app/middlewares/popupSelector.js b/src/app/middlewares/popupSelector.js deleted file mode 100644 index b9b4ba51..00000000 --- a/src/app/middlewares/popupSelector.js +++ /dev/null @@ -1,25 +0,0 @@ -import { SELECT_INSTANCE } from 'remotedev-app/lib/constants/actionTypes'; - -export default function popupSelector(store) { - let autoselected = false; - return next => action => { - const result = next(action); - if (!autoselected) { - chrome.tabs.query({ - active: true, - lastFocusedWindow: true - }, tabs => { - const instances = store.getState().instances; - if (instances.current === 'default') return; - autoselected = true; - const tab = tabs[0]; - if (!tab) return; - const connections = instances.connections[tab.id]; - if (connections && connections.length === 1) { - next({ type: SELECT_INSTANCE, selected: connections[0] }); - } - }); - } - return result; - }; -} diff --git a/src/app/stores/windowStore.js b/src/app/stores/windowStore.js index 2d6ca568..a779dcd4 100644 --- a/src/app/stores/windowStore.js +++ b/src/app/stores/windowStore.js @@ -4,13 +4,15 @@ import exportState from 'remotedev-app/lib/middlewares/exportState'; import api from 'remotedev-app/lib/middlewares/api'; import { CONNECT_REQUEST } from 'remotedev-app/lib/constants/socketActionTypes'; import syncStores from '../middlewares/windowSync'; -import popupSelector from '../middlewares/popupSelector'; +import instanceSelector from '../middlewares/instanceSelector'; import rootReducer from '../reducers/window'; export default function configureStore(baseStore, position, preloadedState) { let enhancer; const middlewares = [exportState, api, syncStores(baseStore), persist(position)]; - if (position === '#popup') middlewares.push(popupSelector); + if (!position || position === '#popup') { // select current tab instance for devPanel and pageAction + middlewares.push(instanceSelector); + } if (process.env.NODE_ENV === 'production') { enhancer = applyMiddleware(...middlewares); } else { diff --git a/src/browser/extension/devtools/index.js b/src/browser/extension/devtools/index.js index 6b1dcf2c..f9206141 100644 --- a/src/browser/extension/devtools/index.js +++ b/src/browser/extension/devtools/index.js @@ -1,3 +1,3 @@ chrome.devtools.panels.create( - 'Redux', 'img/logo/scalable.png', 'devpanel.html', function() {} + 'Redux', 'img/logo/scalable.png', chrome.extension.getBackgroundPage ? 'window.html' : 'devpanel.html', function() {} ); diff --git a/src/browser/extension/window/index.js b/src/browser/extension/window/index.js index db5a6b39..87921b67 100644 --- a/src/browser/extension/window/index.js +++ b/src/browser/extension/window/index.js @@ -13,7 +13,9 @@ getPreloadedState(position, state => { preloadedState = state; }); chrome.runtime.getBackgroundPage(({ store }) => { const localStore = configureStore(store, position, preloadedState); - const bg = chrome.runtime.connect({ name: 'monitor' }); + let name = 'monitor'; + if (chrome && chrome.devtools && chrome.devtools.inspectedWindow) name += chrome.devtools.inspectedWindow.tabId; + const bg = chrome.runtime.connect({ name }); const update = action => { localStore.dispatch(action || { type: UPDATE_STATE }); }; bg.onMessage.addListener(update); update(); diff --git a/test/app/containers/App.spec.js b/test/app/containers/App.spec.js index 385c0363..69231fad 100644 --- a/test/app/containers/App.spec.js +++ b/test/app/containers/App.spec.js @@ -6,7 +6,7 @@ import configureStore from '../../../src/app/stores/windowStore'; import App from '../../../src/app/containers/App.js'; const store = configureStore(store); -const component = mount(); +const component = mount(); describe('App container', () => { it('should render inspector monitor\'s component', () => { diff --git a/test/chrome/extension.spec.js b/test/chrome/extension.spec.js index 9a6a8fd5..5866b907 100644 --- a/test/chrome/extension.spec.js +++ b/test/chrome/extension.spec.js @@ -28,9 +28,9 @@ describe('Chrome extension', function() { }); it('should open extension\'s window', async () => { - await this.driver.get(`chrome-extension://${extensionId}/window.html`); + await this.driver.get(`chrome-extension://${extensionId}/window.html#left`); const url = await this.driver.getCurrentUrl(); - expect(url).toBe(`chrome-extension://${extensionId}/window.html`); + expect(url).toBe(`chrome-extension://${extensionId}/window.html#left`); }); it('should match document title', async () => { From a98fee5a50eea1601f9fae56393f764643b87240 Mon Sep 17 00:00:00 2001 From: Mihail Diordiev Date: Tue, 27 Nov 2018 22:34:12 +0200 Subject: [PATCH 18/67] Workaround for new Chrome limit on message size (#582) --- src/app/middlewares/api.js | 16 ++++++++- src/browser/extension/inject/contentScript.js | 35 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/app/middlewares/api.js b/src/app/middlewares/api.js index 64867d06..4be1ff6f 100644 --- a/src/app/middlewares/api.js +++ b/src/app/middlewares/api.js @@ -12,6 +12,7 @@ const connections = { panel: {}, monitor: {} }; +const chunks = {}; let monitors = 0; let isMonitored = false; @@ -122,8 +123,21 @@ function messaging(request, sender, sendResponse) { } const action = { type: UPDATE_STATE, request, id: tabId }; + const instanceId = `${tabId}/${request.instanceId}`; + if (request.split) { + if (request.split === 'start') { + chunks[instanceId] = request; + return; + } + if (request.split === 'chunk') { + chunks[instanceId][request.chunk[0]] = (chunks[instanceId][request.chunk[0]] || '') + request.chunk[1]; + return; + } + action.request = chunks[instanceId]; + delete chunks[instanceId]; + } if (request.instanceId) { - action.request.instanceId = `${tabId}/${request.instanceId}`; + action.request.instanceId = instanceId; } window.store.dispatch(action); diff --git a/src/browser/extension/inject/contentScript.js b/src/browser/extension/inject/contentScript.js index 12cabe03..235834c3 100644 --- a/src/browser/extension/inject/contentScript.js +++ b/src/browser/extension/inject/contentScript.js @@ -1,5 +1,8 @@ import { injectOptions, getOptionsFromBg, isAllowed } from '../options/syncOptions'; const source = '@devtools-extension'; +const pageSource = '@devtools-page'; +// Chrome message limit is 64 MB, but we're using 32 MB to include other object's parts +const maxChromeMsgSize = 32 * 1024 * 1024; let connected = false; let bg; @@ -48,6 +51,36 @@ function tryCatch(fn, args) { try { return fn(args); } catch (err) { + if (err.message === 'Message length exceeded maximum allowed length.') { + const instanceId = args.instanceId; + const newArgs = { split: 'start' }; + const toSplit = []; + let size = 0; + let arg; + Object.keys(args).map(key => { + arg = args[key]; + if (typeof arg === 'string') { + size += arg.length; + if (size > maxChromeMsgSize) { + toSplit.push([key, arg]); + return; + } + } + newArgs[key] = arg; + }); + fn(newArgs); + for (let i = 0; i < toSplit.length; i++) { + for (let j = 0; j < toSplit[i][1].length; j += maxChromeMsgSize) { + fn({ + instanceId, + source: pageSource, + split: 'chunk', + chunk: [toSplit[i][0], toSplit[i][1].substr(j, maxChromeMsgSize)] + }); + } + } + return fn({ instanceId, source: pageSource, split: 'end' }); + } handleDisconnect(); /* eslint-disable no-console */ if (process.env.NODE_ENV !== 'production') console.error('Failed to send message', err); @@ -70,7 +103,7 @@ function handleMessages(event) { if (!isAllowed()) return; if (!event || event.source !== window || typeof event.data !== 'object') return; const message = event.data; - if (message.source !== '@devtools-page') return; + if (message.source !== pageSource) return; if (message.type === 'DISCONNECT') { if (bg) { bg.disconnect(); From fdaeb959ee8cba2cf9df53f25717ac0e5e7b471c Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 27 Nov 2018 23:58:56 +0200 Subject: [PATCH 19/67] Include more info about @@INIT / REPLACE in Troubleshooting Closes #552 --- docs/Troubleshooting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index ae908093..ef6746c2 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -16,9 +16,9 @@ If you develop on your local filesystem, make sure to allow Redux DevTools acces Most likely you mutate the state. Check it by [adding `redux-immutable-state-invariant` middleware](https://github.com/zalmoxisus/redux-devtools-extension/blob/master/examples/counter/store/configureStore.js#L3). -### Last actions RE-APPLIED +### @@INIT or REPLACE action resets the state of the app or last actions RE-APPLIED -When you use `store.replaceReducer` the effect will be the same as for hot-reloading, where the extension is recomputing all the history again. To avoid that set [`shouldHotReload`](/docs/API/Arguments.md#shouldhotreload) parameter to `false`. +`@@redux/REPLACE` (or `@@INIT`) is used internally when the application is hot reloaded. When you use `store.replaceReducer` the effect will be the same as for hot-reloading, where the extension is recomputing all the history again. To avoid that set [`shouldHotReload`](/docs/API/Arguments.md#shouldhotreload) parameter to `false`. ### It doesn't work with other store enhancers From 6578cdbb3b134e5e57f27cf9544e45c7576a8b4b Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 02:05:04 +0200 Subject: [PATCH 20/67] v2.16.0 --- package.json | 2 +- src/browser/extension/manifest.json | 2 +- src/browser/firefox/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index cb8f6821..389a6350 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.15.5", + "version": "2.16.0", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index 6b09cba9..9cab6526 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.15.4", + "version": "2.16.0", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", diff --git a/src/browser/firefox/manifest.json b/src/browser/firefox/manifest.json index 94f6891d..50e8d30c 100644 --- a/src/browser/firefox/manifest.json +++ b/src/browser/firefox/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.15.4", + "version": "2.16.0", "name": "Redux DevTools", "manifest_version": 2, "description": "Redux Developer Tools for debugging application state changes.", From 0f14bb5f95efd87d763c83c40fe6bdbc5251bb76 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 12:22:42 +0200 Subject: [PATCH 21/67] Rollback dynamic maxAge as Redux 4 doesn't allow calling getState Related to #588, #592, #590 --- src/browser/extension/inject/pageScript.js | 25 +++------------------- src/browser/extension/manifest.json | 2 +- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index 8ab13143..c9f5978f 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -5,7 +5,7 @@ import configureStore, { getUrlParam } from '../../../app/stores/enhancerStore'; import { isAllowed } from '../options/syncOptions'; import Monitor from '../../../app/service/Monitor'; import { - noFiltersApplied, getLocalFilter, isFiltered, filterState, startingFrom + getLocalFilter, isFiltered, filterState, startingFrom } from '../../../app/api/filters'; import notifyErrors from '../../../app/api/notifyErrors'; import importState from '../../../app/api/importState'; @@ -36,7 +36,6 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { let store; let errorOccurred = false; - let maxAge; let actionCreators; let sendingActionId = 1; const instanceId = generateId(config.instanceId); @@ -235,26 +234,8 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } } - const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length - const getMaxAge = (liftedAction) => { - let m = config.maxAge || window.devToolsOptions.maxAge || 50; - if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) return m; - if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page - if (isFiltered(liftedAction.action, localFilter)) { - // TODO: check also predicate && !predicate(state, action) with current state - maxAge++; - } else { - filteredActionIds.push(store.liftedStore.getState().nextActionId); - if (filteredActionIds.length >= m) { - const stagedActionIds = store.liftedStore.getState().stagedActionIds; - let i = 1; - while (maxAge > m && filteredActionIds.indexOf(stagedActionIds[i]) === -1) { - maxAge--; i++; - } - filteredActionIds.shift(); - } - } - return maxAge; + const getMaxAge = () => { + return config && config.maxAge || window.devToolsOptions.maxAge || 50; }; function init() { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index 9cab6526..3e5c5a86 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.0", + "version": "2.16.1", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", From 969619c4575e9568bcb33d1ee57ee3a42688d238 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 13:10:13 +0200 Subject: [PATCH 22/67] Check if window.devToolsOptions was injected Related to #589 --- src/app/api/filters.js | 2 +- src/browser/extension/inject/pageScript.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index 6705322f..85c228ff 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -25,7 +25,7 @@ export const noFiltersApplied = (localFilter) => ( export function isFiltered(action, localFilter) { if (noFiltersApplied(localFilter) || typeof action.type.match !== 'function') return false; - const { whitelist, blacklist } = localFilter || window.devToolsOptions; + const { whitelist, blacklist } = localFilter || window.devToolsOptions || {}; return ( whitelist && !action.type.match(whitelist) || blacklist && action.type.match(blacklist) diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index c9f5978f..22804420 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -235,7 +235,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } const getMaxAge = () => { - return config && config.maxAge || window.devToolsOptions.maxAge || 50; + return config && config.maxAge || window.devToolsOptions && window.devToolsOptions.maxAge || 50; }; function init() { From 86b2897c41217d03016234237c91d921cf304e30 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 14:53:20 +0200 Subject: [PATCH 23/67] v2.16.2 --- package.json | 2 +- src/browser/extension/manifest.json | 2 +- src/browser/firefox/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 389a6350..64db5249 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.16.0", + "version": "2.16.2", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index 3e5c5a86..b0b90176 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.1", + "version": "2.16.2", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", diff --git a/src/browser/firefox/manifest.json b/src/browser/firefox/manifest.json index 50e8d30c..8837db03 100644 --- a/src/browser/firefox/manifest.json +++ b/src/browser/firefox/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.0", + "version": "2.16.2", "name": "Redux DevTools", "manifest_version": 2, "description": "Redux Developer Tools for debugging application state changes.", From 23fd97eff482a9ad4c1125590e8887b0ef5345cb Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 17:40:41 +0200 Subject: [PATCH 24/67] Check if filter from option page was injected Related to #588, #591 and #589 --- src/app/api/filters.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index 85c228ff..ce0d2cda 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -17,9 +17,9 @@ export function getLocalFilter(config) { } export const noFiltersApplied = (localFilter) => ( - // predicate || - !localFilter && window.devToolsOptions && - window.devToolsOptions.filter === FilterState.DO_NOT_FILTER + // !predicate && + !localFilter && (!window.devToolsOptions || !window.devToolsOptions.filter || + window.devToolsOptions.filter === FilterState.DO_NOT_FILTER) ); export function isFiltered(action, localFilter) { @@ -50,10 +50,7 @@ export function filterState(state, type, localFilter, stateSanitizer, actionSani if (type === 'ACTION') return !stateSanitizer ? state : stateSanitizer(state, nextActionId - 1); else if (type !== 'STATE') return state; - if ( - predicate || localFilter || window.devToolsOptions && - window.devToolsOptions.filter && window.devToolsOptions.filter !== FilterState.DO_NOT_FILTER - ) { + if (predicate || !noFiltersApplied(localFilter)) { const filteredStagedActionIds = []; const filteredComputedStates = []; const sanitizedActionsById = actionSanitizer && {}; @@ -106,8 +103,7 @@ export function startingFrom( const index = stagedActionIds.indexOf(sendingActionId); if (index === -1) return state; - const shouldFilter = predicate || localFilter || - window.devToolsOptions.filter !== FilterState.DO_NOT_FILTER; + const shouldFilter = predicate || !noFiltersApplied(localFilter); const filteredStagedActionIds = shouldFilter ? [0] : stagedActionIds; const actionsById = state.actionsById; const computedStates = state.computedStates; From 8d2593d3a2ae1b49bcafbe9f9a53153fd5dc5ebd Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 18:34:10 +0200 Subject: [PATCH 25/67] Bring dynamic maxAge back Related #588 --- src/browser/extension/inject/pageScript.js | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index 22804420..abe280ae 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -5,7 +5,7 @@ import configureStore, { getUrlParam } from '../../../app/stores/enhancerStore'; import { isAllowed } from '../options/syncOptions'; import Monitor from '../../../app/service/Monitor'; import { - getLocalFilter, isFiltered, filterState, startingFrom + noFiltersApplied, getLocalFilter, isFiltered, filterState, startingFrom } from '../../../app/api/filters'; import notifyErrors from '../../../app/api/notifyErrors'; import importState from '../../../app/api/importState'; @@ -36,6 +36,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { let store; let errorOccurred = false; + let maxAge; let actionCreators; let sendingActionId = 1; const instanceId = generateId(config.instanceId); @@ -234,8 +235,26 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } } - const getMaxAge = () => { - return config && config.maxAge || window.devToolsOptions && window.devToolsOptions.maxAge || 50; + const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length + const getMaxAge = (liftedAction) => { + let m = config && config.maxAge || window.devToolsOptions.maxAge || 50; + if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) return m; + if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page + if (isFiltered(liftedAction.action, localFilter)) { + // TODO: check also predicate && !predicate(state, action) with current state + maxAge++; + } else { + filteredActionIds.push(store.liftedStore.getState().nextActionId); + if (filteredActionIds.length >= m) { + const stagedActionIds = store.liftedStore.getState().stagedActionIds; + let i = 1; + while (maxAge > m && filteredActionIds.indexOf(stagedActionIds[i]) === -1) { + maxAge--; i++; + } + filteredActionIds.shift(); + } + } + return maxAge; }; function init() { From dbacf4aea2c8be1e5bd7addc302fffac32ff8214 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 18:36:41 +0200 Subject: [PATCH 26/67] Get liftedState from instrumentation instead of calling getState Related #588 --- package.json | 2 +- src/browser/extension/inject/pageScript.js | 6 +++--- yarn.lock | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 64db5249..8dc758f0 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "react-redux": "^4.4.5", "redux": "^3.5.2", "redux-devtools": "^3.4.1", - "redux-devtools-instrument": "^1.9.2", + "redux-devtools-instrument": "^1.9.3", "remotedev-app": "^0.10.10", "remotedev-monitor-components": "^0.0.5", "remotedev-serialize": "0.1.4", diff --git a/src/browser/extension/inject/pageScript.js b/src/browser/extension/inject/pageScript.js index abe280ae..94060861 100644 --- a/src/browser/extension/inject/pageScript.js +++ b/src/browser/extension/inject/pageScript.js @@ -236,7 +236,7 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { } const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length - const getMaxAge = (liftedAction) => { + const getMaxAge = (liftedAction, liftedState) => { let m = config && config.maxAge || window.devToolsOptions.maxAge || 50; if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) return m; if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page @@ -244,9 +244,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function(reducer, preloadedState, config) { // TODO: check also predicate && !predicate(state, action) with current state maxAge++; } else { - filteredActionIds.push(store.liftedStore.getState().nextActionId); + filteredActionIds.push(liftedState.nextActionId); if (filteredActionIds.length >= m) { - const stagedActionIds = store.liftedStore.getState().stagedActionIds; + const stagedActionIds = liftedState.stagedActionIds; let i = 1; while (maxAge > m && filteredActionIds.indexOf(stagedActionIds[i]) === -1) { maxAge--; i++; diff --git a/yarn.lock b/yarn.lock index aedeb153..30329128 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7349,10 +7349,10 @@ redux-devtools-instrument@^1.0.1: lodash "^4.2.0" symbol-observable "^1.0.2" -redux-devtools-instrument@^1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.2.tgz#c8bb81f295c60f1629164391c9c8552346d551c0" - integrity sha512-6ydVkHuAWPDRmEoVjPyJNF60y5pT6nIVyDXpTz2klGHu7oR+j3QJRMvRyyPYZMThePd8JIkh8/6L4zDXKED6aA== +redux-devtools-instrument@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.3.tgz#37b229f3a64a404d7d2c43489ef91cae8f712a4b" + integrity sha512-rt1pcRlu6QMTyvQdCDFm+5FGNfI3NdGVL/rKxBuTHbnn+y3x3x6zzh/ssAQmr2WqogTDG4Ero1tzfqANkaWhHg== dependencies: lodash "^4.2.0" symbol-observable "^1.0.2" From 1035d428149962d938eadd84038c89c20141c385 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 19:02:50 +0200 Subject: [PATCH 27/67] Update remotedev-app to get the last Inspector monitor --- package.json | 2 +- yarn.lock | 39 +++++++++++---------------------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 8dc758f0..8161f695 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "redux": "^3.5.2", "redux-devtools": "^3.4.1", "redux-devtools-instrument": "^1.9.3", - "remotedev-app": "^0.10.10", + "remotedev-app": "^0.10.11", "remotedev-monitor-components": "^0.0.5", "remotedev-serialize": "0.1.4", "remotedev-slider": "^1.1.1", diff --git a/yarn.lock b/yarn.lock index 30329128..37115196 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1033,13 +1033,6 @@ babel-plugin-transform-regenerator@^6.16.0: dependencies: regenerator-transform "0.9.8" -babel-plugin-transform-runtime@^6.7.5: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" - integrity sha1-PXW02Umtga8VdXAnOEb7Wa6w1Xw= - dependencies: - babel-runtime "^6.9.0" - babel-plugin-transform-strict-mode@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" @@ -7030,17 +7023,7 @@ react-icons@^2.2.1: dependencies: react-icon-base "2.0.4" -react-json-tree@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.10.0.tgz#92d5c223fc7718614a906591cd916127ce2b6033" - integrity sha1-ktXCI/x3GGFKkGWRzZFhJ84rYDM= - dependencies: - babel-plugin-transform-runtime "^6.7.5" - babel-runtime "^6.6.1" - react-base16-styling "^0.4.1" - react-pure-render "^1.0.2" - -react-json-tree@^0.10.0, react-json-tree@^0.10.9: +react-json-tree@^0.10.0, react-json-tree@^0.10.7, react-json-tree@^0.10.9: version "0.10.9" resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.10.9.tgz#7263173a2cc8bf05eac63b0419c3ce75b232e284" integrity sha1-cmMXOizIvwXqxjsEGcPOdbIy4oQ= @@ -7470,10 +7453,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -remotedev-app@^0.10.10: - version "0.10.10" - resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.10.tgz#846572cc08bcaaa80d53390dfba97eb7a020ef63" - integrity sha512-ChmS1Z+TWX+HNIuO5GPi+Gdd2JKVvUeEyB2rIxUliOx8Y127T9vqBqbASBc8S+t43S7QdWCHt1nbI/0iPyErZA== +remotedev-app@^0.10.11: + version "0.10.11" + resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.11.tgz#93499e304116fc35333a1f1c53637ee837b3335c" + integrity sha512-ZLZbGdSZejNeCYeYao+Xmxu6ocrvde5UIzVkC538KakLTPfk5Puz5F/POxhjD9u/xhfnYhv6tyVBTZL1pA5B9g== dependencies: chrome-storage-local "^0.1.6" d3-state-visualizer "^1.3.1" @@ -7492,16 +7475,16 @@ remotedev-app@^0.10.10: redux-devtools-log-monitor "^1.2.0" redux-devtools-test-generator "^0.4.0" redux-devtools-themes "^1.0.0" - remotedev-inspector-monitor "^0.10.2" + remotedev-inspector-monitor "^0.11.0" remotedev-monitor-components "^0.0.5" remotedev-slider "1.1.3" socketcluster-client "^5.5.0" styled-components "^1.1.1" -remotedev-inspector-monitor@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/remotedev-inspector-monitor/-/remotedev-inspector-monitor-0.10.2.tgz#2f6618fc2a2d5aa9d57e97baa21b9cb4f330f638" - integrity sha1-L2YY/CotWqnVfpe6ohuctPMw9jg= +remotedev-inspector-monitor@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/remotedev-inspector-monitor/-/remotedev-inspector-monitor-0.11.0.tgz#552dbc3736e6d898a783b51cfd7d20b875620d5f" + integrity sha1-VS28Nzbm2Jing7Uc/X0guHViDV8= dependencies: babel-runtime "^6.3.19" dateformat "^1.0.12" @@ -7515,7 +7498,7 @@ remotedev-inspector-monitor@^0.10.2: lodash.debounce "^4.0.3" react-base16-styling "^0.4.1" react-dragula "^1.1.17" - react-json-tree "0.10.0" + react-json-tree "^0.10.7" react-pure-render "^1.0.2" redux-devtools-themes "^1.0.0" From 48ac2d293366fdfb56378c6c36eaca1e65940fcd Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 19:08:43 +0200 Subject: [PATCH 28/67] Support action as a string in filters Related to #591 --- src/app/api/filters.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index ce0d2cda..e5614c9e 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -23,12 +23,16 @@ export const noFiltersApplied = (localFilter) => ( ); export function isFiltered(action, localFilter) { - if (noFiltersApplied(localFilter) || typeof action.type.match !== 'function') return false; + if ( + noFiltersApplied(localFilter) || + typeof action !== 'string' && typeof action.type.match !== 'function' + ) return false; const { whitelist, blacklist } = localFilter || window.devToolsOptions || {}; + const actionType = action.type || action; return ( - whitelist && !action.type.match(whitelist) || - blacklist && action.type.match(blacklist) + whitelist && !actionType.match(whitelist) || + blacklist && actionType.match(blacklist) ); } From e7c26217641ef6d53eb89607aa8030d4cac9ed75 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 19:18:11 +0200 Subject: [PATCH 29/67] v2.16.3 --- package.json | 2 +- src/browser/extension/manifest.json | 2 +- src/browser/firefox/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8161f695..06c8f268 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.16.2", + "version": "2.16.3", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index b0b90176..92fce123 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.2", + "version": "2.16.3", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", diff --git a/src/browser/firefox/manifest.json b/src/browser/firefox/manifest.json index 8837db03..74f52faf 100644 --- a/src/browser/firefox/manifest.json +++ b/src/browser/firefox/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.2", + "version": "2.16.3", "name": "Redux DevTools", "manifest_version": 2, "description": "Redux Developer Tools for debugging application state changes.", From de2c79295e702b4dc7c56ecb41e0efd6f511d50a Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 28 Nov 2018 20:01:13 +0200 Subject: [PATCH 30/67] Add to README how to load the extension from gh releases Related to #588 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fed71b7b..16ff51c3 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ ### 1. For Chrome - from [Chrome Web Store](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd); + - download `extension.zip` from [last releases](https://github.com/zalmoxisus/redux-devtools-extension/releases), unzip, open `chrome://extensions` url and turn on developer mode from top left and then click; on `Load Unpacked` and select the extracted folder for use - or build it with `npm i && npm run build:extension` and [load the extension's folder](https://developer.chrome.com/extensions/getstarted#unpacked) `./build/extension`; - or run it in dev mode with `npm i && npm start` and [load the extension's folder](https://developer.chrome.com/extensions/getstarted#unpacked) `./dev`. From d11eb65a9ad31a25f89d206f48ef442b4e8d7bd3 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Thu, 29 Nov 2018 01:01:40 +0200 Subject: [PATCH 31/67] Workaround for devpanel not having access in incognito mode Related to #597 and 580 --- src/browser/extension/devtools/index.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/browser/extension/devtools/index.js b/src/browser/extension/devtools/index.js index f9206141..b8e17f1c 100644 --- a/src/browser/extension/devtools/index.js +++ b/src/browser/extension/devtools/index.js @@ -1,3 +1,14 @@ -chrome.devtools.panels.create( - 'Redux', 'img/logo/scalable.png', chrome.extension.getBackgroundPage ? 'window.html' : 'devpanel.html', function() {} -); +function createPanel(url) { + chrome.devtools.panels.create( + 'Redux', 'img/logo/scalable.png', url, function() {} + ); +} + +if (chrome.runtime.getBackgroundPage) { + // Check if the background page's object is accessible (not in incognito) + chrome.runtime.getBackgroundPage(background => { + createPanel(background ? 'window.html' : 'devpanel.html'); + }); +} else { + createPanel('devpanel.html'); +} From 8abb34624f96c86da03bad18fa9fb71a28483431 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Thu, 29 Nov 2018 14:24:43 +0200 Subject: [PATCH 32/67] v2.16.4 --- package.json | 2 +- src/browser/extension/manifest.json | 2 +- src/browser/firefox/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 06c8f268..af170fe1 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.16.3", + "version": "2.16.4", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index 92fce123..8bb9089c 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.3", + "version": "2.16.4", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", diff --git a/src/browser/firefox/manifest.json b/src/browser/firefox/manifest.json index 74f52faf..d60b65d0 100644 --- a/src/browser/firefox/manifest.json +++ b/src/browser/firefox/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.3", + "version": "2.16.4", "name": "Redux DevTools", "manifest_version": 2, "description": "Redux Developer Tools for debugging application state changes.", From dcc94956c781f8e3384959c01925705845489293 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Thu, 29 Nov 2018 22:05:57 +0200 Subject: [PATCH 33/67] Fix actionsWhitelist/actionsBlacklist when provided as null --- src/app/api/filters.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/filters.js b/src/app/api/filters.js index e5614c9e..7be43f80 100644 --- a/src/app/api/filters.js +++ b/src/app/api/filters.js @@ -9,8 +9,8 @@ export const FilterState = { export function getLocalFilter(config) { if (config.actionsBlacklist || config.actionsWhitelist) { return { - whitelist: typeof config.actionsWhitelist === 'object' ? config.actionsWhitelist.join('|') : config.actionsWhitelist, - blacklist: typeof config.actionsBlacklist === 'object' ? config.actionsBlacklist.join('|') : config.actionsBlacklist + whitelist: Array.isArray(config.actionsWhitelist) ? config.actionsWhitelist.join('|') : config.actionsWhitelist, + blacklist: Array.isArray(config.actionsBlacklist) ? config.actionsBlacklist.join('|') : config.actionsBlacklist }; } return undefined; From 05f4dc175dbf0a74e5856b1204639d093621f8ea Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sat, 1 Dec 2018 14:54:11 +0200 Subject: [PATCH 34/67] Use gray icon by default for page action to fix regression in Chrome Related to #600 --- src/app/middlewares/api.js | 5 ++++- src/assets/img/logo/gray.png | Bin 0 -> 3640 bytes src/browser/extension/manifest.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 src/assets/img/logo/gray.png diff --git a/src/app/middlewares/api.js b/src/app/middlewares/api.js index 4be1ff6f..41457d61 100644 --- a/src/app/middlewares/api.js +++ b/src/app/middlewares/api.js @@ -178,7 +178,10 @@ function onConnect(port) { connections.tab[id] = port; listener = msg => { if (msg.name === 'INIT_INSTANCE') { - if (typeof id === 'number') chrome.pageAction.show(id); + if (typeof id === 'number') { + chrome.pageAction.show(id); + chrome.pageAction.setIcon({tabId: id, path: 'img/logo/38x38.png'}); + } if (isMonitored) port.postMessage({ type: 'START' }); const state = window.store.getState(); diff --git a/src/assets/img/logo/gray.png b/src/assets/img/logo/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..2787e3c32c9c76fdbcd8abb39739437820451951 GIT binary patch literal 3640 zcmaJ^c|4SR`zDlqiHKtvBeKsT%SBv5^c04p-ipJ-3S5ttz_iKaX}d}<^| zSGuds2{@ig*2nE&^cmz}E}MtP)Qk~~!v_-S0AHd%iGlzwG(QFcNCX7X#n1+96KqKg zARUXK5gj6I9q|!?co+d_b_8I`fO7+oiF6!*K@OsX!WjtQUvc5w`;Hp~1pEb|2O@xf zi*mKW0xYRCBEV4JP!A7=90C}_^dW|jLnaVi02B-{0D%oa5Cc636b^>LA%=jT50IOU zM(~5%qcA^naV-QefKCsFgFxZo;rihQ`c#@f2m*t_Kwu~c3f1Ex^g@{wI*y@7303iP>E zO1CHeSH{1hLmipHM36l(lp03EbLZiw_KVEz-TzLs1LUfKqp0{WGLb^JLLq=$k3NA! zfE%MM4jC9@kZ6>N1q6aNF);xf!AvkFXbcLBG%`m2;#yHc={O3W_=`*WFBkSdxo}Gw z5l5%e9I4cxU(>?|Q0dgr0BSJ6(h{I)gTs?3JGRzNZ+}W9(nx2B1PqNz2K?0=IO$&m zKn*Y^mc|xF#)eQRSG*w-iZRBZEifoF3Ij!AxZ?lj68@#|pIqbrmkZ*G0qsoo|4jOq zi@QEM*MIhwYy7kML<)D^Y23a3Osdu9;Ss)Xg+e+qhUhm%f}AJhUv#g2$)p8792v6L zF3LD_Oc#n72g)WqbxnO)-8ibzz>k^4)*rk6@<7%BUFnNi6u}Nu0sc~(kG$xMM$v2? z0n~nJflen)y$klaZ!MZfw%1HYY#%?d;@nwnnPT4U+J4y54XavOT57ADoSX#6CSUlf zbok8L5+cPdg_Gi$Vq9wy^?hx*xVYGNWqAtHY;)UaZtM$VR)qDwf$9P^V{aTx>H4I_ zX>vW;iH}ar&Q_u?a1f2muYT7sF2F<&Rz|m~;+r3L)5Q9+y0f6f&f|kD&)c0X@pX~& zRT~={vYT#)yXL@2LAXa*Omx|o@HBajwC~M`EGISj=IowK{E?RO@*qz;J3AhzY6avm zDYj4Svf`w|)x{_nUJVbaJVFyF5G;Bl?b&>WoL9h>oz!ZwAUJ~mv;B= zh%ZD>Pp>iRM}(k9@C^~99MgfMB%Esr4IEjX~X%Rbtx%J%{^Y*zsW*S5xZ5-UI+ zZ5BggNGGoeOls_V@RfYee~> zL^L`V{F_vocIPBB%-B65_0$n%M<=H`O<3{x06JM#VBfxdPWuOJ*w`TaC%Mja?;=Qm z*md7OD8Q}#kTZtnxPKSV2~gp6cQ4H>Jh6%MKj#W1zHr*mD87gsE6 zSMCSSKN4|IR>FbyumH8`{;zMCrcel27KFxVq;^^FJ)Xdwnh^7MxJ3l&F!%n zcjm#Ett~qSk1IUu%f*5Y@mFRzgaZbj_#kE)PzMLq4v5V}&Fn^P>V{`=^43H@dqs8U zAovVL>~|3cZW>$XyJ@QcXrWwC9GEJ5x4)zvptv3}EvY^CmO#tkjC`GK|d z>@kho{BYJy#}Bb1$mAkLv+<$_gitfTFL!bhw?Rd>oSNy=!Pk?^FQrT_Cz_l9hV8m|Bf8xco0pkhkI_V2{D;MTXPIhj*Yfl<|ONEVM?SD zY~ti;aeHZEmCXG6hRRP9!hf8SMYI$M!+Zq;=le>!5B}KrCbBLZvX?Lv(8Sh4iDqW{bFB`z}S?}J~=RV(q1b)dAzW;miRLh=p9fBk;;@Vl8YNacU zvZyK5;A{`IS|=5&9BMv+B@@5Uobx2Xqqs9(U~$@nU+(5?|E{McUGQz%UIVrt8P(H5g@xuq(GGq+;yYAsN@?&LV7JPouGE!B2!ZFE?q3wOM4blIBn zyk}wUz*El44I{J8+QH#{P2ZNM`yTVAk!}_A$TBFYs!J&{sJz~eN8M}XwGR?SvhD{w zM1}6xJ&>?ltB%+Ty;?)oD*a(#MwotmrE072l&*Tb{h<(DUgg5JsFb~5XCpmNiXeKW zQ4_I0Nd4Vm&evD+UyMA9zc%69A>Y_ub4ktr!l&aM>s6Mrk9g*eJC`2D&nZYE_~B-s znC69X9rg`RH_0j4EzN^1OUhNNH)Z5bs;WQ7o-XxunJGsU)tKnIxn`8BxA)x7H5`Or zeke0Mvc9LHS#0L<!DQ>RDv#5}*|0n4bNS7zs3 zJXZeXrLD`07y~I@&xwn!i-u%&?1doL&(5b`8|U})y(%fw^Bumpikk;%B$R>((`UEn^AXo#{*5jwc5JzieE6l z|EMA^LW>dk#JxhT9DFG!dnnH0nMu@^dff9H#Wb0!hJ&RUEk0T*j1qI*-=$^?zKLn> zO7yq3=@=+XUytfFS5 zZ0Y=B>y6h#Bd!Vo-%7=oA9WXtd5O2TPg%UczmR6%Hb2~ykl&+l4(RS|^uQ>qhJJr2 z@6Ux8aBcqe=Gc|+1x3;1Z-(RmzcvN}FR|=^_x7@K9JilAr8~b@$?aX-1Oew<<`hzgw)VT@@n?hW%V&vO0rkA^EtVr$CheztC41$Vgn5!GDxJ?Yh*B= zY%sd*ewAmvcm2c7X$4|oyjOEy`P5nW& Date: Sat, 1 Dec 2018 20:59:12 +0200 Subject: [PATCH 35/67] Update dependences to fix #598 --- package.json | 6 +++--- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index af170fe1..f91023bd 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "webpack": "^3.1.0" }, "dependencies": { - "jsan": "3.1.9", + "jsan": "^3.1.12", "lodash": "^4.17.2", "react": "^15.4.1", "react-dom": "^15.4.1", @@ -82,9 +82,9 @@ "redux": "^3.5.2", "redux-devtools": "^3.4.1", "redux-devtools-instrument": "^1.9.3", - "remotedev-app": "^0.10.11", + "remotedev-app": "^0.10.12", "remotedev-monitor-components": "^0.0.5", - "remotedev-serialize": "0.1.4", + "remotedev-serialize": "^0.1.5", "remotedev-slider": "^1.1.1", "remotedev-utils": "0.0.1" } diff --git a/yarn.lock b/yarn.lock index 37115196..64116cb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4522,10 +4522,10 @@ js-yaml@3.4.5: argparse "^1.0.2" esprima "^2.6.0" -jsan@3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" - integrity sha1-JwVnbBBY8KfZrCZq0Daldpz6fJY= +jsan@^3.1.11, jsan@^3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.12.tgz#e784ce5ab533ee41f868bb054d74769365c80be5" + integrity sha512-EDJhJdWGP++Qh5TGfsdc3k2hFjr1/4Q3nVX6MPkTYlqqj3Xv9erXnBRZEBmuGR2IpfARdm0Ivj5EBSvhFylWRA== jsan@^3.1.3: version "3.1.10" @@ -7453,15 +7453,15 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -remotedev-app@^0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.11.tgz#93499e304116fc35333a1f1c53637ee837b3335c" - integrity sha512-ZLZbGdSZejNeCYeYao+Xmxu6ocrvde5UIzVkC538KakLTPfk5Puz5F/POxhjD9u/xhfnYhv6tyVBTZL1pA5B9g== +remotedev-app@^0.10.12: + version "0.10.12" + resolved "https://registry.yarnpkg.com/remotedev-app/-/remotedev-app-0.10.12.tgz#0f46847635c4cade6b925749fcf6c3c5d4f050c9" + integrity sha512-hwgL0ik5La9Ct2Juwgej9xixuT1VBLEosWih68zzipatN4K6Pw5PEJ9cSCdrGzbHjETzejisRE615xtm337T4Q== dependencies: chrome-storage-local "^0.1.6" d3-state-visualizer "^1.3.1" javascript-stringify "^1.5.0" - jsan "3.1.9" + jsan "^3.1.12" jsondiffpatch "^0.2.4" lodash "^4.0.0" material-ui "0.16.4" @@ -7518,12 +7518,12 @@ remotedev-monitor-components@^0.0.5: codemirror "^5.21.0" styled-components "^1.1.1" -remotedev-serialize@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.4.tgz#2a15e4e514fd393c20328ef978504b4fc272e367" - integrity sha512-xFUjsHi/qY14uJmyk1uZynRJli5j5JdTE8Qm2jNCHMQVRSdKRqGh2vqQh6eoOiRX4K8yxjEXqtcxd4Oj2dmK4Q== +remotedev-serialize@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.5.tgz#26ae46fcefb7cdf6cb282a9a7c717c2d3d26972e" + integrity sha512-ed5rQ3Q78s8r2+iL9KjsFQfVWySnoFYxgyo6g2/4T74PpKOVW3M13t4Ahzds+EvIN9EHGypx+6LesgTyHgjI9Q== dependencies: - jsan "3.1.9" + jsan "^3.1.11" remotedev-slider@1.1.3, remotedev-slider@^1.1.1: version "1.1.3" From 038f687e5dc79842eb1f318f5910adbb82789153 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sat, 1 Dec 2018 21:11:07 +0200 Subject: [PATCH 36/67] v2.16.5 --- package.json | 2 +- src/browser/extension/manifest.json | 2 +- src/browser/firefox/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f91023bd..2e2a88a0 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.16.4", + "version": "2.16.5", "name": "remotedev-redux-devtools-extension", "description": "Redux Developer Tools for debugging application state changes.", "scripts": { diff --git a/src/browser/extension/manifest.json b/src/browser/extension/manifest.json index 2841835e..f642996f 100644 --- a/src/browser/extension/manifest.json +++ b/src/browser/extension/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.4", + "version": "2.16.5", "name": "Redux DevTools", "short_name": "Redux DevTools", "description": "Redux DevTools for debugging application's state changes.", diff --git a/src/browser/firefox/manifest.json b/src/browser/firefox/manifest.json index d60b65d0..0b16a420 100644 --- a/src/browser/firefox/manifest.json +++ b/src/browser/firefox/manifest.json @@ -1,5 +1,5 @@ { - "version": "2.16.4", + "version": "2.16.5", "name": "Redux DevTools", "manifest_version": 2, "description": "Redux Developer Tools for debugging application state changes.", From 0c6fadd84ed01a07dc9052c1d2ccf6f9b37b1cf8 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 4 Dec 2018 00:44:12 +0200 Subject: [PATCH 37/67] [Examples] Add modified date to todomvc Demo for #468 --- examples/todomvc/reducers/todos.js | 8 +++++--- examples/todomvc/store/configureStore.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/todomvc/reducers/todos.js b/examples/todomvc/reducers/todos.js index 8eca4f3a..d972d145 100644 --- a/examples/todomvc/reducers/todos.js +++ b/examples/todomvc/reducers/todos.js @@ -3,6 +3,7 @@ import { ADD_TODO, DELETE_TODO, EDIT_TODO, COMPLETE_TODO, COMPLETE_ALL, CLEAR_CO const initialState = [{ text: 'Use Redux', completed: false, + modified: new Date(), id: 0 }]; @@ -12,6 +13,7 @@ export default function todos(state = initialState, action) { return [{ id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1, completed: false, + modified: new Date(), text: action.text }, ...state]; @@ -23,21 +25,21 @@ export default function todos(state = initialState, action) { case EDIT_TODO: return state.map(todo => todo.id === action.id ? - Object.assign({}, todo, { text: action.text }) : + Object.assign({}, todo, { text: action.text, modified: new Date() }) : todo ); case COMPLETE_TODO: return state.map(todo => todo.id === action.id ? - Object.assign({}, todo, { completed: !todo.completed }) : + Object.assign({}, todo, { completed: !todo.completed, modified: new Date() }) : todo ); case COMPLETE_ALL: const areAllMarked = state.every(todo => todo.completed); return state.map(todo => Object.assign({}, todo, { - completed: !areAllMarked + completed: !areAllMarked, modified: new Date() })); case CLEAR_COMPLETED: diff --git a/examples/todomvc/store/configureStore.js b/examples/todomvc/store/configureStore.js index b483cf42..bf33bb49 100644 --- a/examples/todomvc/store/configureStore.js +++ b/examples/todomvc/store/configureStore.js @@ -4,7 +4,7 @@ import * as actionCreators from '../actions'; export default function configureStore(preloadedState) { const enhancer = window.__REDUX_DEVTOOLS_EXTENSION__ && - window.__REDUX_DEVTOOLS_EXTENSION__({ actionCreators }); + window.__REDUX_DEVTOOLS_EXTENSION__({ actionCreators, serialize: true }); if (!enhancer) { console.warn('Install Redux DevTools Extension to inspect the app state: ' + 'https://github.com/zalmoxisus/redux-devtools-extension#installation') From 028e69e072ddb31bb22d1a2e847690ca8d29fc63 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Wed, 5 Dec 2018 21:49:17 +0200 Subject: [PATCH 38/67] [docs] Add React integrations --- docs/Integrations.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/Integrations.md b/docs/Integrations.md index 94d9ddb4..b09ef8ca 100644 --- a/docs/Integrations.md +++ b/docs/Integrations.md @@ -1,6 +1,7 @@ # Integrations for js and non-js frameworks Mostly functional: +- [React](#react) - [Angular](#angular) - [Cycle](#cycle) - [Ember](#ember) @@ -15,6 +16,40 @@ In progress: - [Python](#python) - [Swift](#swift) +### [React](https://github.com/facebook/react) +#### Inspect React props +##### [`react-inspect-props`](https://github.com/lucasconstantino/react-inspect-props) +```js +import { compose, withState } from 'recompose' +import { inspectProps } from 'react-inspect-props' + +compose( + withState('count', 'setCount', 0), + inspectProps('Counter inspector') +)(Counter) +``` + +#### Inspect React states +##### [`remotedev-react-state`](https://github.com/jhen0409/remotedev-react-state) +```js +import connectToDevTools from 'remotedev-react-state' + +componentWillMount() { + // Connect to devtools after setup initial state + connectToDevTools(this/*, options */) + } +``` + +#### Inspect React hooks (useState and useReducer) +##### [`reinspect`](https://github.com/troch/reinspect) +```js +import { useState } from 'reinspect' + +export function CounterWithUseState({ id }) { + const [count, setCount] = useState(0, id) + // ... +} +``` ### [Mobx](https://github.com/mobxjs/mobx) #### [`mobx-remotedev`](https://github.com/zalmoxisus/mobx-remotedev) From b8767bc34bcd23cf3d1df55643e22b2e991d140d Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Sat, 8 Dec 2018 22:55:24 +0200 Subject: [PATCH 39/67] Fix Immutable refs during parsing kolodny/jsan/issues/19 --- package.json | 4 ++-- src/app/api/index.js | 3 ++- yarn.lock | 17 +++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 2e2a88a0..f8d99b36 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "webpack": "^3.1.0" }, "dependencies": { - "jsan": "^3.1.12", + "jsan": "^3.1.13", "lodash": "^4.17.2", "react": "^15.4.1", "react-dom": "^15.4.1", @@ -84,7 +84,7 @@ "redux-devtools-instrument": "^1.9.3", "remotedev-app": "^0.10.12", "remotedev-monitor-components": "^0.0.5", - "remotedev-serialize": "^0.1.5", + "remotedev-serialize": "^0.1.7", "remotedev-slider": "^1.1.1", "remotedev-utils": "0.0.1" } diff --git a/src/app/api/index.js b/src/app/api/index.js index bc9412db..8c96a110 100644 --- a/src/app/api/index.js +++ b/src/app/api/index.js @@ -51,7 +51,8 @@ export function getSeralizeParameter(config, param) { return { replacer: immutableSerializer.replacer, reviver: immutableSerializer.reviver, - options: serialize.options || true + options: typeof serialize.options === 'object' ? + { ...immutableSerializer.options, ...serialize.options } : immutableSerializer.options }; } if (!serialize.replacer && !serialize.reviver) return { options: serialize.options }; diff --git a/yarn.lock b/yarn.lock index 64116cb6..fc964a3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4522,11 +4522,16 @@ js-yaml@3.4.5: argparse "^1.0.2" esprima "^2.6.0" -jsan@^3.1.11, jsan@^3.1.12: +jsan@^3.1.12: version "3.1.12" resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.12.tgz#e784ce5ab533ee41f868bb054d74769365c80be5" integrity sha512-EDJhJdWGP++Qh5TGfsdc3k2hFjr1/4Q3nVX6MPkTYlqqj3Xv9erXnBRZEBmuGR2IpfARdm0Ivj5EBSvhFylWRA== +jsan@^3.1.13: + version "3.1.13" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86" + integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g== + jsan@^3.1.3: version "3.1.10" resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.10.tgz#ba9917b864defff567e0c990a34ae7a8d5eb1d90" @@ -7518,12 +7523,12 @@ remotedev-monitor-components@^0.0.5: codemirror "^5.21.0" styled-components "^1.1.1" -remotedev-serialize@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.5.tgz#26ae46fcefb7cdf6cb282a9a7c717c2d3d26972e" - integrity sha512-ed5rQ3Q78s8r2+iL9KjsFQfVWySnoFYxgyo6g2/4T74PpKOVW3M13t4Ahzds+EvIN9EHGypx+6LesgTyHgjI9Q== +remotedev-serialize@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.7.tgz#744182d1d42c557207495a438442f18152933ec3" + integrity sha512-iTWTPjxazpwRHDqrfR0Vaxnq1XdW3TOAuClowoj6DYu3z0iQmd812tvrmA96TswZv22gIkwx9eEhz7vOQOEIgw== dependencies: - jsan "^3.1.11" + jsan "^3.1.13" remotedev-slider@1.1.3, remotedev-slider@^1.1.1: version "1.1.3" From bb153bec246444b9a08e7fabfbc727fb92b9347c Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 10 Dec 2018 15:27:40 +0200 Subject: [PATCH 40/67] [Tests] Replace deprecated `window.devToolsExtension` --- test/app/inject/api.spec.js | 18 +++++++++--------- test/app/inject/enhancer.spec.js | 8 ++++---- test/electron/fixture/renderer.js | 2 +- test/perf/send.spec.js | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/test/app/inject/api.spec.js b/test/app/inject/api.spec.js index c7035311..58e4f200 100644 --- a/test/app/inject/api.spec.js +++ b/test/app/inject/api.spec.js @@ -4,32 +4,32 @@ import { insertScript, listenMessage } from '../../utils/inject'; import '../../../src/browser/extension/inject/pageScript'; describe('API', () => { - it('should get window.devToolsExtension function', () => { - expect(window.devToolsExtension).toBeA('function'); + it('should get window.__REDUX_DEVTOOLS_EXTENSION__ function', () => { + expect(window.__REDUX_DEVTOOLS_EXTENSION__).toBeA('function'); }); it('should notify error', () => { const spy = expect.createSpy(() => {}); - window.devToolsExtension.notifyErrors(spy); + window.__REDUX_DEVTOOLS_EXTENSION__.notifyErrors(spy); insertScript('hi()'); expect(spy).toHaveBeenCalled(); }); it('should open monitor', async () => { let message = await listenMessage(() => { - window.devToolsExtension.open(); + window.__REDUX_DEVTOOLS_EXTENSION__.open(); }); expect(message).toEqual({ source: '@devtools-page', type: 'OPEN', position: 'right' }); message = await listenMessage(() => { - window.devToolsExtension.open('left'); + window.__REDUX_DEVTOOLS_EXTENSION__.open('left'); }); expect(message).toEqual({ source: '@devtools-page', type: 'OPEN', position: 'left' }); }); it('should send message', async () => { let message = await listenMessage(() => { - window.devToolsExtension.send('hi'); + window.__REDUX_DEVTOOLS_EXTENSION__.send('hi'); }); expect(message).toInclude({ type: 'ACTION', @@ -41,7 +41,7 @@ describe('API', () => { expect(message.action).toMatch(/{"action":{"type":"hi"},"timestamp":\d+}/); message = await listenMessage(() => { - window.devToolsExtension.send({ type: 'hi' }, { counter: 1 }, 1); + window.__REDUX_DEVTOOLS_EXTENSION__.send({ type: 'hi' }, { counter: 1 }, 1); }); expect(message).toInclude({ type: 'ACTION', @@ -53,7 +53,7 @@ describe('API', () => { expect(message.action).toMatch(/{"action":{"type":"hi"},"timestamp":\d+}/); message = await listenMessage(() => { - window.devToolsExtension.send({ type: 'hi' }, { counter: 1 }, 1); + window.__REDUX_DEVTOOLS_EXTENSION__.send({ type: 'hi' }, { counter: 1 }, 1); }); expect(message).toInclude({ type: 'ACTION', @@ -65,7 +65,7 @@ describe('API', () => { expect(message.action).toMatch(/{"action":{"type":"hi"},"timestamp":\d+}/); message = await listenMessage(() => { - window.devToolsExtension.send(undefined, { counter: 1 }, 1); + window.__REDUX_DEVTOOLS_EXTENSION__.send(undefined, { counter: 1 }, 1); }); expect(message).toEqual({ action: undefined, diff --git a/test/app/inject/enhancer.spec.js b/test/app/inject/enhancer.spec.js index d4587614..2932959d 100644 --- a/test/app/inject/enhancer.spec.js +++ b/test/app/inject/enhancer.spec.js @@ -15,7 +15,7 @@ function counter(state = 0, action) { describe('Redux enhancer', () => { it('should create the store', async () => { const message = await listenMessage(() => { - window.store = createStore(counter, window.devToolsExtension()); + window.store = createStore(counter, window.__REDUX_DEVTOOLS_EXTENSION__()); expect(window.store).toBeA('object'); }); expect(message.type).toBe('INIT_INSTANCE'); @@ -147,7 +147,7 @@ describe('Redux enhancer', () => { it('should create the store with config parameters', async () => { const message = await listenMessage(() => { - window.store = createStore(counter, window.devToolsExtension({ + window.store = createStore(counter, window.__REDUX_DEVTOOLS_EXTENSION__({ actionsBlacklist: ['SOME_ACTION'], statesFilter: state => state, serializeState: (key, value) => value @@ -159,7 +159,7 @@ describe('Redux enhancer', () => { it('should create the store using old Redux api', async () => { const message = await listenMessage(() => { - window.store = window.devToolsExtension()(createStore)(counter); + window.store = window.__REDUX_DEVTOOLS_EXTENSION__()(createStore)(counter); expect(window.store).toBeA('object'); }); expect(message.type).toBe('INIT_INSTANCE'); @@ -171,7 +171,7 @@ describe('Redux enhancer', () => { const message = await listenMessage(() => { window.store = createStore(counter, compose( testEnhancer, - window.devToolsExtension()) + window.__REDUX_DEVTOOLS_EXTENSION__()) ); expect(window.store).toBeA('object'); }); diff --git a/test/electron/fixture/renderer.js b/test/electron/fixture/renderer.js index b185b83e..e501f7d3 100644 --- a/test/electron/fixture/renderer.js +++ b/test/electron/fixture/renderer.js @@ -17,7 +17,7 @@ const store = createStore( } }, initialState, - window.devToolsExtension ? window.devToolsExtension() : noop => noop + window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : noop => noop ); const el = document.getElementById('counter'); diff --git a/test/perf/send.spec.js b/test/perf/send.spec.js index 8bac065b..41806520 100644 --- a/test/perf/send.spec.js +++ b/test/perf/send.spec.js @@ -8,7 +8,7 @@ function test(title, data, maxTime = 100) { it('should send ' + title, async() => { const start = new Date(); await listenMessage(() => { - window.devToolsExtension.send({ type: 'TEST_ACTION', data }, data); + window.__REDUX_DEVTOOLS_EXTENSION__.send({ type: 'TEST_ACTION', data }, data); }); const ms = new Date() - start; // console.log(ms); From af37aa3b937694201c3d06102739a3b70c020f64 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Mon, 10 Dec 2018 18:10:41 +0200 Subject: [PATCH 41/67] [docs] Typescript support links Closes #599 --- README.md | 2 ++ docs/Recipes.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 16ff51c3..1b509267 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ Note that [`preloadedState`](http://redux.js.org/docs/api/createStore.html) argu > For universal ("isomorphic") apps, prefix it with `typeof window !== 'undefined' &&`. +> For TypeScript use [`redux-devtools-extension` npm package](#13-use-redux-devtools-extension-package-from-npm), which contains all the definitions, or just use `(window as any)` (see [Recipes](/docs/Recipes.md#using-in-a-typescript-project) for an example). + In case ESLint is configured to not allow using the underscore dangle, wrap it like so: ```diff + /* eslint-disable no-underscore-dangle */ diff --git a/docs/Recipes.md b/docs/Recipes.md index 53b56bf6..d051f07b 100644 --- a/docs/Recipes.md +++ b/docs/Recipes.md @@ -2,6 +2,8 @@ ### Using in a typescript project +The recommended way is to use [`redux-devtools-extension` npm package](/README.md#13-use-redux-devtools-extension-package-from-npm), which contains all typescript definitions. Or you can just use `window as any`: + ```js const store = createStore( rootReducer, From a8489fd589d4bd8be9587355474b105b5c6a10b5 Mon Sep 17 00:00:00 2001 From: Zalmoxisus Date: Tue, 18 Dec 2018 19:19:25 +0200 Subject: [PATCH 42/67] Update webpack and use terser instead of uglify --- package.json | 5 +- webpack/base.config.js | 32 +- yarn.lock | 990 ++++++++++++++++++++++++++++------------- 3 files changed, 697 insertions(+), 330 deletions(-) diff --git a/package.json b/package.json index f8d99b36..dba92466 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "selenium-webdriver": "^3.0.1", "sinon-chrome": "^1.1.2", "style-loader": "^0.18.2", - "webpack": "^3.1.0" + "webpack": "^4.27.1" }, "dependencies": { "jsan": "^3.1.13", @@ -86,6 +86,7 @@ "remotedev-monitor-components": "^0.0.5", "remotedev-serialize": "^0.1.7", "remotedev-slider": "^1.1.1", - "remotedev-utils": "0.0.1" + "remotedev-utils": "0.0.1", + "terser-webpack-plugin": "^1.1.0" } } diff --git a/webpack/base.config.js b/webpack/base.config.js index fc584659..d74a6dc1 100644 --- a/webpack/base.config.js +++ b/webpack/base.config.js @@ -1,10 +1,13 @@ import path from 'path'; import webpack from 'webpack'; +import TerserPlugin from 'terser-webpack-plugin'; const extpath = path.join(__dirname, '../src/browser/extension/'); const mock = `${extpath}chromeAPIMock.js`; const baseConfig = (params) => ({ + // devtool: 'source-map', + mode: 'production', entry: params.input || { background: [ mock, `${extpath}background/index` ], options: [ mock, `${extpath}options/index` ], @@ -28,19 +31,26 @@ const baseConfig = (params) => ({ ...(params.plugins ? params.plugins : [ new webpack.optimize.ModuleConcatenationPlugin(), - new webpack.optimize.OccurrenceOrderPlugin(), - new webpack.optimize.UglifyJsPlugin({ - comments: false, - compressor: { - warnings: false - }, - mangle: { - screw_ie8: true, - keep_fnames: true - } - }) + new webpack.optimize.OccurrenceOrderPlugin() ]) ], + optimization: { + minimizer: [ + new TerserPlugin({ + terserOptions: { + output: { + comments: false + } + }, + // sourceMap: true, + cache: true, + parallel: true + }) + ] + }, + performance: { + hints: false + }, resolve: { alias: { app: path.join(__dirname, '../src/app'), diff --git a/yarn.lock b/yarn.lock index fc964a3f..0b0bada1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,159 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" integrity sha512-M7x8+5D1k/CuA6jhiwuSCmE8sbUWJF0wYsjcig9WrXvwUI5ArEoUBdOXpV4JcEMrLp02/QbDjw+kI+vQeKyQgg== +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== + abab@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" @@ -17,12 +170,12 @@ abbrev@1, abbrev@~1.0.7, abbrev@~1.0.9: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== dependencies: - acorn "^4.0.3" + acorn "^5.0.0" acorn-globals@^1.0.4: version "1.0.9" @@ -48,21 +201,31 @@ acorn@^3.1.0, acorn@~3.3.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^4.0.3, acorn@~4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" - integrity sha1-F6jWp6bE71OLgU7Jq6wneSk78wo= - acorn@^5.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298" integrity sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g== +acorn@^5.6.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@~4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + integrity sha1-F6jWp6bE71OLgU7Jq6wneSk78wo= + adm-zip@^0.4.7: version "0.4.7" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" integrity sha1-hgbCy/HEJs6MjsABdER/1Jtur8E= +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" @@ -121,11 +284,6 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" integrity sha1-xQYbbg74qBd15Q9dZhUb9r83EQc= -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -172,6 +330,11 @@ aproba@^1.0.3, aproba@~1.0.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" integrity sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA= +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + archy@^1.0.0, archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -322,7 +485,7 @@ async@^1.4.0: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.0.1, async@^2.1.2: +async@^2.0.1: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" integrity sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ= @@ -1199,6 +1362,11 @@ balanced-match@^0.4.1: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + base-64@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" @@ -1275,6 +1443,11 @@ block-stream@*, block-stream@0.0.9: dependencies: inherits "~2.0.0" +bluebird@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -1319,6 +1492,14 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -1466,6 +1647,26 @@ builtins@0.0.7: resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo= +cacache@^11.0.2: + version "11.3.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" + integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1499,11 +1700,6 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -1633,6 +1829,13 @@ chrome-storage-local@^0.1.6: resolved "https://registry.yarnpkg.com/chrome-storage-local/-/chrome-storage-local-0.1.7.tgz#bb2a3689d663b3a1f4d394592f83914fddc4adba" integrity sha1-uyo2idZjs6H005RZL4ORT93Erbo= +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + chromedriver@^2.35.0: version "2.35.0" resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.35.0.tgz#c103ba2fb3d1671f666058159f5cbaa816902e4d" @@ -1701,15 +1904,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -1818,6 +2012,11 @@ commander@2.9.0, commander@^2.8.1, commander@^2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1847,7 +2046,7 @@ concat-stream@1.6.0, concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@1.6.2: +concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1908,6 +2107,18 @@ convert-source-map@^1.1.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" integrity sha1-6fPpxuJyjvwmdmlqcOs4L3MQamc= +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1974,15 +2185,6 @@ cross-spawn@^3.0.1: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - crossvent@1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/crossvent/-/crossvent-1.5.4.tgz#da2c4f8f40c94782517bf2beec1044148194ab92" @@ -2088,6 +2290,11 @@ custom-event@1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.0.tgz#2e4628be19dc4b214b5c02630c5971e811618062" integrity sha1-LkYovhncSyFLXAJjDFlx6BFhgGI= +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + d3-state-visualizer@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/d3-state-visualizer/-/d3-state-visualizer-1.3.2.tgz#8e3ac418aa7ee7e3f46025309f9d1c215ee385eb" @@ -2170,7 +2377,7 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2397,6 +2604,16 @@ duplexer2@0.0.2: dependencies: readable-stream "~1.1.9" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -2458,6 +2675,13 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + end-of-stream@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" @@ -2465,15 +2689,14 @@ end-of-stream@~0.1.5: dependencies: once "~1.3.0" -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" + tapable "^1.0.0" entities@^1.1.1, entities@~1.1.1: version "1.1.1" @@ -2502,6 +2725,13 @@ errno@^0.1.3: dependencies: prr "~0.0.0" +errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" @@ -2623,7 +2853,7 @@ escodegen@^1.6.1: optionalDependencies: source-map "~0.2.0" -escope@^3.3.0, escope@^3.6.0: +escope@^3.3.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= @@ -2643,6 +2873,14 @@ eslint-plugin-react@^3.2.3: resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-3.16.1.tgz#262d96b77d7c4a42af809a73c0e527a58612293c" integrity sha1-Ji2Wt318SkKvgJpzwOUnpYYSKTw= +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint@^1.7.1: version "1.10.3" resolved "https://registry.yarnpkg.com/eslint/-/eslint-1.10.3.tgz#fb19a91b13c158082bbca294b17d979bc8353a0a" @@ -2751,19 +2989,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2948,6 +3173,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.3.5: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -2999,6 +3229,15 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" @@ -3012,13 +3251,20 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" @@ -3062,6 +3308,14 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" @@ -3130,6 +3384,14 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" @@ -3171,6 +3433,16 @@ fs-vacuum@~1.2.7, fs-vacuum@~1.2.9: path-is-inside "^1.0.1" rimraf "^2.5.2" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs-write-stream-atomic@~1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.8.tgz#e49aaddf288f87d46ff9e882f216a13abc40778b" @@ -3288,11 +3560,6 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= - get-params@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" @@ -3303,11 +3570,6 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-value@^2.0.2, get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3461,6 +3723,18 @@ glob@^7.0.3, glob@~7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~3.1.21: version "3.1.21" resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" @@ -3552,6 +3826,11 @@ graceful-fs@^3.0.0: dependencies: natives "^1.1.0" +graceful-fs@^4.1.11: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.3, graceful-fs@~4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3713,11 +3992,6 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -4040,11 +4314,6 @@ invariant@^2.0.0, invariant@^2.2.0: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - irregular-plurals@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" @@ -4236,11 +4505,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" @@ -4395,7 +4659,7 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -4578,10 +4842,10 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-helpfulerror@^1.0.2: version "1.0.3" @@ -4617,7 +4881,7 @@ json3@3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= @@ -4747,13 +5011,6 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - levn@~0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" @@ -4801,16 +5058,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -4833,6 +5080,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lockfile@~1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" @@ -5417,6 +5672,14 @@ lru-cache@^4.0.1, lru-cache@~4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +lru-cache@^4.1.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + make-dir@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" @@ -5473,13 +5736,6 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5542,6 +5798,25 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -5574,11 +5849,6 @@ mime-types@~2.1.17: dependencies: mime-db "~1.33.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -5618,6 +5888,13 @@ minimatch@^2.0.1: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimatch@~0.2.11: version "0.2.14" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" @@ -5636,6 +5913,22 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -5675,6 +5968,18 @@ mocha@^3.0.0, mocha@^3.1.2: mkdirp "0.5.1" supports-color "3.1.2" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -5955,13 +6260,6 @@ npm-registry-client@~7.2.1: optionalDependencies: npmlog "~2.0.0 || ~3.1.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - npm-user-validate@~0.1.2, npm-user-validate@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" @@ -6285,7 +6583,7 @@ once@^1.3.0, once@~1.3.0, once@~1.3.3: dependencies: wrappy "1" -once@^1.3.3, once@~1.4.0: +once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -6358,15 +6656,6 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -6389,11 +6678,6 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" @@ -6401,6 +6685,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -6408,6 +6699,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -6418,11 +6716,25 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + parse-asn1@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" @@ -6514,11 +6826,6 @@ path-is-inside@^1.0.1, path-is-inside@~1.0.0, path-is-inside@~1.0.1: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -6540,13 +6847,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - pbkdf2@^3.0.3: version "3.0.14" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" @@ -6597,6 +6897,13 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + plur@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" @@ -6665,6 +6972,11 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + promise@^7.0.1, promise@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" @@ -6696,7 +7008,12 @@ prr@~0.0.0: resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" integrity sha1-GoS4WQgyVQFBGFPQCB7j+obikmo= -pseudomap@^1.0.1: +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= @@ -6817,6 +7134,31 @@ pug-walk@^1.0.0: pug-runtime "^2.0.2" pug-strip-comments "^1.0.1" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -7145,14 +7487,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -7162,15 +7496,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read@1, read@~1.0.1, read@~1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -7201,6 +7526,19 @@ read@1, read@~1.0.1, read@~1.0.7: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^2.0.0, readable-stream@^2.0.4: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" @@ -7722,16 +8060,6 @@ request@~2.74.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -7797,6 +8125,13 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@~2. dependencies: glob "^7.0.5" +rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -7829,6 +8164,13 @@ run-async@^0.1.0: dependencies: once "^1.3.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" @@ -7892,6 +8234,23 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" +schema-utils@^0.4.4: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + selenium-webdriver@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" @@ -7927,7 +8286,12 @@ sequencify@~0.0.7: resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= -set-blocking@^2.0.0, set-blocking@~2.0.0: +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== + +set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -7985,18 +8349,6 @@ sha@~2.0.1: graceful-fs "^4.1.2" readable-stream "^2.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shelljs@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" @@ -8155,6 +8507,14 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.3" +source-map-support@~0.5.6: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -8172,6 +8532,11 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -8179,11 +8544,6 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" @@ -8239,6 +8599,13 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -8260,6 +8627,14 @@ stream-consume@~0.1.0: resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" integrity sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8= +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + stream-http@^2.7.2: version "2.8.0" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" @@ -8271,6 +8646,11 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -8280,14 +8660,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string_decoder@^1.0.0, string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" @@ -8300,6 +8672,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -8319,13 +8698,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -8341,16 +8713,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -8415,13 +8777,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - symbol-observable@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" @@ -8437,10 +8792,10 @@ symbol-observable@^1.0.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.1.tgz#8549dd1d01fa9f893c18cc9ab0b106b4d9b168cb" integrity sha1-hUndHQH6n4k8GMyasLEGtNmxaMs= -tapable@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" - integrity sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI= +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tar-pack@~3.3.0: version "3.3.0" @@ -8473,6 +8828,29 @@ temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +terser-webpack-plugin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" + integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.8.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" + integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8580,7 +8958,7 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1: +to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== @@ -8629,6 +9007,11 @@ tryit@^1.0.1: resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics= +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8678,7 +9061,7 @@ uglify-js@^2.6: uglify-to-browserify "~1.0.0" yargs "~3.10.0" -uglify-js@^2.6.1, uglify-js@^2.8.29: +uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= @@ -8693,15 +9076,6 @@ uglify-to-browserify@~1.0.0: resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - uid-number@0.0.6, uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -8744,6 +9118,13 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-filename@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + unique-filename@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" @@ -8931,10 +9312,10 @@ warning@3.0.0, warning@^3.0.0: dependencies: loose-envify "^1.0.0" -watchpack@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" - integrity sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA== +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" @@ -8952,41 +9333,43 @@ webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= -webpack-sources@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.1.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" - integrity sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg== - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" +webpack@^4.27.1: + version "4.27.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.27.1.tgz#5f2e2db446d2266376fa15d7d2277a1a9c2e12bb" + integrity sha512-WArHiLvHrlfyRM8i7f+2SFbr/XbQ0bXqTkPF8JpHOzub5482Y3wx7rEO8stuLGOKOgZJcqcisLhD7LrM/+fVMw== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" + schema-utils "^0.4.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" whatwg-encoding@^1.0.1: version "1.0.1" @@ -9008,11 +9391,6 @@ whatwg-url@^4.1.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - which@1, which@^1.2.12, which@^1.2.9, which@~1.2.11, which@~1.2.4: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" @@ -9055,13 +9433,12 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + errno "~0.1.7" wrappy@1, wrappy@~1.0.1, wrappy@~1.0.2: version "1.0.2" @@ -9129,41 +9506,20 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" integrity sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ= -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yargs@~3.10.0: version "3.10.0" From 2094b4502d37e61591baff076cd6e65b28aabf03 Mon Sep 17 00:00:00 2001 From: Mihail Diordiev Date: Tue, 18 Dec 2018 20:25:37 +0200 Subject: [PATCH 43/67] Stack trace options (#612) * Implement tracing in the examples * External editor settings for trace stacks * Implement opening options page for Firefox * Implement "trace" feature * Support tracing non-redux actions * Add docs for trace actions calls * Update webpack and use terser instead of uglify * Fix tests --- README.md | 2 + docs/API/Arguments.md | 6 + docs/Features/Trace.md | 13 ++ docs/README.md | 2 + examples/counter/store/configureStore.js | 2 +- examples/counter/webpack.config.js | 2 +- examples/saga-counter/src/main.js | 3 +- examples/saga-counter/webpack.config.js | 2 +- examples/todomvc/store/configureStore.js | 2 +- examples/todomvc/webpack.config.js | 2 +- package.json | 4 +- src/app/api/index.js | 45 +++++- src/app/containers/App.js | 11 +- src/app/middlewares/api.js | 4 + src/app/stores/enhancerStore.js | 2 + src/browser/extension/chromeAPIMock.js | 8 +- src/browser/extension/options/EditorGroup.js | 59 ++++++++ src/browser/extension/options/Options.js | 4 +- src/browser/extension/options/syncOptions.js | 3 + test/app/inject/api.spec.js | 1 - test/app/setup.js | 1 + yarn.lock | 146 ++++++++++++++++++- 22 files changed, 296 insertions(+), 28 deletions(-) create mode 100644 docs/Features/Trace.md create mode 100644 src/browser/extension/options/EditorGroup.js diff --git a/README.md b/README.md index 1b509267..01f3470f 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,8 @@ See [integrations](docs/Integrations.md) and [the blog post](https://medium.com/ - [Methods (advanced API)](docs/API/Methods.md) - [Create Redux store for debugging](docs/API/CreateStore.md) - [FAQ](docs/FAQ.md) + - Features + - [Trace actions calls](/docs/Features/Trace.md) - [Troubleshooting](docs/Troubleshooting.md) - [Articles](docs/Articles.md) - [Videos](docs/Videos.md) diff --git a/docs/API/Arguments.md b/docs/API/Arguments.md index 641918b8..b92737a3 100644 --- a/docs/API/Arguments.md +++ b/docs/API/Arguments.md @@ -29,6 +29,12 @@ The `options` object is optional, and can include any of the following. ### `maxAge` *number* (>1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance. Default is `50`. +### `trace` +*boolean* or *function* - if set to `true`, will include stack trace for every dispatched action, so you can see it in trace tab jumping directly to that part of code ([more details](../Features/Trace.md)). You can use a function (with action object as argument) which should return `new Error().stack` string, getting the stack outside of reducers. Default to `false`. + +### `traceLimit` +*number* - maximum stack trace frames to be stored (in case `trace` option was provided as `true`). By default it's `10`. Note that, because extension's calls are excluded, the resulted frames could be 1 less. If `trace` option is a function, `traceLimit` will have no effect, as it's supposed to be handled there. + ### `serialize` *boolean* or *object* which contains: diff --git a/docs/Features/Trace.md b/docs/Features/Trace.md new file mode 100644 index 00000000..54d32e11 --- /dev/null +++ b/docs/Features/Trace.md @@ -0,0 +1,13 @@ +## Trace actions calls + +![trace-demo](https://user-images.githubusercontent.com/7957859/50161148-a1639300-02e3-11e9-80e7-18d3215a0bf8.gif) + +One of the features of Redux DevTools is to select an action in the history and see the callstack that triggered it. It aims to solve the problem of finding the source of events in the event list. + +By default it's disabled as, depending of the use case, generating and serializing stack traces for every action can impact the performance. To enable it, set `trace` option to `true` as in [examples](https://github.com/zalmoxisus/redux-devtools-extension/commit/64717bb9b3534ff616d9db56c2be680627c7b09d). See [the API](../API/Arguments.md#trace) for more details. + +For some edge cases where stack trace cannot be obtained with just `Error().stack`, you can pass a function as `trace` with your implementation. It's useful for cases where the stack is broken, like, for example, [when calling `setTimeout`](https://github.com/zalmoxisus/redux-devtools-instrument/blob/e7c05c98e7e9654cb7db92a2f56c6b5f3ff2452b/test/instrument.spec.js#L735-L737). It takes `action` object as argument and should return `stack` string. This way it can be also used to provide stack conditionally only for certain actions. + +There's also an optional `traceLimit` parameter, which is `10` by default, to prevent consuming too much memory and serializing large stacks. It prevents consuming too much memory and serializing large stacks, also allows you to get larger stacks than limited by the browser (it will overpass default limit of `10` imposed by Chrome in `Error.stackTraceLimit`). If `trace` option is a function, `traceLimit` will have no effect, that should be handled there like so: `trace: () => new Error().stack.split('\n').slice(0, limit+1).join('\n')` (`+1` is needed for Chrome where's an extra 1st frame for `Error\n`). + +Apart from opening resources in Chrome DevTools, as seen in the demo above, it can open the file (and jump to the line-column) right in your editor. Pretty useful for debugging, and also as an alternative when it's not possible to use openResource (for Firefox or when using the extension from window or for remote debugging). You can click Settings button and enable that, also adding the path to your project root directory to use. It works out of the box for VSCode, Atom, Webstorm/Phpstorm/IntelliJ, Sublime, Emacs, MacVim, Textmate on Mac and Windows. For Linux you can use [`atom-url-handler`](https://github.com/eclemens/atom-url-handler). diff --git a/docs/README.md b/docs/README.md index 04becbda..8a482f40 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,8 @@ * [Options (arguments)](/docs/API/Arguments.md) * [Methods (advanced API)](/docs/API/Methods.md) * [Create Redux store for debugging](/docs/API/CreateStore.md) +* Features + * [Trace actions calls](/docs/Features/Trace.md) * [Integrations](/docs/Integrations.md) * [FAQ](/docs/FAQ.md) * [Troubleshooting](/docs/Troubleshooting.md) diff --git a/examples/counter/store/configureStore.js b/examples/counter/store/configureStore.js index 98de9de3..3b16e01d 100644 --- a/examples/counter/store/configureStore.js +++ b/examples/counter/store/configureStore.js @@ -7,7 +7,7 @@ import * as actionCreators from '../actions/counter'; export let isMonitorAction; export default function configureStore(preloadedState) { - const composeEnhancers = composeWithDevTools({ actionCreators }); + const composeEnhancers = composeWithDevTools({ actionCreators, trace: true, traceLimit: 25 }); const store = createStore(reducer, preloadedState, composeEnhancers( applyMiddleware(invariant(), thunk) )); diff --git a/examples/counter/webpack.config.js b/examples/counter/webpack.config.js index 6fcc6a3d..9ffaaa17 100644 --- a/examples/counter/webpack.config.js +++ b/examples/counter/webpack.config.js @@ -2,7 +2,7 @@ var path = require('path'); var webpack = require('webpack'); module.exports = { - devtool: 'cheap-module-eval-source-map', + devtool: 'source-map', entry: [ 'webpack-hot-middleware/client', './index' diff --git a/examples/saga-counter/src/main.js b/examples/saga-counter/src/main.js index 50080355..0e7fa492 100644 --- a/examples/saga-counter/src/main.js +++ b/examples/saga-counter/src/main.js @@ -13,7 +13,8 @@ import rootSaga from './sagas' const sagaMiddleware = createSagaMiddleware(/* {sagaMonitor} */) -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && + window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 }) || compose; const store = createStore( reducer, composeEnhancers(applyMiddleware(sagaMiddleware)) diff --git a/examples/saga-counter/webpack.config.js b/examples/saga-counter/webpack.config.js index 2d30cf06..64462282 100644 --- a/examples/saga-counter/webpack.config.js +++ b/examples/saga-counter/webpack.config.js @@ -2,7 +2,7 @@ var path = require('path') var webpack = require('webpack') module.exports = { - devtool: 'cheap-module-eval-source-map', + devtool: 'source-map', entry: [ 'webpack-hot-middleware/client', path.join(__dirname, 'src', 'main') diff --git a/examples/todomvc/store/configureStore.js b/examples/todomvc/store/configureStore.js index bf33bb49..05f4f202 100644 --- a/examples/todomvc/store/configureStore.js +++ b/examples/todomvc/store/configureStore.js @@ -4,7 +4,7 @@ import * as actionCreators from '../actions'; export default function configureStore(preloadedState) { const enhancer = window.__REDUX_DEVTOOLS_EXTENSION__ && - window.__REDUX_DEVTOOLS_EXTENSION__({ actionCreators, serialize: true }); + window.__REDUX_DEVTOOLS_EXTENSION__({ actionCreators, serialize: true, trace: true }); if (!enhancer) { console.warn('Install Redux DevTools Extension to inspect the app state: ' + 'https://github.com/zalmoxisus/redux-devtools-extension#installation') diff --git a/examples/todomvc/webpack.config.js b/examples/todomvc/webpack.config.js index 41800a27..3d6852d6 100644 --- a/examples/todomvc/webpack.config.js +++ b/examples/todomvc/webpack.config.js @@ -2,7 +2,7 @@ var path = require('path'); var webpack = require('webpack'); module.exports = { - devtool: 'cheap-module-eval-source-map', + devtool: 'source-map', entry: [ 'webpack-hot-middleware/client', './index' diff --git a/package.json b/package.json index dba92466..6fe41c5c 100644 --- a/package.json +++ b/package.json @@ -81,8 +81,8 @@ "react-redux": "^4.4.5", "redux": "^3.5.2", "redux-devtools": "^3.4.1", - "redux-devtools-instrument": "^1.9.3", - "remotedev-app": "^0.10.12", + "redux-devtools-instrument": "^1.9.4", + "remotedev-app": "^0.10.13-beta", "remotedev-monitor-components": "^0.0.5", "remotedev-serialize": "^0.1.7", "remotedev-slider": "^1.1.1", diff --git a/src/app/api/index.js b/src/app/api/index.js index 8c96a110..62c81de3 100644 --- a/src/app/api/index.js +++ b/src/app/api/index.js @@ -72,11 +72,42 @@ function post(message) { window.postMessage(message, '*'); } -function amendActionType(action) { - if (typeof action === 'string') return { action: { type: action }, timestamp: Date.now() }; - if (!action.type) return { action: { type: 'update' }, timestamp: Date.now() }; - if (action.action) return action; - return { action, timestamp: Date.now() }; +function getStackTrace(config, toExcludeFromTrace) { + if (!config.trace) return undefined; + if (typeof config.trace === 'function') return config.trace(); + + let stack; + let extraFrames = 0; + let prevStackTraceLimit; + const traceLimit = config.traceLimit; + const error = Error(); + if (Error.captureStackTrace) { + if (Error.stackTraceLimit < traceLimit) { + prevStackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = traceLimit; + } + Error.captureStackTrace(error, toExcludeFromTrace); + } else { + extraFrames = 3; + } + stack = error.stack; + if (prevStackTraceLimit) Error.stackTraceLimit = prevStackTraceLimit; + if (extraFrames || typeof Error.stackTraceLimit !== 'number' || Error.stackTraceLimit > traceLimit) { + const frames = stack.split('\n'); + if (frames.length > traceLimit) { + stack = frames.slice(0, traceLimit + extraFrames + (frames[0] === 'Error' ? 1 : 0)).join('\n'); + } + } + return stack; +} + +function amendActionType(action, config, toExcludeFromTrace) { + let timestamp = Date.now(); + let stack = getStackTrace(config, toExcludeFromTrace); + if (typeof action === 'string') return { action: { type: action }, timestamp, stack }; + if (!action.type) return { action: { type: 'update' }, timestamp, stack }; + if (action.action) return stack ? { stack, ...action } : action; + return { action, timestamp, stack }; } export function toContentScript(message, serializeState, serializeAction) { @@ -103,7 +134,7 @@ export function sendMessage(action, state, config, instanceId, name) { if (typeof config !== 'object') { // Legacy: sending actions not from connected part config = {}; // eslint-disable-line no-param-reassign - if (action) amendedAction = amendActionType(action); + if (action) amendedAction = amendActionType(action, config, sendMessage); } const message = { type: action ? 'ACTION' : 'STATE', @@ -224,7 +255,7 @@ export function connect(preConfig) { } } else if (config.actionSanitizer) amendedAction = config.actionSanitizer(action); - amendedAction = amendActionType(amendedAction); + amendedAction = amendActionType(amendedAction, config, send); if (latency) { delayedActions.push(amendedAction); delayedStates.push(amendedState); diff --git a/src/app/containers/App.js b/src/app/containers/App.js index 43977798..9d7847a1 100644 --- a/src/app/containers/App.js +++ b/src/app/containers/App.js @@ -31,6 +31,13 @@ class App extends Component { openWindow = (position) => { chrome.runtime.sendMessage({ type: 'OPEN', position }); }; + openOptionsPage = () => { + if (navigator.userAgent.indexOf('Firefox') !== -1) { + chrome.runtime.sendMessage({ type: 'OPEN_OPTIONS' }); + } else { + chrome.runtime.openOptionsPage(); + } + }; render() { const { @@ -126,10 +133,10 @@ class App extends Component { onClick={() => { this.openWindow('remote'); }} >Remote } - {chrome.runtime.openOptionsPage && + {(chrome.runtime.openOptionsPage || navigator.userAgent.indexOf('Firefox') !== -1) && }
diff --git a/src/app/middlewares/api.js b/src/app/middlewares/api.js index 41457d61..0d4a172c 100644 --- a/src/app/middlewares/api.js +++ b/src/app/middlewares/api.js @@ -87,6 +87,10 @@ function messaging(request, sender, sendResponse) { } return; } + if (request.type === 'OPEN_OPTIONS') { + chrome.runtime.openOptionsPage(); + return; + } if (request.type === 'GET_OPTIONS') { window.syncOptions.get(options => { sendResponse({ options }); diff --git a/src/app/stores/enhancerStore.js b/src/app/stores/enhancerStore.js index dff3a4b4..e3881dce 100644 --- a/src/app/stores/enhancerStore.js +++ b/src/app/stores/enhancerStore.js @@ -13,6 +13,8 @@ export default function configureStore(next, monitorReducer, config) { monitorReducer, { maxAge: config.maxAge, + trace: config.trace, + traceLimit: config.traceLimit, shouldCatchErrors: config.shouldCatchErrors || window.shouldCatchErrors, shouldHotReload: config.shouldHotReload, shouldRecordChanges: config.shouldRecordChanges, diff --git a/src/browser/extension/chromeAPIMock.js b/src/browser/extension/chromeAPIMock.js index c43985b3..8d2b6563 100644 --- a/src/browser/extension/chromeAPIMock.js +++ b/src/browser/extension/chromeAPIMock.js @@ -3,11 +3,13 @@ window.isElectron = window.navigator && window.navigator.userAgent.indexOf('Electron') !== -1; +const isFirefox = navigator.userAgent.indexOf('Firefox') !== -1; + // Background page only if ( window.isElectron && location.pathname === '/_generated_background_page.html' || - navigator.userAgent.indexOf('Firefox') !== -1 + isFirefox ) { chrome.runtime.onConnectExternal = { addListener() {} @@ -84,3 +86,7 @@ if (window.isElectron) { return originSendMessage(...arguments); }; } + +if (isFirefox) { + chrome.storage.sync = chrome.storage.local; +} diff --git a/src/browser/extension/options/EditorGroup.js b/src/browser/extension/options/EditorGroup.js new file mode 100644 index 00000000..4cd06721 --- /dev/null +++ b/src/browser/extension/options/EditorGroup.js @@ -0,0 +1,59 @@ +import React from 'react'; + +export default ({ options, saveOption }) => { + const EditorState = { + BROWSER: 0, + EXTERNAL: 1 + }; + + return ( +
+ Editor for stack traces + +
+ saveOption('useEditor', EditorState.BROWSER)}/> + +
+ +
+ saveOption('useEditor', EditorState.EXTERNAL)}/> + + saveOption('editor', e.target.value.replace(/\W/g, ''))}/> +
+
+ +
+