Compare commits

..

No commits in common. "main" and "remotedev-redux-devtools-extensions@3.2.1" have entirely different histories.

125 changed files with 14175 additions and 14452 deletions

View File

@ -8,11 +8,14 @@ on:
jobs: jobs:
build: build:
runs-on: 'ubuntu-22.04' runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: pnpm/action-setup@v4 with:
fetch-depth: 0
- uses: nrwl/nx-set-shas@v4
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'

View File

@ -10,7 +10,7 @@ permissions: write-all
jobs: jobs:
release: release:
name: Release name: Release
runs-on: 'ubuntu-22.04' runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repo - name: Checkout Repo
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -18,7 +18,7 @@ jobs:
# This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
fetch-depth: 0 fetch-depth: 0
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v2
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4

View File

@ -24,7 +24,7 @@ It can be used as a browser extension (for [Chrome](https://chrome.google.com/we
## Development ## Development
This is a monorepo powered by [pnpm](https://pnpm.io/). [Install pnpm](https://pnpm.io/installation) and run `pnpm install` to get started. Each package's dependencies need to be built before the package itself can be built. You can either build all the packages (i.e., `pnpm run build:all`) or use pnpm workspace commands to build only the packages necessary for the packages you're working on (i.e., `pnpm --filter "remotedev-redux-devtools-extension" build`). This is a monorepo powered by [pnpm](https://pnpm.io/) and [Nx](https://nx.dev/). [Install pnpm](https://pnpm.io/installation) and run `pnpm install` to get started. Each package's dependencies need to be built before the package itself can be built. You can either build all the packages (i.e., `pnpm run build:all`) or use Nx commands to build only the packages necessary for the packages you're working on (i.e., `pnpm nx build remotedev-redux-devtools-extension`).
## Backers ## Backers

View File

@ -1,43 +0,0 @@
import eslint from '@eslint/js';
import react from 'eslint-plugin-react';
import { fixupPluginRules } from '@eslint/compat';
import eslintPluginReactHooks from 'eslint-plugin-react-hooks';
import jest from 'eslint-plugin-jest';
import eslintConfigPrettier from 'eslint-config-prettier';
export default [
{
files: ['test/**/*.js', 'test/**/*.jsx'],
...eslint.configs.recommended,
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
...react.configs.flat.recommended,
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
settings: {
react: {
version: 'detect',
},
},
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
plugins: {
'react-hooks': fixupPluginRules(eslintPluginReactHooks),
},
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
...jest.configs['flat/recommended'],
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
...jest.configs['jest/style'],
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
...eslintConfigPrettier,
},
];

3
extension/.eslintignore Normal file
View File

@ -0,0 +1,3 @@
node_modules
dist
examples

31
extension/.eslintrc Normal file
View File

@ -0,0 +1,31 @@
{
"root": true,
"extends": "eslint-config-airbnb",
"globals": {
"chrome": true,
"__DEVELOPMENT__": true
},
"env": {
"browser": true,
"node": true
},
"rules": {
"react/jsx-uses-react": 2,
"react/jsx-uses-vars": 2,
"react/react-in-jsx-scope": 2,
"react/jsx-quotes": 0,
"block-scoped-var": 0,
"padded-blocks": 0,
"quotes": [1, "single"],
"comma-style": [2, "last"],
"no-use-before-define": [0, "nofunc"],
"func-names": 0,
"prefer-const": 0,
"comma-dangle": 0,
"id-length": 0,
"indent": [2, 2, { "SwitchCase": 1 }],
"new-cap": [2, { "capIsNewExceptions": ["Test"] }],
"default-case": 0
},
"plugins": ["react"]
}

View File

@ -1,64 +1,5 @@
# remotedev-redux-devtools-extension # remotedev-redux-devtools-extension
## 3.2.10
### Patch Changes
- @redux-devtools/app@6.2.2
## 3.2.9
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
- @redux-devtools/slider-monitor@5.1.1
- @redux-devtools/utils@3.1.1
- @redux-devtools/app@6.2.1
## 3.2.8
### Patch Changes
- Updated dependencies [6830118]
- react-json-tree@0.20.0
- @redux-devtools/app@6.2.0
- @redux-devtools/slider-monitor@6.0.0
- @redux-devtools/ui@1.4.0
- @redux-devtools/core@4.1.0
- @redux-devtools/utils@4.0.0
## 3.2.7
### Patch Changes
- b25bf13: Send state from background when monitor connects
## 3.2.6
### Patch Changes
- 50d7682: Fix DevTools from losing connection
## 3.2.5
### Patch Changes
- eb3ac09: Add logging to background service worker
## 3.2.4
### Patch Changes
- f1d6158: Fix mocking Chrome API for Electron
## 3.2.3
### Patch Changes
- fd9f950: Fix monitoring on opening panel
- e49708d: Fix manifest.json for Edge
## 3.2.1 ## 3.2.1
### Patch Changes ### Patch Changes

View File

@ -1,5 +1,5 @@
{ {
"version": "3.2.10", "version": "3.2.1",
"name": "Redux DevTools", "name": "Redux DevTools",
"description": "Redux DevTools for debugging application's state changes.", "description": "Redux DevTools for debugging application's state changes.",
"homepage_url": "https://github.com/reduxjs/redux-devtools", "homepage_url": "https://github.com/reduxjs/redux-devtools",

View File

@ -1,5 +1,5 @@
{ {
"version": "3.2.10", "version": "3.2.1",
"name": "Redux DevTools", "name": "Redux DevTools",
"description": "Redux DevTools for debugging application's state changes.", "description": "Redux DevTools for debugging application's state changes.",
"homepage_url": "https://github.com/reduxjs/redux-devtools", "homepage_url": "https://github.com/reduxjs/redux-devtools",
@ -28,7 +28,8 @@
"128": "img/logo/128x128.png" "128": "img/logo/128x128.png"
}, },
"options_ui": { "options_ui": {
"page": "options.html" "page": "options.html",
"chrome_style": true
}, },
"background": { "background": {
"service_worker": "background.bundle.js" "service_worker": "background.bundle.js"

View File

@ -1,38 +0,0 @@
import globals from 'globals';
import eslintJs from '../eslint.js.config.base.mjs';
import eslintTsReact from '../eslint.ts.react.config.base.mjs';
import eslintJsReactJest from '../eslint.js.react.jest.config.base.mjs';
export default [
...eslintJs,
...eslintTsReact(import.meta.dirname),
...eslintJsReactJest,
{
ignores: [
'chrome',
'dist',
'edge',
'examples',
'firefox',
'test/electron/fixture/dist',
],
},
{
files: ['build.mjs'],
languageOptions: {
globals: {
...globals.nodeBuiltin,
},
},
},
{
files: ['test/**/*.js', 'test/**/*.jsx'],
languageOptions: {
globals: {
...globals.browser,
...globals.node,
EUI: true,
},
},
},
];

View File

@ -1,5 +1,5 @@
{ {
"version": "3.2.10", "version": "3.2.1",
"name": "Redux DevTools", "name": "Redux DevTools",
"manifest_version": 3, "manifest_version": 3,
"description": "Redux Developer Tools for debugging application state changes.", "description": "Redux Developer Tools for debugging application state changes.",

View File

@ -3,7 +3,7 @@ module.exports = {
testPathIgnorePatterns: ['<rootDir>/examples'], testPathIgnorePatterns: ['<rootDir>/examples'],
testEnvironment: 'jsdom', testEnvironment: 'jsdom',
moduleNameMapper: { moduleNameMapper: {
'\\.css$': '<rootDir>/test/__mocks__/styleMock.js', '\\.css$': '<rootDir>/test/__mocks__/styleMock.ts',
}, },
transformIgnorePatterns: [ transformIgnorePatterns: [
'node_modules/(?!.pnpm|@babel/code-frame|@babel/highlight|@babel/helper-validator-identifier|chalk|d3|dateformat|delaunator|internmap|jsondiffpatch|lodash-es|nanoid|robust-predicates|uuid)', 'node_modules/(?!.pnpm|@babel/code-frame|@babel/highlight|@babel/helper-validator-identifier|chalk|d3|dateformat|delaunator|internmap|jsondiffpatch|lodash-es|nanoid|robust-predicates|uuid)',

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "remotedev-redux-devtools-extension", "name": "remotedev-redux-devtools-extension",
"version": "3.2.10", "version": "3.2.1",
"description": "Redux Developer Tools for debugging application state changes.", "description": "Redux Developer Tools for debugging application state changes.",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/extension", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/extension",
"license": "MIT", "license": "MIT",
@ -17,65 +17,69 @@
"clean": "rimraf dist && rimraf chrome/dist && rimraf edge/dist && rimraf firefox/dist", "clean": "rimraf dist && rimraf chrome/dist && rimraf edge/dist && rimraf firefox/dist",
"test:app": "cross-env BABEL_ENV=test jest test/app", "test:app": "cross-env BABEL_ENV=test jest test/app",
"test:chrome": "jest test/chrome", "test:chrome": "jest test/chrome",
"build:test:electron:fixture": "webpack --config test/electron/fixture/webpack.config.js",
"test:electron": "pnpm run build:test:electron:fixture && jest test/electron", "test:electron": "pnpm run build:test:electron:fixture && jest test/electron",
"test": "pnpm run test:app && pnpm run test:chrome && pnpm run test:electron", "test": "pnpm run test:app && pnpm run test:chrome && pnpm run test:electron",
"lint": "eslint .", "build:test:electron:fixture": "webpack --config test/electron/fixture/webpack.config.js",
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/app": "workspace:^", "@redux-devtools/app": "^6.1.0",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/instrument": "workspace:^", "@redux-devtools/instrument": "^2.1.0",
"@redux-devtools/serialize": "workspace:^", "@redux-devtools/serialize": "^0.4.1",
"@redux-devtools/slider-monitor": "workspace:^", "@redux-devtools/slider-monitor": "^5.0.1",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.2",
"@redux-devtools/utils": "workspace:^", "@redux-devtools/utils": "^3.0.0",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"jsan": "^3.1.14", "jsan": "^3.1.14",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-icons": "^5.5.0", "react-icons": "^5.3.0",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"react-json-tree": "workspace:^", "react-json-tree": "^0.19.0",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@babel/register": "^7.25.9", "@babel/register": "^7.24.6",
"@testing-library/dom": "^10.4.0", "@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.0.0",
"@types/chrome": "^0.0.308", "@types/chrome": "^0.0.270",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"chromedriver": "^126.0.5", "chromedriver": "^126.0.5",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"electron": "^31.7.7", "electron": "^31.4.0",
"esbuild": "^0.25.0", "esbuild": "^0.23.1",
"globals": "^15.15.0", "eslint": "^8.57.0",
"immutable": "^5.0.3", "eslint-config-airbnb": "^19.0.4",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.9.0",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"immutable": "^4.3.7",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"pug": "^3.0.3", "pug": "^3.0.3",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"selenium-webdriver": "^4.29.0", "selenium-webdriver": "^4.23.0",
"sinon-chrome": "^3.0.1", "sinon-chrome": "^3.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1" "webpack-cli": "^5.1.4"
} }
} }

View File

@ -29,21 +29,25 @@ interface OwnProps {
} }
type Props = StateProps & DispatchProps & OwnProps; type Props = StateProps & DispatchProps & OwnProps;
const isElectron = navigator.userAgent.includes('Electron'); declare global {
interface Window {
isElectron?: boolean;
}
}
async function sendMessage(message: SingleMessage) { function sendMessage(message: SingleMessage) {
await chrome.runtime.sendMessage(message); chrome.runtime.sendMessage(message);
} }
class Actions extends Component<Props> { class Actions extends Component<Props> {
openWindow = async (position: Position) => { openWindow = (position: Position) => {
await sendMessage({ type: 'OPEN', position }); sendMessage({ type: 'OPEN', position });
}; };
openOptionsPage = async () => { openOptionsPage = () => {
if (navigator.userAgent.includes('Firefox')) { if (navigator.userAgent.indexOf('Firefox') !== -1) {
await sendMessage({ type: 'OPEN_OPTIONS' }); sendMessage({ type: 'OPEN_OPTIONS' });
} else { } else {
await chrome.runtime.openOptionsPage(); chrome.runtime.openOptionsPage();
} }
}; };
@ -85,7 +89,7 @@ class Actions extends Component<Props> {
{features.import && <ImportButton />} {features.import && <ImportButton />}
{position && {position &&
(position !== '#popup' || (position !== '#popup' ||
navigator.userAgent.includes('Firefox')) && <PrintButton />} navigator.userAgent.indexOf('Firefox') !== -1) && <PrintButton />}
<Divider /> <Divider />
<MonitorSelector /> <MonitorSelector />
<Divider /> <Divider />
@ -94,19 +98,19 @@ class Actions extends Component<Props> {
<DispatcherButton dispatcherIsOpen={this.props.dispatcherIsOpen} /> <DispatcherButton dispatcherIsOpen={this.props.dispatcherIsOpen} />
)} )}
<Divider /> <Divider />
{!isElectron && ( {!window.isElectron && (
<Button <Button
onClick={async () => { onClick={() => {
await this.openWindow('window'); this.openWindow('window');
}} }}
> >
<MdOutlineWindow /> <MdOutlineWindow />
</Button> </Button>
)} )}
{!isElectron && ( {!window.isElectron && (
<Button <Button
onClick={async () => { onClick={() => {
await this.openWindow('remote'); this.openWindow('remote');
}} }}
> >
<GoBroadcast /> <GoBroadcast />

View File

@ -27,7 +27,6 @@ class App extends Component<Props> {
<a <a
href="https://github.com/zalmoxisus/redux-devtools-extension#usage" href="https://github.com/zalmoxisus/redux-devtools-extension#usage"
target="_blank" target="_blank"
rel="noreferrer"
> >
the instructions the instructions
</a> </a>

View File

@ -6,7 +6,7 @@ export function createMenu() {
{ id: 'devtools-remote', title: 'Open Remote DevTools' }, { id: 'devtools-remote', title: 'Open Remote DevTools' },
]; ];
const shortcuts: { [commandName: string]: string | undefined } = {}; let shortcuts: { [commandName: string]: string | undefined } = {};
chrome.commands.getAll((commands) => { chrome.commands.getAll((commands) => {
for (const { name, shortcut } of commands) { for (const { name, shortcut } of commands) {
shortcuts[name!] = shortcut; shortcuts[name!] = shortcut;
@ -22,8 +22,8 @@ export function createMenu() {
}); });
} }
export async function removeMenu() { export function removeMenu() {
await chrome.contextMenus.removeAll(); chrome.contextMenus.removeAll();
} }
chrome.contextMenus.onClicked.addListener(({ menuItemId }) => { chrome.contextMenus.onClicked.addListener(({ menuItemId }) => {

View File

@ -1,4 +1,3 @@
import '../chromeApiMock';
import configureStore from './store/backgroundStore'; import configureStore from './store/backgroundStore';
import openDevToolsWindow, { DevToolsPosition } from './openWindow'; import openDevToolsWindow, { DevToolsPosition } from './openWindow';
import { createMenu, removeMenu } from './contextMenus'; import { createMenu, removeMenu } from './contextMenus';
@ -15,7 +14,7 @@ chrome.commands.onCommand.addListener((shortcut) => {
// Disable the action by default and create the context menu when installed // Disable the action by default and create the context menu when installed
chrome.runtime.onInstalled.addListener(() => { chrome.runtime.onInstalled.addListener(() => {
void chrome.action.disable(); chrome.action.disable();
getOptions((option) => { getOptions((option) => {
if (option.showContextMenus) createMenu(); if (option.showContextMenus) createMenu();
@ -26,13 +25,6 @@ chrome.runtime.onInstalled.addListener(() => {
chrome.storage.onChanged.addListener((changes) => { chrome.storage.onChanged.addListener((changes) => {
if (changes.showContextMenus) { if (changes.showContextMenus) {
if (changes.showContextMenus.newValue) createMenu(); if (changes.showContextMenus.newValue) createMenu();
else void removeMenu(); else removeMenu();
} }
}); });
// https://developer.chrome.com/docs/extensions/develop/migrate/to-service-workers#keep_a_service_worker_alive_continuously
setInterval(
() =>
void chrome.storage.local.set({ 'last-heartbeat': new Date().getTime() }),
20000,
);

View File

@ -1,12 +1,12 @@
export type DevToolsPosition = 'devtools-window' | 'devtools-remote'; export type DevToolsPosition = 'devtools-window' | 'devtools-remote';
const windows: { [K in DevToolsPosition]?: number } = {}; let windows: { [K in DevToolsPosition]?: number } = {};
export default function openDevToolsWindow(position: DevToolsPosition) { export default function openDevToolsWindow(position: DevToolsPosition) {
if (!windows[position]) { if (!windows[position]) {
createWindow(position); createWindow(position);
} else { } else {
chrome.windows.update(windows[position], { focused: true }, () => { chrome.windows.update(windows[position]!, { focused: true }, () => {
if (chrome.runtime.lastError) createWindow(position); if (chrome.runtime.lastError) createWindow(position);
}); });
} }
@ -16,8 +16,8 @@ function createWindow(position: DevToolsPosition) {
const url = chrome.runtime.getURL(getPath(position)); const url = chrome.runtime.getURL(getPath(position));
chrome.windows.create({ type: 'popup', url }, (win) => { chrome.windows.create({ type: 'popup', url }, (win) => {
windows[position] = win!.id; windows[position] = win!.id;
if (navigator.userAgent.includes('Firefox')) { if (navigator.userAgent.indexOf('Firefox') !== -1) {
void chrome.windows.update(win!.id!, { focused: true }); chrome.windows.update(win!.id!, { focused: true });
} }
}); });
} }
@ -29,6 +29,6 @@ function getPath(position: DevToolsPosition) {
case 'devtools-remote': case 'devtools-remote':
return 'remote.html'; return 'remote.html';
default: default:
throw new Error('Unrecognized position'); throw new Error(`Unrecognized position: ${position}`);
} }
} }

View File

@ -161,6 +161,10 @@ export type UpdateStateRequest<S, A extends Action<string>> =
| SerializedActionMessage | SerializedActionMessage
| SerializedStateMessage<S, A>; | SerializedStateMessage<S, A>;
export interface EmptyUpdateStateAction {
readonly type: typeof UPDATE_STATE;
}
interface UpdateStateAction<S, A extends Action<string>> { interface UpdateStateAction<S, A extends Action<string>> {
readonly type: typeof UPDATE_STATE; readonly type: typeof UPDATE_STATE;
request: UpdateStateRequest<S, A>; request: UpdateStateRequest<S, A>;
@ -209,6 +213,11 @@ export type PanelMessage<S, A extends Action<string>> =
export type PanelMessageWithSplitAction<S, A extends Action<string>> = export type PanelMessageWithSplitAction<S, A extends Action<string>> =
| PanelMessage<S, A> | PanelMessage<S, A>
| SplitUpdateStateAction<S, A>; | SplitUpdateStateAction<S, A>;
export type MonitorMessage =
| NAAction
| ErrorMessage
| EmptyUpdateStateAction
| SetPersistAction;
type TabPort = Omit<chrome.runtime.Port, 'postMessage'> & { type TabPort = Omit<chrome.runtime.Port, 'postMessage'> & {
postMessage: (message: TabMessage) => void; postMessage: (message: TabMessage) => void;
@ -218,15 +227,20 @@ type PanelPort = Omit<chrome.runtime.Port, 'postMessage'> & {
message: PanelMessageWithSplitAction<S, A>, message: PanelMessageWithSplitAction<S, A>,
) => void; ) => void;
}; };
type MonitorPort = Omit<chrome.runtime.Port, 'postMessage'> & {
postMessage: (message: MonitorMessage) => void;
};
export const CONNECTED = 'socket/CONNECTED'; export const CONNECTED = 'socket/CONNECTED';
export const DISCONNECTED = 'socket/DISCONNECTED'; export const DISCONNECTED = 'socket/DISCONNECTED';
const connections: { const connections: {
readonly tab: { [K in number | string]: TabPort }; readonly tab: { [K in number | string]: TabPort };
readonly panel: { [K in number | string]: PanelPort }; readonly panel: { [K in number | string]: PanelPort };
readonly monitor: { [K in number | string]: MonitorPort };
} = { } = {
tab: {}, tab: {},
panel: {}, panel: {},
monitor: {},
}; };
const chunks: { const chunks: {
[instanceId: string]: PageScriptToContentScriptMessageForwardedToMonitors< [instanceId: string]: PageScriptToContentScriptMessageForwardedToMonitors<
@ -235,6 +249,7 @@ const chunks: {
>; >;
} = {}; } = {};
let monitors = 0; let monitors = 0;
let isMonitored = false;
const getId = (sender: chrome.runtime.MessageSender, name?: string) => const getId = (sender: chrome.runtime.MessageSender, name?: string) =>
sender.tab ? sender.tab.id! : name || sender.id!; sender.tab ? sender.tab.id! : name || sender.id!;
@ -249,9 +264,10 @@ type MonitorAction<S, A extends Action<string>> =
const maxChromeMsgSize = 32 * 1024 * 1024; const maxChromeMsgSize = 32 * 1024 * 1024;
function toMonitors<S, A extends Action<string>>(action: MonitorAction<S, A>) { function toMonitors<S, A extends Action<string>>(action: MonitorAction<S, A>) {
console.log(`Message to monitors: ${action.type}`); for (const port of [
...Object.values(connections.monitor),
for (const port of Object.values(connections.panel)) { ...Object.values(connections.panel),
]) {
try { try {
port.postMessage(action); port.postMessage(action);
} catch (err) { } catch (err) {
@ -317,15 +333,19 @@ interface ImportMessage {
type ToContentScriptMessage = ImportMessage | LiftedActionAction; type ToContentScriptMessage = ImportMessage | LiftedActionAction;
function toContentScript(messageBody: ToContentScriptMessage) { function toContentScript(messageBody: ToContentScriptMessage) {
console.log(`Message to tab ${messageBody.id}: ${messageBody.message}`);
if (messageBody.message === 'DISPATCH') { if (messageBody.message === 'DISPATCH') {
const { message, action, id, instanceId, state } = messageBody; const { message, action, id, instanceId, state } = messageBody;
connections.tab[id!].postMessage({ connections.tab[id!].postMessage({
type: message, type: message,
action, action,
state: nonReduxDispatch(store, message, instanceId, action, state), state: nonReduxDispatch(
id: instanceId.toString().replace(/^[^/]+\//, ''), store,
message,
instanceId,
action as AppDispatchAction,
state,
),
id: instanceId.toString().replace(/^[^\/]+\//, ''),
}); });
} else if (messageBody.message === 'IMPORT') { } else if (messageBody.message === 'IMPORT') {
const { message, action, id, instanceId, state } = messageBody; const { message, action, id, instanceId, state } = messageBody;
@ -339,7 +359,7 @@ function toContentScript(messageBody: ToContentScriptMessage) {
action as unknown as AppDispatchAction, action as unknown as AppDispatchAction,
state, state,
), ),
id: instanceId.toString().replace(/^[^/]+\//, ''), id: instanceId.toString().replace(/^[^\/]+\//, ''),
}); });
} else if (messageBody.message === 'ACTION') { } else if (messageBody.message === 'ACTION') {
const { message, action, id, instanceId, state } = messageBody; const { message, action, id, instanceId, state } = messageBody;
@ -353,7 +373,7 @@ function toContentScript(messageBody: ToContentScriptMessage) {
action as unknown as AppDispatchAction, action as unknown as AppDispatchAction,
state, state,
), ),
id: instanceId.toString().replace(/^[^/]+\//, ''), id: instanceId.toString().replace(/^[^\/]+\//, ''),
}); });
} else if (messageBody.message === 'EXPORT') { } else if (messageBody.message === 'EXPORT') {
const { message, action, id, instanceId, state } = messageBody; const { message, action, id, instanceId, state } = messageBody;
@ -367,11 +387,11 @@ function toContentScript(messageBody: ToContentScriptMessage) {
action as unknown as AppDispatchAction, action as unknown as AppDispatchAction,
state, state,
), ),
id: instanceId.toString().replace(/^[^/]+\//, ''), id: instanceId.toString().replace(/^[^\/]+\//, ''),
}); });
} else { } else {
const { message, action, id, instanceId, state } = messageBody; const { message, action, id, instanceId, state } = messageBody;
connections.tab[id].postMessage({ connections.tab[id!].postMessage({
type: message, type: message,
action, action,
state: nonReduxDispatch( state: nonReduxDispatch(
@ -381,19 +401,30 @@ function toContentScript(messageBody: ToContentScriptMessage) {
action as AppDispatchAction, action as AppDispatchAction,
state, state,
), ),
id: (instanceId as number).toString().replace(/^[^/]+\//, ''), id: (instanceId as number).toString().replace(/^[^\/]+\//, ''),
}); });
} }
} }
function toAllTabs(msg: TabMessage) { function toAllTabs(msg: TabMessage) {
console.log(`Message to all tabs: ${msg.type}`);
for (const tabPort of Object.values(connections.tab)) { for (const tabPort of Object.values(connections.tab)) {
tabPort.postMessage(msg); tabPort.postMessage(msg);
} }
} }
function monitorInstances(shouldMonitor: boolean, id?: string) {
if (!id && isMonitored === shouldMonitor) return;
const action = {
type: shouldMonitor ? ('START' as const) : ('STOP' as const),
};
if (id) {
if (connections.tab[id]) connections.tab[id].postMessage(action);
} else {
toAllTabs(action);
}
isMonitored = shouldMonitor;
}
function getReducerError() { function getReducerError() {
const instancesState = store.getState().instances; const instancesState = store.getState().instances;
const payload = instancesState.states[instancesState.current]; const payload = instancesState.states[instancesState.current];
@ -405,11 +436,11 @@ function getReducerError() {
function togglePersist() { function togglePersist() {
const state = store.getState(); const state = store.getState();
if (state.instances.persisted) { if (state.instances.persisted) {
for (const id of Object.keys(state.instances.connections)) { Object.keys(state.instances.connections).forEach((id) => {
if (connections.tab[id]) return; if (connections.tab[id]) return;
store.dispatch({ type: REMOVE_INSTANCE, id }); store.dispatch({ type: REMOVE_INSTANCE, id });
toMonitors({ type: 'NA', id }); toMonitors({ type: 'NA', id });
} });
} }
} }
@ -435,7 +466,6 @@ function messaging<S, A extends Action<string>>(
sender: chrome.runtime.MessageSender, sender: chrome.runtime.MessageSender,
) { ) {
let tabId = getId(sender); let tabId = getId(sender);
console.log(`Message from tab ${tabId}: ${request.type ?? request.split}`);
if (!tabId) return; if (!tabId) return;
if (sender.frameId) tabId = `${tabId}-${sender.frameId}`; if (sender.frameId) tabId = `${tabId}-${sender.frameId}`;
@ -446,7 +476,7 @@ function messaging<S, A extends Action<string>>(
return; return;
} }
if (request.type === 'OPEN_OPTIONS') { if (request.type === 'OPEN_OPTIONS') {
void chrome.runtime.openOptionsPage(); chrome.runtime.openOptionsPage();
return; return;
} }
if (request.type === 'OPTIONS') { if (request.type === 'OPTIONS') {
@ -513,13 +543,11 @@ function messaging<S, A extends Action<string>>(
} }
function disconnect( function disconnect(
type: 'tab' | 'panel', type: 'tab' | 'monitor' | 'panel',
id: number | string, id: number | string,
listener: (message: any, port: chrome.runtime.Port) => void, listener?: (message: any, port: chrome.runtime.Port) => void,
) { ) {
return function disconnectListener() { return function disconnectListener() {
console.log(`Disconnected from ${type} ${id}`);
const p = connections[type][id]; const p = connections[type][id];
if (listener && p) p.onMessage.removeListener(listener); if (listener && p) p.onMessage.removeListener(listener);
if (p) p.onDisconnect.removeListener(disconnectListener); if (p) p.onDisconnect.removeListener(disconnectListener);
@ -531,7 +559,7 @@ function disconnect(
} }
} else { } else {
monitors--; monitors--;
if (monitors === 0) toAllTabs({ type: 'STOP' }); if (!monitors) monitorInstances(false);
} }
}; };
} }
@ -544,17 +572,16 @@ function onConnect<S, A extends Action<string>>(port: chrome.runtime.Port) {
if (port.name === 'tab') { if (port.name === 'tab') {
id = getId(port.sender!); id = getId(port.sender!);
console.log(`Connected to tab ${id}`);
if (port.sender!.frameId) id = `${id}-${port.sender!.frameId}`; if (port.sender!.frameId) id = `${id}-${port.sender!.frameId}`;
connections.tab[id] = port; connections.tab[id] = port;
listener = (msg: ContentScriptToBackgroundMessage<S, A>) => { listener = (msg: ContentScriptToBackgroundMessage<S, A> | 'heartbeat') => {
console.log(`Message from tab ${id}: ${msg.name}`); if (msg === 'heartbeat') return;
if (msg.name === 'INIT_INSTANCE') { if (msg.name === 'INIT_INSTANCE') {
if (typeof id === 'number') { if (typeof id === 'number') {
void chrome.action.enable(id); chrome.action.enable(id);
void chrome.action.setIcon({ tabId: id, path: 'img/logo/38x38.png' }); chrome.action.setIcon({ tabId: id, path: 'img/logo/38x38.png' });
} }
if (monitors > 0) port.postMessage({ type: 'START' }); if (isMonitored) port.postMessage({ type: 'START' });
const state = store.getState(); const state = store.getState();
if (state.instances.persisted) { if (state.instances.persisted) {
@ -580,45 +607,28 @@ function onConnect<S, A extends Action<string>>(port: chrome.runtime.Port) {
port.onMessage.addListener(listener); port.onMessage.addListener(listener);
port.onDisconnect.addListener(disconnect('tab', id, listener)); port.onDisconnect.addListener(disconnect('tab', id, listener));
} else if (port.name && port.name.indexOf('monitor') === 0) { } else if (port.name && port.name.indexOf('monitor') === 0) {
// devpanel
id = getId(port.sender!, port.name); id = getId(port.sender!, port.name);
console.log(`Connected to monitor ${id}`); connections.monitor[id] = port;
connections.panel[id] = port; monitorInstances(true);
listener = (msg: BackgroundAction | 'heartbeat') => {
if (msg === 'heartbeat') return;
store.dispatch(msg);
};
port.onMessage.addListener(listener);
monitors++; monitors++;
toAllTabs({ type: 'START' }); port.onDisconnect.addListener(disconnect('monitor', id));
listener = (msg: BackgroundAction) => { } else {
console.log(`Message from monitor ${id}: ${msg.type}`); // devpanel
id = port.name || port.sender!.frameId!;
connections.panel[id] = port;
monitorInstances(true, port.name);
monitors++;
listener = (msg: BackgroundAction | 'heartbeat') => {
if (msg === 'heartbeat') return;
store.dispatch(msg); store.dispatch(msg);
}; };
port.onMessage.addListener(listener); port.onMessage.addListener(listener);
port.onDisconnect.addListener(disconnect('panel', id, listener)); port.onDisconnect.addListener(disconnect('panel', id, listener));
const { current } = store.getState().instances;
if (current !== 'default') {
const connectionId = Object.entries(
store.getState().instances.connections,
).find(([, instanceIds]) => instanceIds.includes(current))?.[0];
const options = store.getState().instances.options[current];
const state = store.getState().instances.states[current];
const { actionsById, computedStates, committedState, ...rest } = state;
toMonitors({
type: UPDATE_STATE,
request: {
type: 'STATE',
payload: rest as Omit<
LiftedState<S, A, unknown>,
'actionsById' | 'computedStates' | 'committedState'
>,
source: '@devtools-page',
instanceId:
typeof current === 'number' ? current.toString() : current,
actionsById: stringifyJSON(actionsById, options.serialize),
computedStates: stringifyJSON(computedStates, options.serialize),
committedState: typeof committedState !== 'undefined',
},
id: connectionId ?? current,
});
}
} }
} }
@ -632,7 +642,6 @@ chrome.notifications.onClicked.addListener((id) => {
openDevToolsWindow('devtools-window'); openDevToolsWindow('devtools-window');
}); });
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
const api: Middleware<{}, BackgroundState, Dispatch<BackgroundAction>> = const api: Middleware<{}, BackgroundState, Dispatch<BackgroundAction>> =
(store) => (next) => (untypedAction) => { (store) => (next) => (untypedAction) => {
const action = untypedAction as BackgroundAction; const action = untypedAction as BackgroundAction;

View File

@ -1,50 +1,34 @@
// Mock not supported chrome.* API for Firefox and Electron // Mock not supported chrome.* API for Firefox and Electron
const isElectron = navigator.userAgent.includes('Electron'); window.isElectron =
const isFirefox = navigator.userAgent.includes('Firefox'); window.navigator && window.navigator.userAgent.indexOf('Electron') !== -1;
const isFirefox = navigator.userAgent.indexOf('Firefox') !== -1;
// Background page only // Background page only
if ( if (
(isElectron && location.pathname === '/background.bundle.js') || (window.isElectron &&
location.pathname === '/_generated_background_page.html') ||
isFirefox isFirefox
) { ) {
(chrome.runtime as any).onConnectExternal = { (chrome.runtime as any).onConnectExternal = {
addListener() { addListener() {},
// do nothing.
},
}; };
(chrome.runtime as any).onMessageExternal = { (chrome.runtime as any).onMessageExternal = {
addListener() { addListener() {},
// do nothing.
},
}; };
if (isElectron) { if (window.isElectron) {
(chrome.notifications as any) = { (chrome.notifications as any) = {
onClicked: { onClicked: {
addListener() { addListener() {},
// do nothing.
},
},
create() {
// do nothing.
},
clear() {
// do nothing.
}, },
create() {},
clear() {},
}; };
(chrome.contextMenus as any) = { (chrome.contextMenus as any) = {
onClicked: { onClicked: {
addListener() { addListener() {},
// do nothing.
},
},
};
(chrome.commands as any) = {
onCommand: {
addListener() {
// do nothing.
},
}, },
}; };
} else { } else {
@ -55,39 +39,34 @@ if (
} }
} }
if (isElectron) { if (window.isElectron) {
if (!chrome.storage.local || !chrome.storage.local.remove) { if (!chrome.storage.local || !chrome.storage.local.remove) {
(chrome.storage as any).local = { (chrome.storage as any).local = {
set(items: { [key: string]: string }, callback: () => void) { set(obj: any, callback: any) {
for (const [key, value] of Object.entries(items)) { Object.keys(obj).forEach((key) => {
localStorage.setItem(key, value); localStorage.setItem(key, obj[key]);
} });
if (callback) { if (callback) {
callback(); callback();
} }
}, },
get( get(obj: any, callback: any) {
keys: { [key: string]: any }, const result: any = {};
callback: (items: { [key: string]: any }) => void, Object.keys(obj).forEach((key) => {
) { result[key] = localStorage.getItem(key) || obj[key];
const result = Object.fromEntries( });
Object.entries(keys).map(([key, value]) => [
key,
localStorage.getItem(key) ?? value,
]),
);
if (callback) { if (callback) {
callback(result); callback(result);
} }
}, },
// Electron ~ 1.4.6 // Electron ~ 1.4.6
remove(keys: string | string[], callback: () => void) { remove(items: any, callback: any) {
if (Array.isArray(keys)) { if (Array.isArray(items)) {
for (const key of keys) { items.forEach((name) => {
localStorage.removeItem(key); localStorage.removeItem(name);
} });
} else { } else {
localStorage.removeItem(keys); localStorage.removeItem(items);
} }
if (callback) { if (callback) {
callback(); callback();
@ -97,17 +76,17 @@ if (isElectron) {
} }
// Avoid error: chrome.runtime.sendMessage is not supported responseCallback // Avoid error: chrome.runtime.sendMessage is not supported responseCallback
const originSendMessage = (chrome.runtime as any).sendMessage; const originSendMessage = (chrome.runtime as any).sendMessage;
(chrome.runtime as any).sendMessage = function (...args: unknown[]) { chrome.runtime.sendMessage = function () {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
return originSendMessage(...args); return originSendMessage(...arguments);
} }
if (typeof args[arguments.length - 1] === 'function') { if (typeof arguments[arguments.length - 1] === 'function') {
Array.prototype.pop.call(args); Array.prototype.pop.call(arguments);
} }
return originSendMessage(...args); return originSendMessage(...arguments);
}; };
} }
if (isFirefox || isElectron) { if (isFirefox || window.isElectron) {
(chrome.storage as any).sync = chrome.storage.local; (chrome.storage as any).sync = chrome.storage.local;
} }

View File

@ -254,7 +254,7 @@ function tryCatch<S, A extends Action<string>>(
} }
newArgs[key as keyof typeof newArgs] = arg; newArgs[key as keyof typeof newArgs] = arg;
}); });
fn(newArgs as SplitMessage); fn(newArgs as any);
for (let i = 0; i < toSplit.length; i++) { for (let i = 0; i < toSplit.length; i++) {
for (let j = 0; j < toSplit[i][1].length; j += maxChromeMsgSize) { for (let j = 0; j < toSplit[i][1].length; j += maxChromeMsgSize) {
fn({ fn({
@ -343,3 +343,7 @@ function handleMessages<S, A extends Action<string>>(
prefetchOptions(); prefetchOptions();
window.addEventListener('message', handleMessages, false); window.addEventListener('message', handleMessages, false);
setInterval(() => {
bg?.postMessage('heartbeat');
}, 15000);

View File

@ -36,7 +36,7 @@ let persistor: Persistor | undefined;
let bgConnection: chrome.runtime.Port; let bgConnection: chrome.runtime.Port;
let naTimeout: NodeJS.Timeout; let naTimeout: NodeJS.Timeout;
const isChrome = !navigator.userAgent.includes('Firefox'); const isChrome = navigator.userAgent.indexOf('Firefox') === -1;
function renderNodeAtRoot(node: ReactNode) { function renderNodeAtRoot(node: ReactNode) {
if (currentRoot) currentRoot.unmount(); if (currentRoot) currentRoot.unmount();
@ -67,7 +67,6 @@ function renderNA() {
<a <a
href="https://github.com/zalmoxisus/redux-devtools-extension#usage" href="https://github.com/zalmoxisus/redux-devtools-extension#usage"
target="_blank" target="_blank"
rel="noreferrer"
> >
the instructions the instructions
</a> </a>
@ -88,7 +87,6 @@ function renderNA() {
<a <a
href="https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/Troubleshooting.md#access-file-url-file" href="https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/Troubleshooting.md#access-file-url-file"
target="_blank" target="_blank"
rel="noreferrer"
> >
See details See details
</a> </a>
@ -118,6 +116,10 @@ function init() {
} }
bgConnection = chrome.runtime.connect({ name }); bgConnection = chrome.runtime.connect({ name });
setInterval(() => {
bgConnection.postMessage('heartbeat');
}, 15000);
bgConnection.onMessage.addListener( bgConnection.onMessage.addListener(
<S, A extends Action<string>>( <S, A extends Action<string>>(
message: PanelMessageWithSplitAction<S, A>, message: PanelMessageWithSplitAction<S, A>,
@ -141,18 +143,12 @@ function init() {
} }
if (request.split === 'chunk') { if (request.split === 'chunk') {
if ( if ((splitMessage as Record<string, unknown>)[request.chunk[0]]) {
(splitMessage as unknown as Record<string, string>)[ (splitMessage as Record<string, unknown>)[request.chunk[0]] +=
request.chunk[0] request.chunk[1];
]
) {
(splitMessage as unknown as Record<string, string>)[
request.chunk[0]
] += request.chunk[1];
} else { } else {
(splitMessage as unknown as Record<string, string>)[ (splitMessage as Record<string, unknown>)[request.chunk[0]] =
request.chunk[0] request.chunk[1];
] = request.chunk[1];
} }
return; return;
} }

View File

@ -38,7 +38,6 @@ function getCurrentTabId(next: (tabId: number) => void) {
function panelDispatcher( function panelDispatcher(
bgConnection: chrome.runtime.Port, bgConnection: chrome.runtime.Port,
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
): Middleware<{}, StoreState, Dispatch<StoreAction>> { ): Middleware<{}, StoreState, Dispatch<StoreAction>> {
let autoselected = false; let autoselected = false;

View File

@ -2,7 +2,5 @@ chrome.devtools.panels.create(
'Redux', 'Redux',
'img/logo/scalable.png', 'img/logo/scalable.png',
'devpanel.html', 'devpanel.html',
() => { () => {},
// do nothing.
},
); );

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { OptionsProps } from './Options'; import { OptionsProps } from './Options';
export default function AllowToRunGroup({ options, saveOption }: OptionsProps) { export default ({ options, saveOption }: OptionsProps) => {
const AllowToRunState = { const AllowToRunState = {
EVERYWHERE: true, EVERYWHERE: true,
ON_SPECIFIC_URLS: false, ON_SPECIFIC_URLS: false,
@ -50,4 +50,4 @@ export default function AllowToRunGroup({ options, saveOption }: OptionsProps) {
</div> </div>
</fieldset> </fieldset>
); );
} };

View File

@ -1,10 +1,7 @@
import React from 'react'; import React from 'react';
import { OptionsProps } from './Options'; import { OptionsProps } from './Options';
export default function ContextMenuGroup({ export default ({ options, saveOption }: OptionsProps) => {
options,
saveOption,
}: OptionsProps) {
return ( return (
<fieldset className="option-group"> <fieldset className="option-group">
<legend className="option-group__title">Context Menu</legend> <legend className="option-group__title">Context Menu</legend>
@ -26,4 +23,4 @@ export default function ContextMenuGroup({
</div> </div>
</fieldset> </fieldset>
); );
} };

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { OptionsProps } from './Options'; import { OptionsProps } from './Options';
export default function EditorGroup({ options, saveOption }: OptionsProps) { export default ({ options, saveOption }: OptionsProps) => {
const EditorState = { const EditorState = {
BROWSER: 0, BROWSER: 0,
EXTERNAL: 1, EXTERNAL: 1,
@ -21,7 +21,7 @@ export default function EditorGroup({ options, saveOption }: OptionsProps) {
onChange={() => saveOption('useEditor', EditorState.BROWSER)} onChange={() => saveOption('useEditor', EditorState.BROWSER)}
/> />
<label className="option__label" htmlFor="editor-browser"> <label className="option__label" htmlFor="editor-browser">
{navigator.userAgent.includes('Firefox') {navigator.userAgent.indexOf('Firefox') !== -1
? "Don't open in external editor" ? "Don't open in external editor"
: "Use browser's debugger (from browser devpanel only)"} : "Use browser's debugger (from browser devpanel only)"}
</label> </label>
@ -80,4 +80,4 @@ export default function EditorGroup({ options, saveOption }: OptionsProps) {
</div> </div>
</fieldset> </fieldset>
); );
} };

View File

@ -2,7 +2,7 @@ import React from 'react';
import { FilterState } from '../pageScript/api/filters'; import { FilterState } from '../pageScript/api/filters';
import { OptionsProps } from './Options'; import { OptionsProps } from './Options';
export default function FilterGroup({ options, saveOption }: OptionsProps) { export default ({ options, saveOption }: OptionsProps) => {
return ( return (
<fieldset className="option-group"> <fieldset className="option-group">
<legend className="option-group__title"> <legend className="option-group__title">
@ -68,4 +68,4 @@ export default function FilterGroup({ options, saveOption }: OptionsProps) {
</div> </div>
</fieldset> </fieldset>
); );
} };

View File

@ -1,10 +1,7 @@
import React from 'react'; import React from 'react';
import { OptionsProps } from './Options'; import { OptionsProps } from './Options';
export default function MiscellaneousGroup({ export default ({ options, saveOption }: OptionsProps) => {
options,
saveOption,
}: OptionsProps) {
return ( return (
<fieldset className="option-group"> <fieldset className="option-group">
<legend className="option-group__title">Miscellaneous</legend> <legend className="option-group__title">Miscellaneous</legend>
@ -50,4 +47,4 @@ export default function MiscellaneousGroup({
</div> </div>
</fieldset> </fieldset>
); );
} };

View File

@ -14,8 +14,7 @@ export interface OptionsProps {
) => void; ) => void;
} }
export default function OptionsComponent(props: OptionsProps) { export default (props: OptionsProps) => (
return (
<div> <div>
<EditorGroup {...props} /> <EditorGroup {...props} />
<FilterGroup {...props} /> <FilterGroup {...props} />
@ -25,12 +24,11 @@ export default function OptionsComponent(props: OptionsProps) {
<div style={{ color: 'red' }}> <div style={{ color: 'red' }}>
<br /> <br />
<hr /> <hr />
Setting options here is discouraged, and will not be possible in the Setting options here is discouraged, and will not be possible in the next
next major release. Please{' '} major release. Please{' '}
<a <a
href="https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Arguments.md" href="https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Arguments.md"
target="_blank" target="_blank"
rel="noreferrer"
style={{ color: 'red' }} style={{ color: 'red' }}
> >
specify them as parameters specify them as parameters
@ -39,7 +37,6 @@ export default function OptionsComponent(props: OptionsProps) {
<a <a
href="https://github.com/zalmoxisus/redux-devtools-extension/issues/296" href="https://github.com/zalmoxisus/redux-devtools-extension/issues/296"
target="_blank" target="_blank"
rel="noreferrer"
style={{ color: 'red' }} style={{ color: 'red' }}
> >
the issue the issue
@ -48,4 +45,3 @@ export default function OptionsComponent(props: OptionsProps) {
</div> </div>
</div> </div>
); );
}

View File

@ -12,7 +12,7 @@ import {
subscribeToOptions((options) => { subscribeToOptions((options) => {
const message: OptionsMessage = { type: 'OPTIONS', options }; const message: OptionsMessage = { type: 'OPTIONS', options };
void chrome.runtime.sendMessage(message); chrome.runtime.sendMessage(message);
}); });
const renderOptions = (options: Options) => { const renderOptions = (options: Options) => {

View File

@ -46,9 +46,9 @@ export const saveOption = <K extends keyof Options>(
key: K, key: K,
value: Options[K], value: Options[K],
) => { ) => {
const obj: { [K1 in keyof Options]?: Options[K1] } = {}; let obj: { [K1 in keyof Options]?: Options[K1] } = {};
obj[key] = value; obj[key] = value;
void chrome.storage.sync.set(obj); chrome.storage.sync.set(obj);
options![key] = value; options![key] = value;
for (const subscriber of subscribers) { for (const subscriber of subscribers) {
subscriber(options!); subscriber(options!);
@ -99,10 +99,7 @@ export const getOptions = (callback: (options: Options) => void) => {
} }
}; };
export const prefetchOptions = () => export const prefetchOptions = () => getOptions(() => {});
getOptions(() => {
// do nothing.
});
export const subscribeToOptions = (callback: (options: Options) => void) => { export const subscribeToOptions = (callback: (options: Options) => void) => {
subscribers = subscribers.concat(callback); subscribers = subscribers.concat(callback);

View File

@ -26,7 +26,8 @@ export function isFiltered<A extends Action<string>>(
) { ) {
if ( if (
noFiltersApplied(localFilter) || noFiltersApplied(localFilter) ||
(typeof action !== 'string' && typeof action.type.match !== 'function') (typeof action !== 'string' &&
typeof (action.type as string).match !== 'function')
) { ) {
return false; return false;
} }

View File

@ -58,7 +58,7 @@ export default function importState<S, A extends Action<string>>(
| LiftedState<S, A, unknown> = parse(state) as | LiftedState<S, A, unknown> = parse(state) as
| ParsedSerializedLiftedState | ParsedSerializedLiftedState
| LiftedState<S, A, unknown>; | LiftedState<S, A, unknown>;
const preloadedState = let preloadedState =
'payload' in parsedSerializedLiftedState && 'payload' in parsedSerializedLiftedState &&
parsedSerializedLiftedState.preloadedState parsedSerializedLiftedState.preloadedState
? (parse(parsedSerializedLiftedState.preloadedState) as S) ? (parse(parsedSerializedLiftedState.preloadedState) as S)

View File

@ -222,7 +222,6 @@ function post<S, A extends Action<string>>(
function getStackTrace( function getStackTrace(
config: Config, config: Config,
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
toExcludeFromTrace: Function | undefined, toExcludeFromTrace: Function | undefined,
) { ) {
if (!config.trace) return undefined; if (!config.trace) return undefined;
@ -249,7 +248,6 @@ function getStackTrace(
typeof Error.stackTraceLimit !== 'number' || typeof Error.stackTraceLimit !== 'number' ||
Error.stackTraceLimit > traceLimit! Error.stackTraceLimit > traceLimit!
) { ) {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const frames = stack!.split('\n'); const frames = stack!.split('\n');
if (frames.length > traceLimit!) { if (frames.length > traceLimit!) {
stack = frames stack = frames
@ -267,11 +265,10 @@ function amendActionType<A extends Action<string>>(
| StructuralPerformAction<A>[] | StructuralPerformAction<A>[]
| string, | string,
config: Config, config: Config,
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
toExcludeFromTrace: Function | undefined, toExcludeFromTrace: Function | undefined,
): StructuralPerformAction<A> { ): StructuralPerformAction<A> {
const timestamp = Date.now(); let timestamp = Date.now();
const stack = getStackTrace(config, toExcludeFromTrace); let stack = getStackTrace(config, toExcludeFromTrace);
if (typeof action === 'string') { if (typeof action === 'string') {
return { action: { type: action } as A, timestamp, stack }; return { action: { type: action } as A, timestamp, stack };
} }
@ -598,11 +595,7 @@ export function connect(preConfig: Config): ConnectResponse {
}; };
const sendDelayed = throttle(() => { const sendDelayed = throttle(() => {
sendMessage( sendMessage(delayedActions, delayedStates as any, config);
delayedActions,
delayedStates as unknown as LiftedState<unknown, Action<string>, unknown>,
config,
);
delayedActions = []; delayedActions = [];
delayedStates = []; delayedStates = [];
}, latency); }, latency);

View File

@ -10,7 +10,7 @@ function createExpBackoffTimer(step: number) {
return 0; return 0;
} }
// Calculate next timeout // Calculate next timeout
const timeout = Math.pow(2, count - 1); let timeout = Math.pow(2, count - 1);
if (count < 5) count += 1; if (count < 5) count += 1;
return timeout * step; return timeout * step;
}; };

View File

@ -4,8 +4,8 @@ import { persistState } from '@redux-devtools/core';
import type { ConfigWithExpandedMaxAge } from './index'; import type { ConfigWithExpandedMaxAge } from './index';
export function getUrlParam(key: string) { export function getUrlParam(key: string) {
const matches = new RegExp(`[?&]${key}=([^&#]+)\\b`).exec( const matches = window.location.href.match(
window.location.href, new RegExp(`[?&]${key}=([^&#]+)\\b`),
); );
return matches && matches.length > 0 ? matches[1] : null; return matches && matches.length > 0 ? matches[1] : null;
} }

View File

@ -53,7 +53,7 @@ type EnhancedStoreWithInitialDispatch<
> = EnhancedStore<S, A, MonitorState> & { initialDispatch: Dispatch<A> }; > = EnhancedStore<S, A, MonitorState> & { initialDispatch: Dispatch<A> };
const source = '@devtools-page'; const source = '@devtools-page';
const stores: { let stores: {
[K in string | number]: EnhancedStoreWithInitialDispatch< [K in string | number]: EnhancedStoreWithInitialDispatch<
unknown, unknown,
Action<string>, Action<string>,
@ -167,7 +167,7 @@ function __REDUX_DEVTOOLS_EXTENSION__<S, A extends Action<string>>(
const localFilter = getLocalFilter(config); const localFilter = getLocalFilter(config);
const serializeState = getSerializeParameter(config); const serializeState = getSerializeParameter(config);
const serializeAction = getSerializeParameter(config); const serializeAction = getSerializeParameter(config);
const { stateSanitizer, actionSanitizer, predicate, latency = 500 } = config; let { stateSanitizer, actionSanitizer, predicate, latency = 500 } = config;
// Deprecate actionsWhitelist and actionsBlacklist // Deprecate actionsWhitelist and actionsBlacklist
if (config.actionsWhitelist) { if (config.actionsWhitelist) {
@ -447,7 +447,7 @@ function __REDUX_DEVTOOLS_EXTENSION__<S, A extends Action<string>>(
liftedAction?: LiftedAction<S, A, unknown>, liftedAction?: LiftedAction<S, A, unknown>,
liftedState?: LiftedState<S, A, unknown> | undefined, liftedState?: LiftedState<S, A, unknown> | undefined,
) => { ) => {
const m = (config && config.maxAge) || window.devToolsOptions.maxAge || 50; let m = (config && config.maxAge) || window.devToolsOptions.maxAge || 50;
if ( if (
!liftedAction || !liftedAction ||
noFiltersApplied(localFilter) || noFiltersApplied(localFilter) ||
@ -464,7 +464,10 @@ function __REDUX_DEVTOOLS_EXTENSION__<S, A extends Action<string>>(
if (filteredActionIds.length >= m) { if (filteredActionIds.length >= m) {
const stagedActionIds = liftedState!.stagedActionIds; const stagedActionIds = liftedState!.stagedActionIds;
let i = 1; let i = 1;
while (maxAge > m && !filteredActionIds.includes(stagedActionIds[i])) { while (
maxAge > m &&
filteredActionIds.indexOf(stagedActionIds[i]) === -1
) {
maxAge--; maxAge--;
i++; i++;
} }
@ -536,7 +539,7 @@ function __REDUX_DEVTOOLS_EXTENSION__<S, A extends Action<string>>(
...config, ...config,
maxAge: getMaxAge as any, maxAge: getMaxAge as any,
}) as any }) as any
)(reducer_, initialState_); )(reducer_, initialState_) as any;
if (isInIframe()) setTimeout(init, 3000); if (isInIframe()) setTimeout(init, 3000);
else init(); else init();
@ -588,18 +591,18 @@ export type InferComposedStoreExt<StoreEnhancers> = StoreEnhancers extends [
? HeadStoreEnhancer extends StoreEnhancer<infer StoreExt> ? HeadStoreEnhancer extends StoreEnhancer<infer StoreExt>
? StoreExt & InferComposedStoreExt<RestStoreEnhancers> ? StoreExt & InferComposedStoreExt<RestStoreEnhancers>
: never : never
: // eslint-disable-next-line @typescript-eslint/no-empty-object-type : {};
{};
const extensionCompose = const extensionCompose =
(config: Config) => (config: Config) =>
<StoreEnhancers extends readonly StoreEnhancer[]>( <StoreEnhancers extends readonly StoreEnhancer[]>(
...funcs: StoreEnhancers ...funcs: StoreEnhancers
): StoreEnhancer<InferComposedStoreExt<StoreEnhancers>> => { ): StoreEnhancer<InferComposedStoreExt<StoreEnhancers>> => {
// @ts-expect-error FIXME // @ts-ignore FIXME
return (...args) => { return (...args) => {
const instanceId = generateId(config.instanceId); const instanceId = generateId(config.instanceId);
return [preEnhancer(instanceId), ...funcs].reduceRight( return [preEnhancer(instanceId), ...funcs].reduceRight(
// @ts-ignore FIXME
(composed, f) => f(composed), (composed, f) => f(composed),
__REDUX_DEVTOOLS_EXTENSION__({ ...config, instanceId })(...args), __REDUX_DEVTOOLS_EXTENSION__({ ...config, instanceId })(...args),
); );

View File

@ -1 +0,0 @@
module.exports = {};

View File

@ -0,0 +1 @@
export default {};

View File

@ -71,7 +71,6 @@ describe('Chrome extension', function () {
}); });
Object.keys(switchMonitorTests).forEach((description) => Object.keys(switchMonitorTests).forEach((description) =>
// eslint-disable-next-line jest/expect-expect,jest/valid-title
it(description, () => switchMonitorTests[description](driver)), it(description, () => switchMonitorTests[description](driver)),
); );
}); });

View File

@ -6,7 +6,7 @@ import chromedriver from 'chromedriver';
import { switchMonitorTests, delay } from '../utils/e2e'; import { switchMonitorTests, delay } from '../utils/e2e';
const devPanelPath = const devPanelPath =
'chrome-extension://lmhkpmbekcpmknklioeibfkpmmfibljd/devpanel.html'; 'chrome-extension://lmhkpmbekcpmknklioeibfkpmmfibljd/window.html';
describe('DevTools panel for Electron', function () { describe('DevTools panel for Electron', function () {
let driver; let driver;
@ -76,8 +76,7 @@ describe('DevTools panel for Electron', function () {
expect(className).not.toMatch(/hidden/); // not hidden expect(className).not.toMatch(/hidden/); // not hidden
}); });
// eslint-disable-next-line jest/expect-expect it.skip('should have Redux DevTools UI on current tab', async () => {
it('should have Redux DevTools UI on current tab', async () => {
await driver await driver
.switchTo() .switchTo()
.frame( .frame(
@ -88,7 +87,7 @@ describe('DevTools panel for Electron', function () {
await delay(1000); await delay(1000);
}); });
it('should contain INIT action', async () => { it.skip('should contain INIT action', async () => {
const element = await driver.wait( const element = await driver.wait(
webdriver.until.elementLocated( webdriver.until.elementLocated(
webdriver.By.xpath('//div[@data-testid="actionListRows"]'), webdriver.By.xpath('//div[@data-testid="actionListRows"]'),
@ -100,7 +99,7 @@ describe('DevTools panel for Electron', function () {
expect(val).toMatch(/@@INIT/); expect(val).toMatch(/@@INIT/);
}); });
it("should contain Inspector monitor's component", async () => { it.skip("should contain Inspector monitor's component", async () => {
const val = await driver const val = await driver
.findElement(webdriver.By.xpath('//div[@data-testid="inspector"]')) .findElement(webdriver.By.xpath('//div[@data-testid="inspector"]'))
.getText(); .getText();
@ -108,11 +107,9 @@ describe('DevTools panel for Electron', function () {
}); });
Object.keys(switchMonitorTests).forEach((description) => Object.keys(switchMonitorTests).forEach((description) =>
// eslint-disable-next-line jest/expect-expect,jest/valid-title it.skip(description, () => switchMonitorTests[description](driver)),
it(description, () => switchMonitorTests[description](driver)),
); );
// eslint-disable-next-line jest/no-commented-out-tests
/* it('should be no logs in console of main window', async () => { /* it('should be no logs in console of main window', async () => {
const handles = await driver.getAllWindowHandles(); const handles = await driver.getAllWindowHandles();
await driver.switchTo().window(handles[1]); // Change to main window await driver.switchTo().window(handles[1]); // Change to main window

40
nx.json Normal file
View File

@ -0,0 +1,40 @@
{
"extends": "nx/presets/npm.json",
"npmScope": "undetermined",
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "test", "lint", "package", "prepare"]
}
}
},
"targetDependencies": {
"build": [
{
"target": "build",
"projects": "dependencies"
}
],
"prepare": [
{
"target": "prepare",
"projects": "dependencies"
}
],
"package": [
{
"target": "package",
"projects": "dependencies"
}
]
},
"affected": {
"defaultBase": "main"
},
"pluginsConfig": {
"@nrwl/js": {
"analyzeSourceFiles": false
}
}
}

View File

@ -1,28 +1,43 @@
{ {
"private": true, "private": true,
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@changesets/cli": "^2.28.1", "@changesets/cli": "^2.27.7",
"@eslint/compat": "^1.2.7", "@eslint/compat": "^1.1.1",
"@eslint/js": "^9.21.0", "@eslint/js": "^8.57.0",
"eslint": "^9.21.0", "@nrwl/nx-cloud": "^19.0.0",
"eslint-config-prettier": "^10.0.2", "eslint": "^8.57.0",
"eslint-plugin-jest": "^28.11.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-jest": "^28.8.0",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-hooks": "^4.6.2",
"jest": "^29.7.0", "jest": "^29.7.0",
"prettier": "3.5.3", "nx": "^19.6.2",
"typescript": "~5.8.2", "prettier": "3.3.3",
"typescript-eslint": "^8.26.0" "typescript": "~5.5.4",
"typescript-eslint": "^8.2.0"
}, },
"scripts": { "scripts": {
"format": "prettier --write .", "format": "prettier --write .",
"format:check": "prettier --check .", "format:check": "prettier --check .",
"build:all": "pnpm --recursive run build", "build:all": "nx run-many --target=build --all --parallel=1",
"lint:all": "pnpm --recursive run lint", "lint:all": "nx run-many --target=lint --all --parallel=1",
"test:all": "pnpm --recursive run test", "test:all": "nx run-many --target=test --all --parallel=1",
"clean:all": "pnpm --recursive run clean", "clean:all": "nx run-many --target=clean --all --parallel=1",
"release": "pnpm build:all && pnpm publish -r" "release": "pnpm build:all && changeset publish"
}, },
"packageManager": "pnpm@9.15.6" "workspaces": [
"extension",
"packages/*",
"packages/d3-state-visualizer/examples/tree",
"packages/react-dock/demo",
"packages/react-json-tree/examples",
"packages/redux-devtools/examples/counter",
"packages/redux-devtools/examples/todomvc",
"packages/redux-devtools-inspector-monitor/demo",
"packages/redux-devtools-inspector-monitor-test-tab/demo",
"packages/redux-devtools-rtk-query-monitor/demo",
"packages/redux-devtools-slider-monitor/examples/todomvc"
],
"packageManager": "pnpm@8.15.9"
} }

View File

@ -25,22 +25,22 @@
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"d3-state-visualizer": "workspace:^", "d3-state-visualizer": "^3.0.0",
"map2tree": "workspace:^" "map2tree": "^4.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
} }
} }

View File

@ -39,14 +39,14 @@
"dependencies": { "dependencies": {
"@types/d3": "^7.4.3", "@types/d3": "^7.4.3",
"d3": "^7.9.0", "d3": "^7.9.0",
"d3tooltip": "workspace:^", "d3tooltip": "^4.0.0",
"deepmerge": "^4.3.1", "deepmerge": "^4.3.1",
"map2tree": "workspace:^", "map2tree": "^4.0.0",
"ramda": "^0.30.1" "ramda": "^0.30.1"
}, },
"devDependencies": { "devDependencies": {
"@types/ramda": "^0.30.2", "@types/ramda": "^0.30.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
} }
} }

View File

@ -36,7 +36,7 @@
"@types/d3": "^7.4.3", "@types/d3": "^7.4.3",
"d3": "^7.9.0", "d3": "^7.9.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@types/d3": "^7.4.3", "@types/d3": "^7.4.3",

View File

@ -40,12 +40,12 @@
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"jest": "^29.7.0", "jest": "^29.7.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
} }
} }

View File

@ -36,19 +36,19 @@
"prepublish": "pnpm run lint && pnpm run test" "prepublish": "pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@types/lodash": "^4.17.16", "@types/lodash": "^4.17.7",
"color": "^4.2.3", "color": "^4.2.3",
"csstype": "^3.1.3", "csstype": "^3.1.3",
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {
"@types/color": "^4.2.0", "@types/color": "^3.0.6",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
} }
} }

View File

@ -1,11 +1,5 @@
# Change Log # Change Log
## 0.8.0
### Minor Changes
- 6830118: Add React 19 to peer deps
## 0.7.0 ## 0.7.0
### Minor Changes ### Minor Changes

View File

@ -1,12 +1,5 @@
# react-dock-demo # react-dock-demo
## 0.1.7
### Patch Changes
- Updated dependencies [6830118]
- react-dock@0.8.0
## 0.1.6 ## 0.1.6
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "react-dock-demo", "name": "react-dock-demo",
"version": "0.1.7", "version": "0.1.6",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open", "start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open",
@ -11,30 +11,30 @@
}, },
"dependencies": { "dependencies": {
"react": "^18.3.1", "react": "^18.3.1",
"react-bootstrap": "^2.10.9", "react-bootstrap": "^2.10.4",
"react-dock": "workspace:^", "react-dock": "^0.7.0",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-icons": "^5.5.0", "react-icons": "^5.3.0",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "react-dock", "name": "react-dock",
"version": "0.8.0", "version": "0.7.0",
"description": "Resizable dockable react component", "description": "Resizable dockable react component",
"keywords": [ "keywords": [
"react", "react",
@ -40,19 +40,19 @@
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-test-renderer": "^18.3.1", "@types/react-test-renderer": "^18.3.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-test-renderer": "^18.3.1", "react-test-renderer": "^18.3.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0",
"react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" "react": "^16.3.0 || ^17.0.0 || ^18.0.0"
} }
} }

View File

@ -1,11 +1,5 @@
# Change Log # Change Log
## 0.20.0
### Minor Changes
- 6830118: Add React 19 to peer deps
## 0.19.0 ## 0.19.0
### Minor Changes ### Minor Changes

View File

@ -1,12 +1,5 @@
# react-json-tree-example # react-json-tree-example
## 1.1.10
### Patch Changes
- Updated dependencies [6830118]
- react-json-tree@0.20.0
## 1.1.9 ## 1.1.9
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "react-json-tree-example", "name": "react-json-tree-example",
"version": "1.1.10", "version": "1.1.9",
"description": "React-Json-Tree example", "description": "React-Json-Tree example",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/react-json-tree/examples", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/react-json-tree/examples",
"bugs": { "bugs": {
@ -19,28 +19,28 @@
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"immutable": "^5.0.3", "immutable": "^4.3.7",
"react": "^18.3.1", "react": "^18.3.1",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-json-tree": "workspace:^" "react-json-tree": "^0.19.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "react-json-tree", "name": "react-json-tree",
"version": "0.20.0", "version": "0.19.0",
"description": "React JSON Viewer Component, Extracted from redux-devtools", "description": "React JSON Viewer Component, Extracted from redux-devtools",
"keywords": [ "keywords": [
"react", "react",
@ -40,22 +40,22 @@
"prepublish": "pnpm run lint && pnpm run test" "prepublish": "pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@types/lodash": "^4.17.16", "@types/lodash": "^4.17.7",
"react-base16-styling": "workspace:^" "react-base16-styling": "^0.10.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-test-renderer": "^18.3.1", "@types/react-test-renderer": "^18.3.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-test-renderer": "^18.3.1", "react-test-renderer": "^18.3.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
} }
} }

View File

@ -1,45 +1,5 @@
# @redux-devtools/app-core # @redux-devtools/app-core
## 1.1.2
### Patch Changes
- Updated dependencies [17b55ef]
- @redux-devtools/rtk-query-monitor@5.2.0
## 1.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
- @redux-devtools/chart-monitor@5.1.1
- @redux-devtools/inspector-monitor@6.1.1
- @redux-devtools/inspector-monitor-test-tab@4.1.1
- @redux-devtools/inspector-monitor-trace-tab@4.1.1
- @redux-devtools/log-monitor@5.1.1
- @redux-devtools/rtk-query-monitor@5.1.1
- @redux-devtools/slider-monitor@5.1.1
## 1.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/chart-monitor@6.0.0
- @redux-devtools/inspector-monitor-test-tab@5.0.0
- @redux-devtools/inspector-monitor-trace-tab@5.0.0
- @redux-devtools/inspector-monitor@7.0.0
- @redux-devtools/log-monitor@6.0.0
- @redux-devtools/rtk-query-monitor@6.0.0
- @redux-devtools/slider-monitor@6.0.0
- @redux-devtools/ui@1.4.0
- @redux-devtools/core@4.1.0
## 1.0.0 ## 1.0.0
### Major Changes ### Major Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/app-core", "name": "@redux-devtools/app-core",
"version": "1.1.2", "version": "1.0.0",
"description": "Redux DevTools app core", "description": "Redux DevTools app core",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-app-core", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-app-core",
"bugs": { "bugs": {
@ -35,66 +35,66 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@redux-devtools/chart-monitor": "workspace:^", "@redux-devtools/chart-monitor": "^5.0.1",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.0",
"@redux-devtools/inspector-monitor-test-tab": "workspace:^", "@redux-devtools/inspector-monitor-test-tab": "^4.0.0",
"@redux-devtools/inspector-monitor-trace-tab": "workspace:^", "@redux-devtools/inspector-monitor-trace-tab": "^4.0.0",
"@redux-devtools/log-monitor": "workspace:^", "@redux-devtools/log-monitor": "^5.0.0",
"@redux-devtools/rtk-query-monitor": "workspace:^", "@redux-devtools/rtk-query-monitor": "^5.0.0",
"@redux-devtools/slider-monitor": "workspace:^", "@redux-devtools/slider-monitor": "^5.0.0",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.1",
"d3-state-visualizer": "workspace:^", "d3-state-visualizer": "^3.0.0",
"javascript-stringify": "^2.1.0", "javascript-stringify": "^2.1.0",
"jsan": "^3.1.14", "jsan": "^3.1.14",
"jsondiffpatch": "^0.6.0", "jsondiffpatch": "^0.6.0",
"react-icons": "^5.5.0", "react-icons": "^5.3.0",
"react-is": "^18.3.1" "react-is": "^18.3.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"@rjsf/core": "^5.24.3", "@rjsf/core": "^5.20.0",
"@testing-library/dom": "^10.4.0", "@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.0.0",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"esbuild": "^0.25.0", "esbuild": "^0.23.1",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"styled-components": "^5.3.11", "styled-components": "^5.3.11",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@reduxjs/toolkit": "^1.0.0 || ^2.0.0", "@reduxjs/toolkit": "^1.0.0 || ^2.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-redux": "^8.0.0 || ^9.0.0", "react-redux": "^8.0.0 || ^9.0.0",
"redux": "^4.0.0 || ^5.0.0", "redux": "^4.0.0 || ^5.0.0",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",

View File

@ -1,29 +1,5 @@
# Change Log # Change Log
## 6.2.2
### Patch Changes
- @redux-devtools/app-core@1.1.2
## 6.2.1
### Patch Changes
- @redux-devtools/app-core@1.1.1
## 6.2.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/app-core@1.1.0
- @redux-devtools/ui@1.4.0
## 6.1.0 ## 6.1.0
### Minor Changes ### Minor Changes

View File

@ -11,7 +11,6 @@ Also it's a react component you can use to build amazing monitor applications li
- [remote-redux-devtools-on-debugger](https://github.com/jhen0409/remote-redux-devtools-on-debugger) - Used in React Native debugger as a dock monitor. - [remote-redux-devtools-on-debugger](https://github.com/jhen0409/remote-redux-devtools-on-debugger) - Used in React Native debugger as a dock monitor.
- [atom-redux-devtools](https://github.com/zalmoxisus/atom-redux-devtools) - Used in Atom editor. - [atom-redux-devtools](https://github.com/zalmoxisus/atom-redux-devtools) - Used in Atom editor.
- [vscode-redux-devtools](https://github.com/jkzing/vscode-redux-devtools) - Used in Visual Studio Code. - [vscode-redux-devtools](https://github.com/jkzing/vscode-redux-devtools) - Used in Visual Studio Code.
- [intellij-redux-devtools](https://github.com/takanuva15/intellij-redux-devtools) - Used in IntelliJ IDEA.
### Usage ### Usage

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/app", "name": "@redux-devtools/app",
"version": "6.2.2", "version": "6.1.0",
"description": "Redux DevTools app", "description": "Redux DevTools app",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-app", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-app",
"bugs": { "bugs": {
@ -39,61 +39,61 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@redux-devtools/app-core": "workspace:^", "@redux-devtools/app-core": "^1.0.0",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.2",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"jsan": "^3.1.14", "jsan": "^3.1.14",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"socketcluster-client": "^19.2.3" "socketcluster-client": "^19.2.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"@rjsf/core": "^5.24.3", "@rjsf/core": "^5.20.0",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/socketcluster-client": "^19.1.0", "@types/socketcluster-client": "^19.1.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"@types/webpack-env": "^1.18.8", "@types/webpack-env": "^1.18.5",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"esbuild": "^0.25.0", "esbuild": "^0.23.1",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"globals": "^15.15.0", "globals": "^15.9.0",
"html-loader": "^5.1.0", "html-loader": "^5.1.0",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"styled-components": "^5.3.11", "styled-components": "^5.3.11",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@reduxjs/toolkit": "^1.0.0 || ^2.0.0", "@reduxjs/toolkit": "^1.0.0 || ^2.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
} }
} }

View File

@ -1,23 +1,5 @@
# Change Log # Change Log
## 5.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
## 5.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/core@4.1.0
## 5.0.2 ## 5.0.2
### Patch Changes ### Patch Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/chart-monitor", "name": "@redux-devtools/chart-monitor",
"version": "5.1.1", "version": "5.0.2",
"description": "Chart monitor for Redux DevTools", "description": "Chart monitor for Redux DevTools",
"keywords": [ "keywords": [
"redux", "redux",
@ -39,30 +39,30 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"d3-state-visualizer": "workspace:^", "d3-state-visualizer": "^3.0.0",
"deepmerge": "^4.3.1", "deepmerge": "^4.3.1",
"react-base16-styling": "workspace:^" "react-base16-styling": "^0.10.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"react": "^18.3.1", "react": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"
} }
} }

View File

@ -1,24 +1,5 @@
# Change Log # Change Log
## 4.0.3
### Patch Changes
- @redux-devtools/app@6.2.2
## 4.0.2
### Patch Changes
- @redux-devtools/app@6.2.1
## 4.0.1
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/app@6.2.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/cli", "name": "@redux-devtools/cli",
"version": "4.0.3", "version": "4.0.0",
"description": "CLI for remote debugging with Redux DevTools.", "description": "CLI for remote debugging with Redux DevTools.",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-cli", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-cli",
"bugs": { "bugs": {
@ -41,19 +41,19 @@
"node": ">= 18.12.0" "node": ">= 18.12.0"
}, },
"dependencies": { "dependencies": {
"@apollo/server": "^4.11.3", "@apollo/server": "^4.11.0",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/app": "workspace:^", "@redux-devtools/app": "^6.0.0",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"body-parser": "^1.20.3", "body-parser": "^1.20.2",
"chalk": "^5.4.1", "chalk": "^5.3.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"cross-spawn": "^7.0.6", "cross-spawn": "^7.0.3",
"electron": "^31.7.7", "electron": "^31.4.0",
"express": "^4.21.2", "express": "^4.19.2",
"get-port": "^7.1.0", "get-port": "^7.1.0",
"graphql": "^16.10.0", "graphql": "^16.9.0",
"knex": "^3.1.0", "knex": "^3.1.0",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"minimist": "^1.2.8", "minimist": "^1.2.8",
@ -62,8 +62,8 @@
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"semver": "^7.7.1", "semver": "^7.6.3",
"socketcluster-server": "^19.1.1", "socketcluster-server": "^19.1.0",
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"styled-components": "^5.3.11", "styled-components": "^5.3.11",
"uuid": "^10.0.0" "uuid": "^10.0.0"
@ -73,24 +73,24 @@
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/cross-spawn": "^6.0.6", "@types/cross-spawn": "^6.0.6",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/minimist": "^1.2.5", "@types/minimist": "^1.2.5",
"@types/morgan": "^1.9.9", "@types/morgan": "^1.9.9",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@types/socketcluster-client": "^19.1.0", "@types/socketcluster-client": "^19.1.0",
"@types/socketcluster-server": "^19.0.1", "@types/socketcluster-server": "^19.0.1",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"globals": "^15.15.0", "globals": "^15.9.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"ncp": "^2.0.0", "ncp": "^2.0.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"socketcluster-client": "^19.2.3", "socketcluster-client": "^19.2.2",
"supertest": "^7.0.0", "supertest": "^7.0.0",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
} }
} }

View File

@ -1,24 +1,5 @@
# Change Log # Change Log
## 4.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
## 4.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- react-dock@0.8.0
- @redux-devtools/core@4.1.0
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/dock-monitor", "name": "@redux-devtools/dock-monitor",
"version": "4.1.1", "version": "4.0.1",
"description": "A resizable and movable dock for Redux DevTools monitors", "description": "A resizable and movable dock for Redux DevTools monitors",
"keywords": [ "keywords": [
"redux", "redux",
@ -41,30 +41,30 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"parse-key": "^0.2.1", "parse-key": "^0.2.1",
"react-dock": "workspace:^" "react-dock": "^0.7.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/parse-key": "^0.2.2", "@types/parse-key": "^0.2.2",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"react": "^18.3.1", "react": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"
} }
} }

View File

@ -29,18 +29,19 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9" "@babel/runtime": "^7.25.4",
"immutable": "^4.3.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"redux": "^3.1.0 || ^4.0.0 || ^5.0.0" "redux": "^3.1.0 || ^4.0.0 || ^5.0.0"

View File

@ -1,3 +1,4 @@
import type Immutable from 'immutable';
import { compose } from 'redux'; import { compose } from 'redux';
import type { Action, ActionCreator, StoreEnhancer } from 'redux'; import type { Action, ActionCreator, StoreEnhancer } from 'redux';
@ -73,11 +74,11 @@ export interface EnhancerOptions {
* Just pass the Immutable library. It will support all ImmutableJS structures. You can even export them into a file and get them back. * Just pass the Immutable library. It will support all ImmutableJS structures. You can even export them into a file and get them back.
* The only exception is `Record` class, for which you should pass this in addition the references to your classes in `refs`. * The only exception is `Record` class, for which you should pass this in addition the references to your classes in `refs`.
*/ */
immutable?: unknown; immutable?: typeof Immutable;
/** /**
* ImmutableJS `Record` classes used to make possible restore its instances back when importing, persisting... * ImmutableJS `Record` classes used to make possible restore its instances back when importing, persisting...
*/ */
refs?: (new (data: any) => unknown)[]; refs?: Immutable.Record.Factory<any>[];
}; };
/** /**
* function which takes `action` object and id number as arguments, and should return `action` object back. * function which takes `action` object and id number as arguments, and should return `action` object back.

View File

@ -1,23 +1,5 @@
# Change Log # Change Log
## 4.1.1
### Patch Changes
- @redux-devtools/inspector-monitor@6.1.1
## 4.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/inspector-monitor@7.0.0
- @redux-devtools/ui@1.4.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@ -1,26 +1,5 @@
# test-demo # test-demo
## 0.1.17
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
- @redux-devtools/dock-monitor@4.1.1
- @redux-devtools/inspector-monitor@6.1.1
- @redux-devtools/inspector-monitor-test-tab@4.1.1
## 0.1.16
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/dock-monitor@5.0.0
- @redux-devtools/inspector-monitor-test-tab@5.0.0
- @redux-devtools/inspector-monitor@7.0.0
- @redux-devtools/ui@1.4.0
- @redux-devtools/core@4.1.0
## 0.1.15 ## 0.1.15
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "test-demo", "name": "test-demo",
"version": "0.1.17", "version": "0.1.15",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open", "start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open",
@ -10,45 +10,45 @@
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/dock-monitor": "workspace:^", "@redux-devtools/dock-monitor": "^4.0.0",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.0",
"@redux-devtools/inspector-monitor-test-tab": "workspace:^", "@redux-devtools/inspector-monitor-test-tab": "^4.0.0",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.0",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"lodash.shuffle": "^4.2.0", "lodash.shuffle": "^4.2.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"react-router-dom": "^6.30.0", "react-router-dom": "^6.26.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/lodash.shuffle": "^4.2.9", "@types/lodash.shuffle": "^4.2.9",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/redux-logger": "^3.0.13", "@types/redux-logger": "^3.0.13",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"@types/webpack-env": "^1.18.8", "@types/webpack-env": "^1.18.5",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
} }
} }

View File

@ -1,11 +1,4 @@
import { import Immutable from 'immutable';
fromJS,
Map as ImmutableMap,
List,
Set as ImmutableSet,
Stack,
Seq,
} from 'immutable';
import shuffle from 'lodash.shuffle'; import shuffle from 'lodash.shuffle';
import { combineReducers, Reducer } from 'redux'; import { combineReducers, Reducer } from 'redux';
@ -25,14 +18,17 @@ const NESTED = {
}, },
}; };
const IMMUTABLE_NESTED = fromJS(NESTED) as ImmutableMap<unknown, unknown>; const IMMUTABLE_NESTED = Immutable.fromJS(NESTED) as Immutable.Map<
unknown,
unknown
>;
const IMMUTABLE_MAP = ImmutableMap({ const IMMUTABLE_MAP = Immutable.Map({
map: ImmutableMap({ a: 1, b: 2, c: 3 }), map: Immutable.Map({ a: 1, b: 2, c: 3 }),
list: List(['a', 'b', 'c']), list: Immutable.List(['a', 'b', 'c']),
set: ImmutableSet(['a', 'b', 'c']), set: Immutable.Set(['a', 'b', 'c']),
stack: Stack(['a', 'b', 'c']), stack: Immutable.Stack(['a', 'b', 'c']),
seq: Seq([1, 2, 3, 4, 5, 6, 7, 8]), seq: Immutable.Seq([1, 2, 3, 4, 5, 6, 7, 8]),
}); });
const HUGE_ARRAY = Array.from({ length: 5000 }).map((_, key) => ({ const HUGE_ARRAY = Array.from({ length: 5000 }).map((_, key) => ({

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/inspector-monitor-test-tab", "name": "@redux-devtools/inspector-monitor-test-tab",
"version": "4.1.1", "version": "4.0.0",
"description": "Generate tests for redux devtools.", "description": "Generate tests for redux devtools.",
"keywords": [ "keywords": [
"redux", "redux",
@ -43,49 +43,49 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.1",
"es6template": "^1.0.5", "es6template": "^1.0.5",
"javascript-stringify": "^2.1.0", "javascript-stringify": "^2.1.0",
"jsan": "^3.1.14", "jsan": "^3.1.14",
"object-path": "^0.11.8", "object-path": "^0.11.8",
"react-icons": "^5.5.0", "react-icons": "^5.3.0",
"simple-diff": "^1.7.2" "simple-diff": "^1.7.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.0",
"@testing-library/dom": "^10.4.0", "@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.0.0",
"@types/es6template": "^1.0.5", "@types/es6template": "^1.0.5",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"@types/object-path": "^0.11.4", "@types/object-path": "^0.11.4",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0", "redux": "^3.4.0 || ^4.0.0 || ^5.0.0",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
} }

View File

@ -1,22 +1,5 @@
# Change Log # Change Log
## 4.1.1
### Patch Changes
- @redux-devtools/inspector-monitor@6.1.1
## 4.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/inspector-monitor@7.0.0
## 4.0.1 ## 4.0.1
### Patch Changes ### Patch Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/inspector-monitor-trace-tab", "name": "@redux-devtools/inspector-monitor-trace-tab",
"version": "4.1.1", "version": "4.0.1",
"description": "Submonitor for Redux DevTools inspector to show stack traces.", "description": "Submonitor for Redux DevTools inspector to show stack traces.",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-inspector-monitor-trace-tab", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-inspector-monitor-trace-tab",
"license": "MIT", "license": "MIT",
@ -30,33 +30,33 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@babel/code-frame": "^8.0.0-alpha.16", "@babel/code-frame": "^8.0.0-alpha.12",
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@types/chrome": "^0.0.308", "@types/chrome": "^0.0.270",
"anser": "^2.3.2", "anser": "^2.1.1",
"html-entities": "^2.5.2", "html-entities": "^2.5.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"source-map": "^0.5.7" "source-map": "^0.5.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.1",
"@testing-library/dom": "^10.4.0", "@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.0.0",
"@types/babel__code-frame": "^7.0.6", "@types/babel__code-frame": "^7.0.6",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/path-browserify": "^1.0.3", "@types/path-browserify": "^1.0.3",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/source-map": "0.5.2", "@types/source-map": "0.5.2",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
@ -65,15 +65,15 @@
"react-test-renderer": "^18.3.1", "react-test-renderer": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"
} }
} }

View File

@ -1,24 +1,5 @@
# Change Log # Change Log
## 6.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
## 6.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- react-json-tree@0.20.0
- @redux-devtools/core@4.1.0
## 6.0.1 ## 6.0.1
### Patch Changes ### Patch Changes

View File

@ -1,23 +1,5 @@
# inspector-demo # inspector-demo
## 0.1.13
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
- @redux-devtools/dock-monitor@4.1.1
- @redux-devtools/inspector-monitor@6.1.1
## 0.1.12
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/dock-monitor@5.0.0
- @redux-devtools/inspector-monitor@7.0.0
- @redux-devtools/core@4.1.0
## 0.1.11 ## 0.1.11
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "inspector-demo", "name": "inspector-demo",
"version": "0.1.13", "version": "0.1.11",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open", "start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open",
@ -10,40 +10,40 @@
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/dock-monitor": "workspace:^", "@redux-devtools/dock-monitor": "^4.0.1",
"@redux-devtools/inspector-monitor": "workspace:^", "@redux-devtools/inspector-monitor": "^6.0.1",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"lodash.shuffle": "^4.2.0", "lodash.shuffle": "^4.2.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"react-bootstrap": "^2.10.9", "react-bootstrap": "^2.10.4",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"react-router-dom": "^6.30.0", "react-router-dom": "^6.26.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-logger": "^3.0.6" "redux-logger": "^3.0.6"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/lodash.shuffle": "^4.2.9", "@types/lodash.shuffle": "^4.2.9",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/redux-logger": "^3.0.13", "@types/redux-logger": "^3.0.13",
"@types/webpack-env": "^1.18.8", "@types/webpack-env": "^1.18.5",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
} }
} }

View File

@ -1,11 +1,4 @@
import { import Immutable from 'immutable';
fromJS,
Map as ImmutableMap,
List,
Set as ImmutableSet,
Stack,
Seq,
} from 'immutable';
import shuffle from 'lodash.shuffle'; import shuffle from 'lodash.shuffle';
import { combineReducers, Reducer } from 'redux'; import { combineReducers, Reducer } from 'redux';
@ -25,14 +18,17 @@ const NESTED = {
}, },
}; };
const IMMUTABLE_NESTED = fromJS(NESTED) as ImmutableMap<unknown, unknown>; const IMMUTABLE_NESTED = Immutable.fromJS(NESTED) as Immutable.Map<
unknown,
unknown
>;
const IMMUTABLE_MAP = ImmutableMap({ const IMMUTABLE_MAP = Immutable.Map({
map: ImmutableMap({ a: 1, b: 2, c: 3 }), map: Immutable.Map({ a: 1, b: 2, c: 3 }),
list: List(['a', 'b', 'c']), list: Immutable.List(['a', 'b', 'c']),
set: ImmutableSet(['a', 'b', 'c']), set: Immutable.Set(['a', 'b', 'c']),
stack: Stack(['a', 'b', 'c']), stack: Immutable.Stack(['a', 'b', 'c']),
seq: Seq([1, 2, 3, 4, 5, 6, 7, 8]), seq: Immutable.Seq([1, 2, 3, 4, 5, 6, 7, 8]),
}); });
type MapValue = type MapValue =

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/inspector-monitor", "name": "@redux-devtools/inspector-monitor",
"version": "6.1.1", "version": "6.0.1",
"description": "Redux DevTools Diff Monitor", "description": "Redux DevTools Diff Monitor",
"homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-inspector-monitor", "homepage": "https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools-inspector-monitor",
"bugs": { "bugs": {
@ -35,47 +35,47 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@dnd-kit/core": "^6.3.1", "@dnd-kit/core": "^6.1.0",
"@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/modifiers": "^7.0.0",
"@dnd-kit/sortable": "^8.0.0", "@dnd-kit/sortable": "^8.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
"@types/lodash": "^4.17.16", "@types/lodash": "^4.17.7",
"dateformat": "^5.0.3", "dateformat": "^5.0.3",
"hex-rgba": "^1.0.2", "hex-rgba": "^1.0.2",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"javascript-stringify": "^2.1.0", "javascript-stringify": "^2.1.0",
"jsondiffpatch": "^0.6.0", "jsondiffpatch": "^0.6.0",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"react-json-tree": "workspace:^" "react-json-tree": "^0.19.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/babel-preset-css-prop": "^11.12.0", "@emotion/babel-preset-css-prop": "^11.12.0",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/dateformat": "^5.0.3", "@types/dateformat": "^5.0.2",
"@types/hex-rgba": "^1.0.3", "@types/hex-rgba": "^1.0.3",
"@types/lodash.debounce": "^4.0.9", "@types/lodash.debounce": "^4.0.9",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"react": "^18.3.1", "react": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"
} }
} }

View File

@ -41,20 +41,20 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"jest": "^29.7.0", "jest": "^29.7.0",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"rxjs": "^7.8.2", "rxjs": "^7.8.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"

View File

@ -1,24 +1,5 @@
# Change Log # Change Log
## 5.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
## 5.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- react-json-tree@0.20.0
- @redux-devtools/core@4.1.0
## 5.0.1 ## 5.0.1
### Patch Changes ### Patch Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/log-monitor", "name": "@redux-devtools/log-monitor",
"version": "5.1.1", "version": "5.0.1",
"description": "The default tree view monitor for Redux DevTools", "description": "The default tree view monitor for Redux DevTools",
"keywords": [ "keywords": [
"redux", "redux",
@ -41,31 +41,31 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@types/lodash.debounce": "^4.0.9", "@types/lodash.debounce": "^4.0.9",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"react-json-tree": "workspace:^" "react-json-tree": "^0.19.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"react": "^18.3.1", "react": "^18.3.1",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0" "redux": "^3.4.0 || ^4.0.0 || ^5.0.0"
} }
} }

View File

@ -1,17 +1,5 @@
# Change Log # Change Log
## 0.9.5
### Patch Changes
- @redux-devtools/utils@3.1.1
## 0.9.4
### Patch Changes
- @redux-devtools/utils@4.0.0
## 0.9.3 ## 0.9.3
### Patch Changes ### Patch Changes

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/remote", "name": "@redux-devtools/remote",
"version": "0.9.5", "version": "0.9.3",
"description": "Relay Redux actions to remote Redux DevTools.", "description": "Relay Redux actions to remote Redux DevTools.",
"keywords": [ "keywords": [
"redux", "redux",
@ -41,31 +41,31 @@
"prepublish": "pnpm run type-check && pnpm run lint" "prepublish": "pnpm run type-check && pnpm run lint"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@redux-devtools/instrument": "workspace:^", "@redux-devtools/instrument": "^2.2.0",
"@redux-devtools/utils": "workspace:^", "@redux-devtools/utils": "^3.0.0",
"jsan": "^3.1.14", "jsan": "^3.1.14",
"rn-host-detect": "^1.2.0", "rn-host-detect": "^1.2.0",
"socketcluster-client": "^19.2.3" "socketcluster-client": "^19.2.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/rn-host-detect": "^1.2.2", "@types/rn-host-detect": "^1.2.2",
"@types/socketcluster-client": "^19.1.0", "@types/socketcluster-client": "^19.1.0",
"@typescript-eslint/eslint-plugin": "^8.26.0", "@typescript-eslint/eslint-plugin": "^8.2.0",
"@typescript-eslint/parser": "^8.26.0", "@typescript-eslint/parser": "^8.2.0",
"eslint": "^9.21.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^10.0.2", "eslint-config-prettier": "^9.1.0",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"redux": "^3.5.2 || ^4.0.0 || ^5.0.0" "redux": "^3.5.2 || ^4.0.0 || ^5.0.0"

View File

@ -1,31 +1,5 @@
# Change Log # Change Log
## 5.2.0
### Minor Changes
- 17b55ef: Handle api.provided state changes in RTKQ 2.6.2
## 5.1.1
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
## 5.1.0
### Minor Changes
- 6830118: Add React 19 to peer deps
### Patch Changes
- Updated dependencies [6830118]
- react-json-tree@0.20.0
- @redux-devtools/ui@1.4.0
- @redux-devtools/core@4.1.0
## 5.0.1 ## 5.0.1
### Patch Changes ### Patch Changes

View File

@ -91,7 +91,7 @@ Alternatively, you can use it together with [`DockMonitor`](https://github.com/r
#### Start Demo #### Start Demo
```bash ```bash
pnpm --filter "rtk-query-demo" start pnpm nx start rtk-query-demo
``` ```
<br/> <br/>

View File

@ -1,30 +1,5 @@
# rtk-query-demo # rtk-query-demo
## 0.1.15
### Patch Changes
- Updated dependencies [17b55ef]
- @redux-devtools/rtk-query-monitor@5.2.0
## 0.1.14
### Patch Changes
- Updated dependencies [91f21b2]
- @redux-devtools/core@4.1.1
- @redux-devtools/dock-monitor@4.1.1
- @redux-devtools/rtk-query-monitor@5.1.1
## 0.1.13
### Patch Changes
- Updated dependencies [6830118]
- @redux-devtools/dock-monitor@5.0.0
- @redux-devtools/rtk-query-monitor@6.0.0
- @redux-devtools/core@4.1.0
## 0.1.12 ## 0.1.12
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "rtk-query-demo", "name": "rtk-query-demo",
"version": "0.1.15", "version": "0.1.12",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open", "start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack serve --open",
@ -10,47 +10,47 @@
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@chakra-ui/react": "^2.10.6", "@chakra-ui/react": "^2.8.2",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@emotion/styled": "^11.14.0", "@emotion/styled": "^11.13.0",
"@mswjs/data": "^0.16.2", "@mswjs/data": "^0.16.1",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@redux-devtools/dock-monitor": "workspace:^", "@redux-devtools/dock-monitor": "^4.0.0",
"@redux-devtools/rtk-query-monitor": "workspace:^", "@redux-devtools/rtk-query-monitor": "^5.0.0",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"framer-motion": "^11.18.2", "framer-motion": "^11.3.30",
"msw": "^2.7.3", "msw": "^2.3.5",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-icons": "^5.5.0", "react-icons": "^5.3.0",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"react-router-dom": "^6.30.0", "react-router-dom": "^6.26.1",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/node": "^22.13.9", "@types/node": "^20.16.1",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"babel-loader": "^10.0.0", "babel-loader": "^9.1.3",
"copy-webpack-plugin": "^12.0.2", "copy-webpack-plugin": "^12.0.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"fork-ts-checker-webpack-plugin": "^9.0.2", "fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.3", "html-webpack-plugin": "^5.6.0",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "~5.8.2", "typescript": "~5.5.4",
"webpack": "^5.98.0", "webpack": "^5.94.0",
"webpack-cli": "^6.0.1", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.0" "webpack-dev-server": "^5.0.4"
}, },
"msw": { "msw": {
"workerDirectory": "public" "workerDirectory": "public"

View File

@ -8,8 +8,8 @@
* - Please do NOT serve this file on production. * - Please do NOT serve this file on production.
*/ */
const PACKAGE_VERSION = '2.7.3' const PACKAGE_VERSION = '2.3.5'
const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set() const activeClientIds = new Set()
@ -62,12 +62,7 @@ self.addEventListener('message', async function (event) {
sendToClient(client, { sendToClient(client, {
type: 'MOCKING_ENABLED', type: 'MOCKING_ENABLED',
payload: { payload: true,
client: {
id: client.id,
frameType: client.frameType,
},
},
}) })
break break
} }
@ -160,10 +155,6 @@ async function handleRequest(event, requestId) {
async function resolveMainClient(event) { async function resolveMainClient(event) {
const client = await self.clients.get(event.clientId) const client = await self.clients.get(event.clientId)
if (activeClientIds.has(event.clientId)) {
return client
}
if (client?.frameType === 'top-level') { if (client?.frameType === 'top-level') {
return client return client
} }
@ -192,26 +183,12 @@ async function getResponse(event, client, requestId) {
const requestClone = request.clone() const requestClone = request.clone()
function passthrough() { function passthrough() {
// Cast the request headers to a new Headers instance const headers = Object.fromEntries(requestClone.headers.entries())
// so the headers can be manipulated with.
const headers = new Headers(requestClone.headers)
// Remove the "accept" header value that marked this request as passthrough. // Remove internal MSW request header so the passthrough request
// This prevents request alteration and also keeps it compliant with the // complies with any potential CORS preflight checks on the server.
// user-defined CORS policies. // Some servers forbid unknown request headers.
const acceptHeader = headers.get('accept') delete headers['x-msw-intention']
if (acceptHeader) {
const values = acceptHeader.split(',').map((value) => value.trim())
const filteredValues = values.filter(
(value) => value !== 'msw/passthrough',
)
if (filteredValues.length > 0) {
headers.set('accept', filteredValues.join(', '))
} else {
headers.delete('accept')
}
}
return fetch(requestClone, { headers }) return fetch(requestClone, { headers })
} }

View File

@ -1,15 +1,15 @@
body { body {
margin: 0; margin: 0;
font-family: font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
code { code {
font-family: font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; monospace;
} }
section { section {

View File

@ -1,6 +1,6 @@
{ {
"name": "@redux-devtools/rtk-query-monitor", "name": "@redux-devtools/rtk-query-monitor",
"version": "5.2.0", "version": "5.0.1",
"description": "rtk-query monitor for Redux DevTools", "description": "rtk-query monitor for Redux DevTools",
"keywords": [ "keywords": [
"redux", "redux",
@ -44,51 +44,51 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"@redux-devtools/ui": "workspace:^", "@redux-devtools/ui": "^1.3.2",
"@types/lodash": "^4.17.16", "@types/lodash": "^4.17.7",
"hex-rgba": "^1.0.2", "hex-rgba": "^1.0.2",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"react-base16-styling": "workspace:^", "react-base16-styling": "^0.10.0",
"react-json-tree": "workspace:^" "react-json-tree": "^0.19.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@emotion/babel-preset-css-prop": "^11.12.0", "@emotion/babel-preset-css-prop": "^11.12.0",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@reduxjs/toolkit": "^2.6.0", "@reduxjs/toolkit": "^2.2.7",
"@testing-library/dom": "^10.4.0", "@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.0.0",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/hex-rgba": "^1.0.3", "@types/hex-rgba": "^1.0.3",
"@types/lodash.debounce": "^4.0.9", "@types/lodash.debounce": "^4.0.9",
"@types/react": "^18.3.18", "@types/react": "^18.3.4",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-redux": "^9.2.0", "react-redux": "^9.1.2",
"redux": "^5.0.1", "redux": "^5.0.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.13.3",
"@redux-devtools/core": "workspace:^", "@redux-devtools/core": "^4.0.0",
"@reduxjs/toolkit": "^1.0.0 || ^2.0.0", "@reduxjs/toolkit": "^1.0.0 || ^2.0.0",
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0",
"redux": "^3.4.0 || ^4.0.0 || ^5.0.0", "redux": "^3.4.0 || ^4.0.0 || ^5.0.0",
"styled-components": "^5.3.11" "styled-components": "^5.3.11"
} }

View File

@ -6,10 +6,9 @@ import {
RtkQueryApiState, RtkQueryApiState,
RtkQueryTag, RtkQueryTag,
SelectorsSource, SelectorsSource,
RtkQueryProvidedTagsState, RtkQueryProvided,
QueryPreviewTabs, QueryPreviewTabs,
RtkResourceInfo, RtkResourceInfo,
RtkQuery262ProvidedState,
} from './types'; } from './types';
import { Comparator, queryComparators } from './utils/comparators'; import { Comparator, queryComparators } from './utils/comparators';
import { FilterList, queryListFilters } from './utils/filters'; import { FilterList, queryListFilters } from './utils/filters';
@ -217,7 +216,7 @@ export function createInspectorSelectors<S>(): InspectorSelectors<S> {
const selectProvidedOfCurrentQuery: InspectorSelector< const selectProvidedOfCurrentQuery: InspectorSelector<
S, S,
null | RtkQueryProvidedTagsState | RtkQuery262ProvidedState null | RtkQueryProvided
> = (selectorsSource: SelectorsSource<S>) => { > = (selectorsSource: SelectorsSource<S>) => {
return selectApiOfCurrentQuery(selectorsSource)?.provided ?? null; return selectApiOfCurrentQuery(selectorsSource)?.provided ?? null;
}; };

View File

@ -1,9 +1,5 @@
import type { LiftedAction, LiftedState } from '@redux-devtools/core'; import type { LiftedAction, LiftedState } from '@redux-devtools/core';
import type { import type { createApi, QueryStatus } from '@reduxjs/toolkit/query';
createApi,
QueryCacheKey,
QueryStatus,
} from '@reduxjs/toolkit/query';
import type { Action, AnyAction, Dispatch } from '@reduxjs/toolkit'; import type { Action, AnyAction, Dispatch } from '@reduxjs/toolkit';
import type { ComponentType } from 'react'; import type { ComponentType } from 'react';
import { base16Themes } from 'react-base16-styling'; import { base16Themes } from 'react-base16-styling';
@ -56,37 +52,7 @@ export type RtkMutationState = NonNullable<
export type RtkQueryApiConfig = RtkQueryApiState['config']; export type RtkQueryApiConfig = RtkQueryApiState['config'];
export type FullTagDescription<TagType> = { export type RtkQueryProvided = RtkQueryApiState['provided'];
type: TagType;
id?: number | string;
};
// This is the actual tags structure, and was the entire `api.provided`
// field up through 2.6.1
export type RtkQueryProvidedTagsState = {
[x: string]: {
[id: string]: QueryCacheKey[];
[id: number]: QueryCacheKey[];
};
};
// As of 2.6.2, the `api.provided` field is split into `tags` and `keys` fields,
// with the old data nested in `tags`.
export type RtkQuery262ProvidedState = {
keys: Record<QueryCacheKey, FullTagDescription<any>[]>;
tags: RtkQueryProvidedTagsState;
};
export function isRtkQuery262Provided(
provided: Record<string, unknown>,
): provided is RtkQuery262ProvidedState {
return (
'tags' in provided &&
'keys' in provided &&
typeof provided.tags === 'object' &&
typeof provided.keys === 'object'
);
}
export interface ExternalProps<S, A extends Action<string>> { export interface ExternalProps<S, A extends Action<string>> {
dispatch: Dispatch<Action | LiftedAction<S, A, RtkQueryMonitorState>>; dispatch: Dispatch<Action | LiftedAction<S, A, RtkQueryMonitorState>>;

View File

@ -1,5 +1,5 @@
import { Action, AnyAction, isAllOf, isPlainObject } from '@reduxjs/toolkit'; import { Action, AnyAction, isAllOf, isPlainObject } from '@reduxjs/toolkit';
import { QueryCacheKey, QueryStatus } from '@reduxjs/toolkit/query'; import { QueryStatus } from '@reduxjs/toolkit/query';
import { import {
QueryInfo, QueryInfo,
RtkQueryMonitorState, RtkQueryMonitorState,
@ -11,8 +11,7 @@ import {
MutationInfo, MutationInfo,
ApiStats, ApiStats,
QueryTally, QueryTally,
RtkQueryProvidedTagsState, RtkQueryProvided,
RtkQuery262ProvidedState,
ApiTimings, ApiTimings,
QueryTimings, QueryTimings,
SelectorsSource, SelectorsSource,
@ -20,7 +19,6 @@ import {
RtkResourceInfo, RtkResourceInfo,
RtkRequest, RtkRequest,
RtkRequestTiming, RtkRequestTiming,
isRtkQuery262Provided,
} from '../types'; } from '../types';
import { missingTagId } from '../monitor-config'; import { missingTagId } from '../monitor-config';
import { Comparator, compareJSONPrimitive } from './comparators'; import { Comparator, compareJSONPrimitive } from './comparators';
@ -531,25 +529,13 @@ export function getProvidedOf(
export function getQueryTagsOf( export function getQueryTagsOf(
resInfo: RtkResourceInfo | null, resInfo: RtkResourceInfo | null,
provided: RtkQueryProvidedTagsState | RtkQuery262ProvidedState | null, provided: RtkQueryProvided | null,
): RtkQueryTag[] { ): RtkQueryTag[] {
if (!resInfo || resInfo.type === 'mutation' || !provided) { if (!resInfo || resInfo.type === 'mutation' || !provided) {
return emptyArray; return emptyArray;
} }
// Handle `api.provided` schema change with RTK Query tag handling. const tagTypes = Object.keys(provided);
// Originally, `api.provided` was a `Record<string, Record<string, string[]>>`,
// directly containing the tag names.
// With https://github.com/reduxjs/redux-toolkit/pull/4910 , that changes to
// change the top level to be `{tags, keys}`, with `tags` containing the tag names.
// Handle the newer structure by extracting the right field if it exists.
const actualProvided: RtkQueryProvidedTagsState = isRtkQuery262Provided(
provided,
)
? provided.tags
: provided;
const tagTypes = Object.keys(actualProvided);
if (tagTypes.length < 1) { if (tagTypes.length < 1) {
return emptyArray; return emptyArray;
@ -557,10 +543,10 @@ export function getQueryTagsOf(
const output: RtkQueryTag[] = []; const output: RtkQueryTag[] = [];
for (const [type, tagIds] of Object.entries(actualProvided)) { for (const [type, tagIds] of Object.entries(provided)) {
if (tagIds) { if (tagIds) {
for (const [id, queryKeys] of Object.entries(tagIds)) { for (const [id, queryKeys] of Object.entries(tagIds)) {
if (queryKeys.includes(resInfo.queryKey as QueryCacheKey)) { if ((queryKeys as unknown[]).includes(resInfo.queryKey)) {
const tag: RtkQueryTag = { type }; const tag: RtkQueryTag = { type };
if (id !== missingTagId) { if (id !== missingTagId) {

View File

@ -37,25 +37,25 @@
"prepublish": "pnpm run type-check && pnpm run lint && pnpm run test" "prepublish": "pnpm run type-check && pnpm run lint && pnpm run test"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.9", "@babel/runtime": "^7.25.4",
"jsan": "^3.1.14" "jsan": "^3.1.14"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.26.4", "@babel/cli": "^7.24.8",
"@babel/core": "^7.26.9", "@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.26.8", "@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.26.9", "@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.26.0", "@babel/preset-typescript": "^7.24.7",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.12",
"@types/jsan": "^3.1.5", "@types/jsan": "^3.1.5",
"immutable": "^5.0.3", "immutable": "^4.3.7",
"jest": "^29.7.0", "jest": "^29.7.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.5",
"typescript": "~5.8.2" "typescript": "~5.5.4"
}, },
"peerDependencies": { "peerDependencies": {
"immutable": "^5.0.3" "immutable": "^4.3.7"
} }
} }

View File

@ -1,5 +1,5 @@
import jsan from 'jsan'; import jsan from 'jsan';
import type Immutable from 'immutable'; import Immutable from 'immutable';
import serialize from './serialize'; import serialize from './serialize';
import options from '../constants/options'; import options from '../constants/options';

Some files were not shown because too many files have changed in this diff Show More