This commit is contained in:
Nathan Bierema 2020-10-30 23:37:06 -05:00
parent 1c5cc0604f
commit 4448ac51ce
22 changed files with 86 additions and 57 deletions

View File

@ -1,4 +1,5 @@
{ {
"root": true,
"extends": "eslint-config-airbnb", "extends": "eslint-config-airbnb",
"globals": { "globals": {
"chrome": true, "chrome": true,

View File

@ -49,7 +49,7 @@ gulp.task('webpack:dev', (callback) => {
callback(); callback();
}); });
gulp.task('views:dev', () => { gulp.task('views:dev', (done) => {
gulp gulp
.src('./src/browser/views/*.pug') .src('./src/browser/views/*.pug')
.pipe( .pipe(
@ -58,14 +58,16 @@ gulp.task('views:dev', () => {
}) })
) )
.pipe(gulp.dest('./dev')); .pipe(gulp.dest('./dev'));
done();
}); });
gulp.task('copy:dev', () => { gulp.task('copy:dev', (done) => {
gulp gulp
.src('./src/browser/extension/manifest.json') .src('./src/browser/extension/manifest.json')
.pipe(rename('manifest.json')) .pipe(rename('manifest.json'))
.pipe(gulp.dest('./dev')); .pipe(gulp.dest('./dev'));
copy('./dev'); copy('./dev');
done();
}); });
/* /*
@ -121,18 +123,20 @@ gulp.task('copy:build:extension', (done) => {
* compress task * compress task
*/ */
gulp.task('compress:extension', () => { gulp.task('compress:extension', (done) => {
gulp gulp
.src('build/extension/**') .src('build/extension/**')
.pipe(zip('extension.zip')) .pipe(zip('extension.zip'))
.pipe(gulp.dest('./build')); .pipe(gulp.dest('./build'));
done();
}); });
gulp.task('compress:firefox', () => { gulp.task('compress:firefox', (done) => {
gulp gulp
.src('build/firefox/**') .src('build/firefox/**')
.pipe(zip('firefox.zip')) .pipe(zip('firefox.zip'))
.pipe(gulp.dest('./build')); .pipe(gulp.dest('./build'));
done();
}); });
/* /*
@ -187,7 +191,7 @@ gulp.task('copy:build:firefox', gulp.series('build:extension', (done) => {
'!./build/extension/js/redux-devtools-extension.js', '!./build/extension/js/redux-devtools-extension.js',
]) ])
.pipe(gulp.dest('./build/firefox')) .pipe(gulp.dest('./build/firefox'))
.on('finish', function () { .on('finish', function() {
gulp gulp
.src('./src/browser/firefox/manifest.json') .src('./src/browser/firefox/manifest.json')
.pipe(gulp.dest('./build/firefox')); .pipe(gulp.dest('./build/firefox'));

View File

@ -31,8 +31,9 @@ export function isFiltered(action, localFilter) {
if ( if (
noFiltersApplied(localFilter) || noFiltersApplied(localFilter) ||
(typeof action !== 'string' && typeof action.type.match !== 'function') (typeof action !== 'string' && typeof action.type.match !== 'function')
) ) {
return false; return false;
}
const { whitelist, blacklist } = localFilter || window.devToolsOptions || {}; const { whitelist, blacklist } = localFilter || window.devToolsOptions || {};
const actionType = action.type || action; const actionType = action.type || action;
@ -67,8 +68,9 @@ export function filterState(
nextActionId, nextActionId,
predicate predicate
) { ) {
if (type === 'ACTION') if (type === 'ACTION') {
return !stateSanitizer ? state : stateSanitizer(state, nextActionId - 1); return !stateSanitizer ? state : stateSanitizer(state, nextActionId - 1);
}
else if (type !== 'STATE') return state; else if (type !== 'STATE') return state;
if (predicate || !noFiltersApplied(localFilter)) { if (predicate || !noFiltersApplied(localFilter)) {
@ -151,8 +153,9 @@ export function startingFrom(
if ( if (
(predicate && !predicate(currState.state, currAction.action)) || (predicate && !predicate(currState.state, currAction.action)) ||
isFiltered(currAction.action, localFilter) isFiltered(currAction.action, localFilter)
) ) {
continue; continue;
}
filteredStagedActionIds.push(key); filteredStagedActionIds.push(key);
if (i < index) continue; if (i < index) continue;
} }

View File

@ -3,9 +3,10 @@ import jsan from 'jsan';
import seralizeImmutable from 'remotedev-serialize/immutable/serialize'; import seralizeImmutable from 'remotedev-serialize/immutable/serialize';
function deprecate(param) { function deprecate(param) {
// eslint-disable-next-line no-console
console.warn( console.warn(
`\`${param}\` parameter for Redux DevTools Extension is deprecated. Use \`serialize\` parameter instead: https://github.com/zalmoxisus/redux-devtools-extension/releases/tag/v2.12.1` `\`${param}\` parameter for Redux DevTools Extension is deprecated. Use \`serialize\` parameter instead: https://github.com/zalmoxisus/redux-devtools-extension/releases/tag/v2.12.1`
); // eslint-disable-line );
} }
export default function importState( export default function importState(
@ -34,8 +35,9 @@ export default function importState(
let preloadedState; let preloadedState;
let nextLiftedState = parse(state); let nextLiftedState = parse(state);
if (nextLiftedState.payload) { if (nextLiftedState.payload) {
if (nextLiftedState.preloadedState) if (nextLiftedState.preloadedState) {
preloadedState = parse(nextLiftedState.preloadedState); preloadedState = parse(nextLiftedState.preloadedState);
}
nextLiftedState = parse(nextLiftedState.payload); nextLiftedState = parse(nextLiftedState.payload);
} }
if (deserializeState) { if (deserializeState) {

View File

@ -21,8 +21,9 @@ function tryCatchStringify(obj) {
return JSON.stringify(obj); return JSON.stringify(obj);
} catch (err) { } catch (err) {
/* eslint-disable no-console */ /* eslint-disable no-console */
if (process.env.NODE_ENV !== 'production') if (process.env.NODE_ENV !== 'production') {
console.log('Failed to stringify', err); console.log('Failed to stringify', err);
}
/* eslint-enable no-console */ /* eslint-enable no-console */
return jsan.stringify(obj, windowReplacer, null, { return jsan.stringify(obj, windowReplacer, null, {
circular: '[CIRCULAR]', circular: '[CIRCULAR]',
@ -71,8 +72,9 @@ export function getSeralizeParameter(config, param) {
: immutableSerializer.options, : immutableSerializer.options,
}; };
} }
if (!serialize.replacer && !serialize.reviver) if (!serialize.replacer && !serialize.reviver) {
return { options: serialize.options }; return { options: serialize.options };
}
return { return {
replacer: serialize.replacer, replacer: serialize.replacer,
reviver: serialize.reviver, reviver: serialize.reviver,
@ -82,9 +84,10 @@ export function getSeralizeParameter(config, param) {
const value = config[param]; const value = config[param];
if (typeof value === 'undefined') return undefined; if (typeof value === 'undefined') return undefined;
// eslint-disable-next-line no-console
console.warn( console.warn(
`\`${param}\` parameter for Redux DevTools Extension is deprecated. Use \`serialize\` parameter instead: https://github.com/zalmoxisus/redux-devtools-extension/releases/tag/v2.12.1` `\`${param}\` parameter for Redux DevTools Extension is deprecated. Use \`serialize\` parameter instead: https://github.com/zalmoxisus/redux-devtools-extension/releases/tag/v2.12.1`
); // eslint-disable-line );
if (typeof serializeState === 'boolean') return { options: value }; if (typeof serializeState === 'boolean') return { options: value };
if (typeof serializeState === 'function') return { replacer: value }; if (typeof serializeState === 'function') return { replacer: value };
@ -133,8 +136,9 @@ function getStackTrace(config, toExcludeFromTrace) {
function amendActionType(action, config, toExcludeFromTrace) { function amendActionType(action, config, toExcludeFromTrace) {
let timestamp = Date.now(); let timestamp = Date.now();
let stack = getStackTrace(config, toExcludeFromTrace); let stack = getStackTrace(config, toExcludeFromTrace);
if (typeof action === 'string') if (typeof action === 'string') {
return { action: { type: action }, timestamp, stack }; return { action: { type: action }, timestamp, stack };
}
if (!action.type) return { action: { type: 'update' }, timestamp, stack }; if (!action.type) return { action: { type: 'update' }, timestamp, stack };
if (action.action) return stack ? { stack, ...action } : action; if (action.action) return stack ? { stack, ...action } : action;
return { action, timestamp, stack }; return { action, timestamp, stack };
@ -187,17 +191,19 @@ export function sendMessage(action, state, config, instanceId, name) {
} }
function handleMessages(event) { function handleMessages(event) {
if (process.env.BABEL_ENV !== 'test' && (!event || event.source !== window)) if (process.env.BABEL_ENV !== 'test' && (!event || event.source !== window)) {
return; return;
}
const message = event.data; const message = event.data;
if (!message || message.source !== '@devtools-extension') return; if (!message || message.source !== '@devtools-extension') return;
Object.keys(listeners).forEach((id) => { Object.keys(listeners).forEach((id) => {
if (message.id && id !== message.id) return; if (message.id && id !== message.id) return;
if (typeof listeners[id] === 'function') listeners[id](message); if (typeof listeners[id] === 'function') listeners[id](message);
else else {
listeners[id].forEach((fn) => { listeners[id].forEach((fn) => {
fn(message); fn(message);
}); });
}
}); });
} }
@ -229,9 +235,10 @@ export function connect(preConfig) {
const config = preConfig || {}; const config = preConfig || {};
const id = generateId(config.instanceId); const id = generateId(config.instanceId);
if (!config.instanceId) config.instanceId = id; if (!config.instanceId) config.instanceId = id;
if (!config.name) if (!config.name) {
config.name = config.name =
document.title && id === 1 ? document.title : `Instance ${id}`; document.title && id === 1 ? document.title : `Instance ${id}`;
}
if (config.serialize) config.serialize = getSeralizeParameter(config); if (config.serialize) config.serialize = getSeralizeParameter(config);
const actionCreators = config.actionCreators || {}; const actionCreators = config.actionCreators || {};
const latency = config.latency; const latency = config.latency;
@ -306,8 +313,9 @@ export function connect(preConfig) {
timestamp: Date.now(), timestamp: Date.now(),
}; };
} }
} else if (config.actionSanitizer) } else if (config.actionSanitizer) {
amendedAction = config.actionSanitizer(action); amendedAction = config.actionSanitizer(action);
}
amendedAction = amendActionType(amendedAction, config, send); amendedAction = amendActionType(amendedAction, config, send);
if (latency) { if (latency) {
delayedActions.push(amendedAction); delayedActions.push(amendedAction);
@ -364,7 +372,7 @@ export function connect(preConfig) {
} }
export function updateStore(stores) { export function updateStore(stores) {
return function (newStore, instanceId) { return function(newStore, instanceId) {
/* eslint-disable no-console */ /* eslint-disable no-console */
console.warn( console.warn(
'`__REDUX_DEVTOOLS_EXTENSION__.updateStore` is deprecated, remove it and just use ' + '`__REDUX_DEVTOOLS_EXTENSION__.updateStore` is deprecated, remove it and just use ' +

View File

@ -3,7 +3,7 @@ let lastTime = 0;
function createExpBackoffTimer(step) { function createExpBackoffTimer(step) {
let count = 1; let count = 1;
return function (reset) { return function(reset) {
// Reset call // Reset call
if (reset) { if (reset) {
count = 1; count = 1;
@ -34,8 +34,9 @@ function catchErrors(e) {
if ( if (
(window.devToolsOptions && !window.devToolsOptions.shouldCatchErrors) || (window.devToolsOptions && !window.devToolsOptions.shouldCatchErrors) ||
e.timeStamp - lastTime < nextErrorTimeout() e.timeStamp - lastTime < nextErrorTimeout()
) ) {
return; return;
}
lastTime = e.timeStamp; lastTime = e.timeStamp;
nextErrorTimeout(true); nextErrorTimeout(true);
postError(e.message); postError(e.message);

View File

@ -31,8 +31,9 @@ export default class Monitor {
isPaused = () => { isPaused = () => {
if (this.paused) { if (this.paused) {
if (this.lastAction !== 'BLOCKED') { if (this.lastAction !== 'BLOCKED') {
if (!window.__REDUX_DEVTOOLS_EXTENSION_LOCKED__) if (!window.__REDUX_DEVTOOLS_EXTENSION_LOCKED__) {
this.lastAction = 'BLOCKED'; this.lastAction = 'BLOCKED';
}
return false; return false;
} }
return true; return true;

View File

@ -28,7 +28,7 @@ export function getReport(reportId, tabId, instanceId) {
instanceId: `${tabId}/${instanceId}`, instanceId: `${tabId}/${instanceId}`,
}); });
}) })
.catch(function (err) { .catch(function(err) {
/* eslint-disable no-console */ /* eslint-disable no-console */
console.warn(err); console.warn(err);
/* eslint-enable no-console */ /* eslint-enable no-console */

View File

@ -9,8 +9,9 @@ export default function openDevToolsWindow(position) {
lastPosition = position; lastPosition = position;
} else { } else {
let params = { focused: true }; let params = { focused: true };
if (lastPosition !== position && position !== 'devtools-panel') if (lastPosition !== position && position !== 'devtools-panel') {
params = { ...params, ...customOptions }; params = { ...params, ...customOptions };
}
chrome.windows.update(windows[position], params, () => { chrome.windows.update(windows[position], params, () => {
lastPosition = null; lastPosition = null;
if (chrome.runtime.lastError) callback(); if (chrome.runtime.lastError) callback();

View File

@ -76,7 +76,7 @@ if (window.isElectron) {
} }
// Avoid error: chrome.runtime.sendMessage is not supported responseCallback // Avoid error: chrome.runtime.sendMessage is not supported responseCallback
const originSendMessage = chrome.runtime.sendMessage; const originSendMessage = chrome.runtime.sendMessage;
chrome.runtime.sendMessage = function () { chrome.runtime.sendMessage = function() {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
return originSendMessage(...arguments); return originSendMessage(...arguments);
} }

View File

@ -3,7 +3,7 @@ function createPanel(url) {
'Redux', 'Redux',
'img/logo/scalable.png', 'img/logo/scalable.png',
url, url,
function () {} function() {}
); );
} }

View File

@ -93,8 +93,9 @@ function tryCatch(fn, args) {
} }
handleDisconnect(); handleDisconnect();
/* eslint-disable no-console */ /* eslint-disable no-console */
if (process.env.NODE_ENV !== 'production') if (process.env.NODE_ENV !== 'production') {
console.error('Failed to send message', err); console.error('Failed to send message', err);
}
/* eslint-enable no-console */ /* eslint-enable no-console */
} }
} }
@ -112,8 +113,9 @@ function send(message) {
// Resend messages from the page to the background script // Resend messages from the page to the background script
function handleMessages(event) { function handleMessages(event) {
if (!isAllowed()) return; if (!isAllowed()) return;
if (!event || event.source !== window || typeof event.data !== 'object') if (!event || event.source !== window || typeof event.data !== 'object') {
return; return;
}
const message = event.data; const message = event.data;
if (message.source !== pageSource) return; if (message.source !== pageSource) return;
if (message.type === 'DISCONNECT') { if (message.type === 'DISCONNECT') {

View File

@ -8,7 +8,7 @@ require('./pageScript');
chrome.runtime.sendMessage( chrome.runtime.sendMessage(
window.devToolsExtensionID, window.devToolsExtensionID,
{ type: 'GET_OPTIONS' }, { type: 'GET_OPTIONS' },
function (response) { function(response) {
if (!response.options.inject) { if (!response.options.inject) {
const urls = response.options.urls.split('\n').filter(Boolean).join('|'); const urls = response.options.urls.split('\n').filter(Boolean).join('|');
if (!location.href.match(new RegExp(urls))) return; if (!location.href.match(new RegExp(urls))) return;

View File

@ -38,7 +38,7 @@ function deprecateParam(oldParam, newParam) {
/* eslint-enable no-console */ /* eslint-enable no-console */
} }
const __REDUX_DEVTOOLS_EXTENSION__ = function ( const __REDUX_DEVTOOLS_EXTENSION__ = function(
reducer, reducer,
preloadedState, preloadedState,
config config
@ -164,8 +164,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function (
isFiltered(action, localFilter) || isFiltered(action, localFilter) ||
(predicate && (predicate &&
!predicate(computedStates[computedStates.length - 1].state, action)) !predicate(computedStates[computedStates.length - 1].state, action))
) ) {
return; return;
}
const state = const state =
liftedState.computedStates[liftedState.computedStates.length - 1].state; liftedState.computedStates[liftedState.computedStates.length - 1].state;
relay( relay(
@ -233,8 +234,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function (
if ( if (
!features.jump && !features.jump &&
(type === 'JUMP_TO_STATE' || type === 'JUMP_TO_ACTION') (type === 'JUMP_TO_STATE' || type === 'JUMP_TO_ACTION')
) ) {
return; return;
}
if (!features.skip && type === 'TOGGLE_ACTION') return; if (!features.skip && type === 'TOGGLE_ACTION') return;
if (!features.reorder && type === 'REORDER_ACTION') return; if (!features.reorder && type === 'REORDER_ACTION') return;
if (!features.import && type === 'IMPORT_STATE') return; if (!features.import && type === 'IMPORT_STATE') return;
@ -297,8 +299,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function (
const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length const filteredActionIds = []; // simple circular buffer of non-excluded actions with fixed maxAge-1 length
const getMaxAge = (liftedAction, liftedState) => { const getMaxAge = (liftedAction, liftedState) => {
let m = (config && config.maxAge) || window.devToolsOptions.maxAge || 50; let m = (config && config.maxAge) || window.devToolsOptions.maxAge || 50;
if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) if (!liftedAction || noFiltersApplied(localFilter) || !liftedAction.action) {
return m; return m;
}
if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page if (!maxAge || maxAge < m) maxAge = m; // it can be modified in process on options page
if (isFiltered(liftedAction.action, localFilter)) { if (isFiltered(liftedAction.action, localFilter)) {
// TODO: check also predicate && !predicate(state, action) with current state // TODO: check also predicate && !predicate(state, action) with current state
@ -347,8 +350,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function (
relayAction(); relayAction();
return; return;
} }
if (monitor.isPaused() || monitor.isLocked() || monitor.isTimeTraveling()) if (monitor.isPaused() || monitor.isLocked() || monitor.isTimeTraveling()) {
return; return;
}
const liftedState = store.liftedStore.getState(); const liftedState = store.liftedStore.getState();
if ( if (
errorOccurred && errorOccurred &&
@ -361,8 +365,9 @@ const __REDUX_DEVTOOLS_EXTENSION__ = function (
const enhance = () => (next) => { const enhance = () => (next) => {
return (reducer_, initialState_, enhancer_) => { return (reducer_, initialState_, enhancer_) => {
if (!isAllowed(window.devToolsOptions)) if (!isAllowed(window.devToolsOptions)) {
return next(reducer_, initialState_, enhancer_); return next(reducer_, initialState_, enhancer_);
}
store = stores[instanceId] = configureStore(next, monitor.reducer, { store = stores[instanceId] = configureStore(next, monitor.reducer, {
...config, ...config,

View File

@ -8,7 +8,7 @@ if (process.env.NODE_ENV === 'production') {
s.parentNode.removeChild(s); s.parentNode.removeChild(s);
} else { } else {
s.src = chrome.extension.getURL('js/page.bundle.js'); s.src = chrome.extension.getURL('js/page.bundle.js');
s.onload = function () { s.onload = function() {
this.parentNode.removeChild(this); this.parentNode.removeChild(this);
}; };
(document.head || document.documentElement).appendChild(s); (document.head || document.documentElement).appendChild(s);

View File

@ -47,7 +47,7 @@ const get = (callback) => {
'^https?://localhost|0\\.0\\.0\\.0:\\d+\n^https?://.+\\.github\\.io', '^https?://localhost|0\\.0\\.0\\.0:\\d+\n^https?://.+\\.github\\.io',
showContextMenus: true, showContextMenus: true,
}, },
function (items) { function(items) {
options = migrateOldOptions(items); options = migrateOldOptions(items);
callback(options); callback(options);
} }

View File

@ -16,8 +16,9 @@ getPreloadedState(position, (state) => {
chrome.runtime.getBackgroundPage(({ store }) => { chrome.runtime.getBackgroundPage(({ store }) => {
const localStore = configureStore(store, position, preloadedState); const localStore = configureStore(store, position, preloadedState);
let name = 'monitor'; let name = 'monitor';
if (chrome && chrome.devtools && chrome.devtools.inspectedWindow) if (chrome && chrome.devtools && chrome.devtools.inspectedWindow) {
name += chrome.devtools.inspectedWindow.tabId; name += chrome.devtools.inspectedWindow.tabId;
}
const bg = chrome.runtime.connect({ name }); const bg = chrome.runtime.connect({ name });
const update = (action) => { const update = (action) => {
localStore.dispatch(action || { type: UPDATE_STATE }); localStore.dispatch(action || { type: UPDATE_STATE });

View File

@ -8,7 +8,7 @@ const path = resolve('build/extension');
const extensionId = 'lmhkpmbekcpmknklioeibfkpmmfibljd'; const extensionId = 'lmhkpmbekcpmknklioeibfkpmmfibljd';
const actionsPattern = /^@@INIT(.|\n)+@@reduxReactRouter\/routerDidChange(.|\n)+@@reduxReactRouter\/initRoutes(.|\n)+$/; const actionsPattern = /^@@INIT(.|\n)+@@reduxReactRouter\/routerDidChange(.|\n)+@@reduxReactRouter\/initRoutes(.|\n)+$/;
describe('Chrome extension', function () { describe('Chrome extension', function() {
this.timeout(20000); this.timeout(20000);
before(async () => { before(async () => {

View File

@ -7,7 +7,7 @@ import { switchMonitorTests, delay } from '../utils/e2e';
const port = 9515; const port = 9515;
const devPanelPath = 'chrome-extension://redux-devtools/devpanel.html'; const devPanelPath = 'chrome-extension://redux-devtools/devpanel.html';
describe('DevTools panel for Electron', function () { describe('DevTools panel for Electron', function() {
this.timeout(10000); this.timeout(10000);
before(async () => { before(async () => {
@ -36,7 +36,7 @@ describe('DevTools panel for Electron', function () {
await this.driver.manage().timeouts().pageLoadTimeout(5000); await this.driver.manage().timeouts().pageLoadTimeout(5000);
const id = await this.driver.executeAsyncScript(function (callback) { const id = await this.driver.executeAsyncScript(function(callback) {
let attempts = 5; let attempts = 5;
function showReduxPanel() { function showReduxPanel() {
if (attempts === 0) { if (attempts === 0) {

View File

@ -4,7 +4,7 @@ export const delay = (time) =>
new Promise((resolve) => setTimeout(resolve, time)); new Promise((resolve) => setTimeout(resolve, time));
export const switchMonitorTests = { export const switchMonitorTests = {
'should switch to Log Monitor': async function () { 'should switch to Log Monitor': async function() {
await this.driver await this.driver
.findElement(webdriver.By.xpath('//div[text()="Inspector"]')) .findElement(webdriver.By.xpath('//div[text()="Inspector"]'))
.click(); .click();
@ -19,7 +19,7 @@ export const switchMonitorTests = {
await delay(500); await delay(500);
}, },
'should switch to Chart Monitor': async function () { 'should switch to Chart Monitor': async function() {
await this.driver await this.driver
.findElement(webdriver.By.xpath('//div[text()="Log monitor"]')) .findElement(webdriver.By.xpath('//div[text()="Log monitor"]'))
.click(); .click();
@ -34,7 +34,7 @@ export const switchMonitorTests = {
await delay(500); // Wait till menu is closed await delay(500); // Wait till menu is closed
}, },
'should switch back to Inspector Monitor': async function () { 'should switch back to Inspector Monitor': async function() {
await this.driver await this.driver
.findElement(webdriver.By.xpath('//div[text()="Chart"]')) .findElement(webdriver.By.xpath('//div[text()="Chart"]'))
.click(); .click();