Refactor extension builds (#1265)

* Update for Edge build

* Refactor builds

* Update permissions

* Update tests
This commit is contained in:
Nathan Bierema 2022-11-06 19:26:12 -05:00 committed by GitHub
parent 27f13c02e6
commit adff9dd9f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 381 additions and 227 deletions

View File

@ -38,3 +38,21 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Archive Chrome Extension
uses: actions/upload-artifact@v3
with:
name: Chrome extension
path: extension/chrome/dist/chrome.zip
- name: Archive Edge Extension
uses: actions/upload-artifact@v3
with:
name: Edge extension
path: extension/edge/dist/edge.zip
- name: Archive Firefox Extension
uses: actions/upload-artifact@v3
with:
name: Edge extension
path: extension/firefox/dist/firefox.zip

View File

@ -1,7 +1,3 @@
node_modules
build
dev
webpack/replace
examples
npm-package
_book
node_modules
dist
examples

View File

@ -1,9 +1,2 @@
node_modules
npm-debug.log
.DS_Store
.idea/
dist/
build/
dev/
tmp/
_book
dist

View File

@ -1,7 +1,6 @@
{
"version": "3.0.11",
"name": "Redux DevTools",
"short_name": "Redux DevTools",
"description": "Redux DevTools for debugging application's state changes.",
"homepage_url": "https://github.com/reduxjs/redux-devtools",
"manifest_version": 2,

View File

@ -0,0 +1,67 @@
{
"version": "3.0.11",
"name": "Redux DevTools",
"description": "Redux DevTools for debugging application's state changes.",
"homepage_url": "https://github.com/reduxjs/redux-devtools",
"manifest_version": 2,
"page_action": {
"default_icon": "img/logo/gray.png",
"default_title": "Redux DevTools",
"default_popup": "window.html#popup"
},
"commands": {
"devtools-left": {
"description": "DevTools window to left"
},
"devtools-right": {
"description": "DevTools window to right"
},
"devtools-bottom": {
"description": "DevTools window to bottom"
},
"devtools-remote": {
"description": "Remote DevTools"
},
"_execute_page_action": {
"suggested_key": {
"default": "Ctrl+Shift+E"
}
}
},
"icons": {
"16": "img/logo/16x16.png",
"48": "img/logo/48x48.png",
"128": "img/logo/128x128.png"
},
"options_ui": {
"page": "options.html",
"chrome_style": true
},
"background": {
"scripts": ["background.bundle.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"exclude_globs": ["https://www.google*"],
"js": ["content.bundle.js", "pagewrap.bundle.js"],
"run_at": "document_start",
"all_frames": true
}
],
"devtools_page": "devtools.html",
"web_accessible_resources": ["page.bundle.js"],
"externally_connectable": {
"ids": ["*"]
},
"permissions": [
"notifications",
"contextMenus",
"storage",
"file:///*",
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'; style-src * 'unsafe-inline'; img-src 'self' data:;"
}

View File

@ -11,16 +11,14 @@
"url": "https://github.com/reduxjs/redux-devtools.git"
},
"scripts": {
"start": "webpack --config webpack/dev.config.babel.js",
"build": "pnpm run build:extension && pnpm run build:firefox",
"build:extension": "rimraf build/extension && webpack --config webpack/wrap.config.babel.js && webpack --config webpack/prod.config.babel.js",
"build:firefox": "webpack --config webpack/prod.firefox.config.babel.js",
"start": "webpack --env development --watch",
"build": "pnpm run build:extension && pnpm run build:chrome && pnpm run build:edge && pnpm run build:firefox",
"build:extension": "webpack --env production && webpack --config wrap.webpack.config.js",
"build:chrome": "cpy dist/** chrome/dist/unpacked && cpy manifest.json dist/unpacked --cwd chrome && bestzip chrome/dist/chrome.zip chrome/dist/unpacked",
"build:edge": "cpy dist/** edge/dist/unpacked && cpy manifest.json dist/unpacked --cwd edge && bestzip edge/dist/edge.zip edge/dist/unpacked",
"build:firefox": "cpy dist/** firefox/dist/unpacked && cpy manifest.json dist/unpacked --cwd firefox && bestzip firefox/dist/firefox.zip firefox/dist/unpacked",
"build:examples": "babel-node examples/buildAll.js",
"precompress:extension": "pnpm run lint && pnpm run test:app && pnpm run build:extension && pnpm run test:chrome && pnpm run test:electron",
"precompress:firefox": "pnpm run lint && pnpm run build:firefox && pnpm run test:app",
"compress:extension": "bestzip build/extension.zip build/extension",
"compress:firefox": "bestzip build/extension.zip build/extension",
"clean": "rimraf build && rimraf dev",
"clean": "rimraf dist && rimraf chrome/dist && rimraf edge/dist && rimraf firefox/dist",
"test:app": "cross-env BABEL_ENV=test jest test/app",
"test:chrome": "jest test/chrome",
"test:electron": "pnpm run build:test:electron:fixture && jest test/electron",
@ -68,6 +66,7 @@
"bestzip": "^2.2.1",
"chromedriver": "^106.0.1",
"copy-webpack-plugin": "^11.0.0",
"cpy-cli": "^4.2.0",
"cross-env": "^7.0.3",
"css-loader": "^6.7.1",
"electron": "^21.1.1",
@ -82,7 +81,6 @@
"immutable": "^4.1.0",
"jest": "^29.2.2",
"jest-environment-jsdom": "^29.2.2",
"path-browserify": "^1.0.1",
"pug-html-loader": "^1.1.5",
"raw-loader": "^4.0.2",
"react-transform-catch-errors": "^1.0.2",

View File

@ -23,7 +23,7 @@ export default ({ options, saveOption }: OptionsProps) => {
<label className="option__label" htmlFor="editor-browser">
{navigator.userAgent.indexOf('Firefox') !== -1
? "Don't open in external editor"
: "Use browser's debugger (from Chrome devpanel only)"}
: "Use browser's debugger (from browser devpanel only)"}
</label>
</div>

View File

@ -2,10 +2,6 @@ import React from 'react';
import { OptionsProps } from './Options';
export default ({ options, saveOption }: OptionsProps) => {
const browserName = navigator.userAgent.includes('Firefox')
? 'Firefox'
: 'Chrome';
return (
<fieldset className="option-group">
<legend className="option-group__title">Miscellaneous</legend>
@ -46,7 +42,7 @@ export default ({ options, saveOption }: OptionsProps) => {
Show errors
</label>
<div className="option__hint">
Show the {browserName} notifications when errors occur in the app
Show the browser notifications when errors occur in the app
</div>
</div>
</fieldset>

View File

@ -2,7 +2,7 @@ let s = document.createElement('script');
s.type = 'text/javascript';
if (process.env.NODE_ENV === 'production') {
const { default: script } = require('raw-loader!tmp/page.bundle.js');
const { default: script } = require('raw-loader!../dist/page.bundle.js');
s.appendChild(document.createTextNode(script));
(document.head || document.documentElement).appendChild(s);
s.parentNode!.removeChild(s);

View File

@ -5,7 +5,7 @@ import chromedriver from 'chromedriver';
import { switchMonitorTests, delay } from '../utils/e2e';
const port = 9515;
const path = resolve(__dirname, '..', '..', 'build', 'extension');
const path = resolve(__dirname, '..', '..', 'dist');
const extensionId = 'lmhkpmbekcpmknklioeibfkpmmfibljd';
const actionsPattern =
/^@@INIT(.|\n)+@@reduxReactRouter\/routerDidChange(.|\n)+@@reduxReactRouter\/initRoutes(.|\n)+$/;

View File

@ -4,7 +4,7 @@ const { app, BrowserWindow, session } = require('electron');
app.on('window-all-closed', app.quit);
app.whenReady().then(async () => {
await session.defaultSession.loadExtension(
path.join(__dirname, '../../../build/extension'),
path.join(__dirname, '../../../dist'),
{ allowFileAccess: true }
);

View File

@ -0,0 +1,81 @@
const path = require('path');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = function (env) {
return {
mode: env.production ? 'production' : 'development',
devtool: env.production ? 'source-map' : 'eval-source-map',
entry: {
background: [
path.resolve(__dirname, 'src/chromeApiMock'),
path.resolve(__dirname, 'src/background/index'),
],
options: [
path.resolve(__dirname, 'src/chromeApiMock'),
path.resolve(__dirname, 'src/options/index'),
],
window: [path.resolve(__dirname, 'src/window/index')],
remote: [path.resolve(__dirname, 'src/remote/index')],
devpanel: [
path.resolve(__dirname, 'src/chromeApiMock'),
path.resolve(__dirname, 'src/devpanel/index'),
],
devtools: path.resolve(__dirname, 'src/devtools/index'),
content: [
path.resolve(__dirname, 'src/chromeApiMock'),
path.resolve(__dirname, 'src/contentScript/index'),
],
page: path.join(__dirname, 'src/pageScript'),
...(env.production
? {}
: { pagewrap: path.resolve(__dirname, 'src/pageScriptWrap') }),
},
output: {
filename: '[name].bundle.js',
},
plugins: [
new webpack.DefinePlugin({
'process.env.BABEL_ENV': JSON.stringify(process.env.NODE_ENV),
}),
new ForkTsCheckerWebpackPlugin({
typescript: {
configFile: 'tsconfig.json',
},
}),
new CopyPlugin({
patterns: [
{
from: path.join(__dirname, 'chrome/manifest.json'),
to: path.join(__dirname, 'dist/manifest.json'),
},
{
from: path.join(__dirname, 'src/assets'),
to: path.join(__dirname, 'dist'),
},
],
}),
],
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
module: {
rules: [
{
test: /\.(js|ts)x?$/,
use: 'babel-loader',
exclude: /node_modules/,
},
{
test: /\.css?$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.pug$/,
use: ['file-loader?name=[name].html', 'pug-html-loader'],
},
],
},
};
};

View File

@ -1,100 +0,0 @@
import path from 'path';
import webpack from 'webpack';
import CopyPlugin from 'copy-webpack-plugin';
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
const baseConfig = (params) => ({
// devtool: 'source-map',
mode: params.mode,
entry: params.input || {
background: [
path.resolve(__dirname, '../src/chromeApiMock'),
path.resolve(__dirname, '../src/background/index'),
],
options: [
path.resolve(__dirname, '../src/chromeApiMock'),
path.resolve(__dirname, '../src/options/index'),
],
window: [path.resolve(__dirname, '../src/window/index')],
remote: [path.resolve(__dirname, '../src/remote/index')],
devpanel: [
path.resolve(__dirname, '../src/chromeApiMock'),
path.resolve(__dirname, '../src/devpanel/index'),
],
devtools: [path.resolve(__dirname, '../src/devtools/index')],
content: [
path.resolve(__dirname, '../src/chromeApiMock'),
path.resolve(__dirname, '../src/contentScript/index'),
],
pagewrap: [path.resolve(__dirname, '../src/pageScriptWrap')],
...params.inputExtra,
},
output: {
filename: '[name].bundle.js',
chunkFilename: '[id].chunk.js',
...params.output,
},
plugins: [
new webpack.DefinePlugin(params.globals),
...(params.plugins
? params.plugins
: [
new ForkTsCheckerWebpackPlugin({
typescript: {
configFile: 'tsconfig.json',
},
}),
]),
].concat(
params.copy
? new CopyPlugin({
patterns: [
{
from: params.manifestJsonPath,
to: path.join(params.output.path, 'manifest.json'),
},
{
from: path.join(__dirname, '../src/assets/'),
to: params.output.path,
},
],
})
: []
),
performance: {
hints: false,
},
resolve: {
alias: {
app: path.join(__dirname, '../src/app'),
tmp: path.join(__dirname, '../build/tmp'),
},
extensions: ['.js', '.jsx', '.ts', '.tsx'],
fallback: {
path: require.resolve('path-browserify'),
},
},
module: {
rules: [
...(params.loaders
? params.loaders
: [
{
test: /\.(js|ts)x?$/,
use: 'babel-loader',
exclude: /(node_modules|tmp\/page\.bundle)/,
},
]),
{
test: /\.css?$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.pug$/,
use: ['file-loader?name=[name].html', 'pug-html-loader'],
},
],
},
});
export default baseConfig;

View File

@ -1,23 +0,0 @@
import path from 'path';
import webpack from 'webpack';
import baseConfig from './base.config';
let config = baseConfig({
mode: 'development',
inputExtra: {
page: [path.join(__dirname, '../src/pageScript')],
},
output: { path: path.join(__dirname, '../dev') },
globals: {
'process.env': {
NODE_ENV: '"development"',
},
},
plugins: [new webpack.NoEmitOnErrorsPlugin()],
copy: true,
manifestJsonPath: path.join(__dirname, '../chrome/manifest.json'),
});
config.watch = true;
export default config;

View File

@ -1,17 +0,0 @@
import path from 'path';
import baseConfig from './base.config';
export default baseConfig({
mode: 'production',
inputExtra: {
page: [path.join(__dirname, '../src/pageScript')],
},
output: { path: path.join(__dirname, '../build/extension') },
globals: {
'process.env': {
NODE_ENV: '"production"',
},
},
copy: true,
manifestJsonPath: path.join(__dirname, '../chrome/manifest.json'),
});

View File

@ -1,14 +0,0 @@
import path from 'path';
import baseConfig from './base.config';
export default baseConfig({
mode: 'production',
output: { path: path.join(__dirname, '../build/extension') },
globals: {
'process.env': {
NODE_ENV: '"production"',
},
},
copy: true,
manifestJsonPath: path.join(__dirname, '../firefox/manifest.json'),
});

View File

@ -1,15 +0,0 @@
import path from 'path';
import baseConfig from './base.config';
export default baseConfig({
mode: 'production',
input: {
page: [path.join(__dirname, '../src/pageScript')],
},
output: { path: path.join(__dirname, '../build/tmp') },
globals: {
'process.env': {
NODE_ENV: '"production"',
},
},
});

View File

@ -0,0 +1,32 @@
const path = require('path');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = {
mode: 'production',
devtool: 'source-map',
entry: {
pagewrap: path.resolve(__dirname, 'src/pageScriptWrap'),
},
output: {
filename: '[name].bundle.js',
},
plugins: [
new ForkTsCheckerWebpackPlugin({
typescript: {
configFile: 'tsconfig.json',
},
}),
],
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
module: {
rules: [
{
test: /\.(js|ts)x?$/,
use: 'babel-loader',
exclude: /(node_modules|dist\/page\.bundle)/,
},
],
},
};

View File

@ -103,7 +103,6 @@
"html-webpack-plugin": "^5.5.0",
"jest": "^29.2.2",
"jest-environment-jsdom": "^29.2.2",
"path-browserify": "^1.0.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"rimraf": "^3.0.2",

View File

@ -39,9 +39,6 @@ export default (
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
fallback: {
path: require.resolve('path-browserify'),
},
},
plugins: [
new webpack.DefinePlugin({

View File

@ -39,9 +39,6 @@ export default (env: { production?: boolean } = {}): webpack.Configuration => ({
},
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
fallback: {
path: require.resolve('path-browserify'),
},
},
plugins: [
new webpack.DefinePlugin({

View File

@ -66,6 +66,7 @@ importers:
bestzip: ^2.2.1
chromedriver: ^106.0.1
copy-webpack-plugin: ^11.0.0
cpy-cli: ^4.2.0
cross-env: ^7.0.3
css-loader: ^6.7.1
electron: ^21.1.1
@ -83,7 +84,6 @@ importers:
jsan: ^3.1.14
localforage: ^1.10.0
lodash: ^4.17.21
path-browserify: ^1.0.1
pug-html-loader: ^1.1.5
raw-loader: ^4.0.2
react: ^18.2.0
@ -144,6 +144,7 @@ importers:
bestzip: 2.2.1
chromedriver: 106.0.1
copy-webpack-plugin: 11.0.0_webpack@5.74.0
cpy-cli: 4.2.0
cross-env: 7.0.3
css-loader: 6.7.1_webpack@5.74.0
electron: 21.1.1
@ -158,7 +159,6 @@ importers:
immutable: 4.1.0
jest: 29.2.2
jest-environment-jsdom: 29.2.2
path-browserify: 1.0.1
pug-html-loader: 1.1.5
raw-loader: 4.0.2_webpack@5.74.0
react-transform-catch-errors: 1.0.2
@ -838,7 +838,6 @@ importers:
jsondiffpatch: ^0.4.1
localforage: ^1.10.0
lodash: ^4.17.21
path-browserify: ^1.0.1
prop-types: ^15.8.1
react: ^18.2.0
react-dom: ^18.2.0
@ -920,7 +919,6 @@ importers:
html-webpack-plugin: 5.5.0_webpack@5.74.0
jest: 29.2.2_4pb6an67rakrle6rtido6z2a34
jest-environment-jsdom: 29.2.2
path-browserify: 1.0.1
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
rimraf: 3.0.2
@ -9752,6 +9750,14 @@ packages:
clean-stack: 2.2.0
indent-string: 4.0.0
/aggregate-error/4.0.1:
resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==}
engines: {node: '>=12'}
dependencies:
clean-stack: 4.2.0
indent-string: 5.0.0
dev: true
/airbnb-js-shims/2.2.1:
resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==}
dependencies:
@ -10250,6 +10256,11 @@ packages:
engines: {node: '>=8'}
dev: true
/arrify/3.0.0:
resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==}
engines: {node: '>=12'}
dev: true
/asap/2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
dev: true
@ -11128,6 +11139,16 @@ packages:
quick-lru: 4.0.1
dev: true
/camelcase-keys/7.0.2:
resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==}
engines: {node: '>=12'}
dependencies:
camelcase: 6.3.0
map-obj: 4.3.0
quick-lru: 5.1.1
type-fest: 1.4.0
dev: true
/camelcase/1.2.1:
resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==}
engines: {node: '>=0.10.0'}
@ -11373,6 +11394,13 @@ packages:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
/clean-stack/4.2.0:
resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==}
engines: {node: '>=12'}
dependencies:
escape-string-regexp: 5.0.0
dev: true
/cli-boxes/2.2.1:
resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
engines: {node: '>=6'}
@ -11821,6 +11849,25 @@ packages:
p-event: 4.2.0
dev: true
/cp-file/9.1.0:
resolution: {integrity: sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==}
engines: {node: '>=10'}
dependencies:
graceful-fs: 4.2.10
make-dir: 3.1.0
nested-error-stacks: 2.1.1
p-event: 4.2.0
dev: true
/cpy-cli/4.2.0:
resolution: {integrity: sha512-b04b+cbdr29CdpREPKw/itrfjO43Ty0Aj7wRM6M6LoE4GJxZJCk9Xp+Eu1IqztkKh3LxIBt1tDplENsa6KYprg==}
engines: {node: '>=12.20'}
hasBin: true
dependencies:
cpy: 9.0.1
meow: 10.1.5
dev: true
/cpy/8.1.2:
resolution: {integrity: sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==}
engines: {node: '>=8'}
@ -11838,6 +11885,20 @@ packages:
- supports-color
dev: true
/cpy/9.0.1:
resolution: {integrity: sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==}
engines: {node: ^12.20.0 || ^14.17.0 || >=16.0.0}
dependencies:
arrify: 3.0.0
cp-file: 9.1.0
globby: 13.1.2
junk: 4.0.0
micromatch: 4.0.5
nested-error-stacks: 2.1.1
p-filter: 3.0.0
p-map: 5.5.0
dev: true
/crc-32/1.2.2:
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
engines: {node: '>=0.8'}
@ -12211,6 +12272,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/decamelize/5.0.1:
resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
engines: {node: '>=10'}
dev: true
/decimal.js/10.4.2:
resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==}
dev: true
@ -12834,6 +12900,11 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
/escape-string-regexp/5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
dev: true
/escodegen/2.0.0:
resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
engines: {node: '>=6.0'}
@ -14834,6 +14905,11 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
/indent-string/5.0.0:
resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
engines: {node: '>=12'}
dev: true
/infer-owner/1.0.4:
resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
@ -16474,6 +16550,11 @@ packages:
engines: {node: '>=8'}
dev: true
/junk/4.0.0:
resolution: {integrity: sha512-ojtSU++zLJ3jQG9bAYjg94w+/DOJtRyD7nPaerMFrBhmdVmiV5/exYH5t4uHga4G/95nT6hr1OJoKIFbYbrW5w==}
engines: {node: '>=12.20'}
dev: true
/just-extend/4.2.1:
resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==}
dev: true
@ -17122,6 +17203,24 @@ packages:
readable-stream: 2.3.7
dev: true
/meow/10.1.5:
resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
'@types/minimist': 1.2.2
camelcase-keys: 7.0.2
decamelize: 5.0.1
decamelize-keys: 1.1.0
hard-rejection: 2.1.0
minimist-options: 4.1.0
normalize-package-data: 3.0.3
read-pkg-up: 8.0.0
redent: 4.0.0
trim-newlines: 4.0.2
type-fest: 1.4.0
yargs-parser: 20.2.9
dev: true
/meow/3.7.0:
resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==}
engines: {node: '>=0.10.0'}
@ -18054,6 +18153,13 @@ packages:
p-map: 2.1.0
dev: true
/p-filter/3.0.0:
resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
p-map: 5.5.0
dev: true
/p-finally/1.0.0:
resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
engines: {node: '>=4'}
@ -18112,6 +18218,13 @@ packages:
dependencies:
aggregate-error: 3.1.0
/p-map/5.5.0:
resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==}
engines: {node: '>=12'}
dependencies:
aggregate-error: 4.0.1
dev: true
/p-retry/4.6.2:
resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
engines: {node: '>=8'}
@ -18946,6 +19059,11 @@ packages:
engines: {node: '>=8'}
dev: true
/quick-lru/5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
dev: true
/ramda/0.28.0:
resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==}
@ -19430,6 +19548,15 @@ packages:
type-fest: 0.8.1
dev: true
/read-pkg-up/8.0.0:
resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
engines: {node: '>=12'}
dependencies:
find-up: 5.0.0
read-pkg: 6.0.0
type-fest: 1.4.0
dev: true
/read-pkg/1.1.0:
resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==}
engines: {node: '>=0.10.0'}
@ -19450,6 +19577,16 @@ packages:
type-fest: 0.6.0
dev: true
/read-pkg/6.0.0:
resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==}
engines: {node: '>=12'}
dependencies:
'@types/normalize-package-data': 2.4.1
normalize-package-data: 3.0.3
parse-json: 5.2.0
type-fest: 1.4.0
dev: true
/read-yaml-file/1.1.0:
resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
engines: {node: '>=6'}
@ -19534,6 +19671,14 @@ packages:
strip-indent: 3.0.0
dev: true
/redent/4.0.0:
resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
engines: {node: '>=12'}
dependencies:
indent-string: 5.0.0
strip-indent: 4.0.0
dev: true
/redux-devtools-themes/1.0.0:
resolution: {integrity: sha512-hBWqdZX+dioMWnTjf8+uSm0q1wCdYO4kU5gERzHcMMbu0Qg7JDR42TnJ6GHJ6r7k/tIpsCSygc9U0ehAtR24TQ==}
dependencies:
@ -20814,6 +20959,13 @@ packages:
min-indent: 1.0.1
dev: true
/strip-indent/4.0.0:
resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
engines: {node: '>=12'}
dependencies:
min-indent: 1.0.1
dev: true
/strip-json-comments/3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@ -21409,6 +21561,11 @@ packages:
engines: {node: '>=8'}
dev: true
/trim-newlines/4.0.2:
resolution: {integrity: sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==}
engines: {node: '>=12'}
dev: true
/trim-trailing-lines/1.1.4:
resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==}
dev: true
@ -21636,6 +21793,11 @@ packages:
engines: {node: '>=8'}
dev: true
/type-fest/1.4.0:
resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
engines: {node: '>=10'}
dev: true
/type-fest/2.19.0:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
@ -22736,18 +22898,6 @@ packages:
signal-exit: 3.0.7
dev: true
/ws/7.5.9:
resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
engines: {node: '>=8.3.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
/ws/8.9.0:
resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==}
engines: {node: '>=10.0.0'}