:spark: 支持系统截屏功能

This commit is contained in:
muwoo 2023-04-04 11:13:38 +08:00
parent 9ee8d78b1b
commit 2cd70bd386
12 changed files with 197 additions and 66 deletions

View File

@ -47,6 +47,21 @@
</div> </div>
</a-tooltip> </a-tooltip>
</div> </div>
<div class="settings-item-li">
<div class="label">截屏</div>
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }} </span>
</template>
<div
class="value"
tabIndex="-1"
@keyup="e => changeShortCut(e, 'capture')"
>
{{ shortCut.capture }}
</div>
</a-tooltip>
</div>
</div> </div>
<div class="setting-item"> <div class="setting-item">
<div class="title">通用</div> <div class="title">通用</div>

View File

@ -1,6 +1,6 @@
{ {
"name": "rubick", "name": "rubick",
"version": "2.1.10", "version": "2.2.0",
"author": "muwoo <2424880409@qq.com>", "author": "muwoo <2424880409@qq.com>",
"private": true, "private": true,
"scripts": { "scripts": {
@ -24,6 +24,7 @@
"axios": "^1.3.4", "axios": "^1.3.4",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"electron-screenshots": "^0.5.19",
"extract-file-icon": "^0.3.2", "extract-file-icon": "^0.3.2",
"fix-path": "^3.0.0", "fix-path": "^3.0.0",
"get-mac-apps": "^1.0.2", "get-mac-apps": "^1.0.2",

View File

@ -113,6 +113,13 @@ window.rubick = {
setFeature(feature) { setFeature(feature) {
return ipcSendSync('setFeature', { feature }); return ipcSendSync('setFeature', { feature });
}, },
screenCapture(cb) {
typeof cb === 'function' &&
(window.rubick.hooks.onScreenCapture = ({ data }) => {
cb(data);
});
ipcSendSync('screenCapture');
},
removeFeature(code) { removeFeature(code) {
return ipcSendSync('removeFeature', { code }); return ipcSendSync('removeFeature', { code });
}, },

View File

@ -1,12 +1,13 @@
import commonConst from "@/common/utils/commonConst"; import commonConst from '@/common/utils/commonConst';
export default { export default {
version: 4, version: 5,
perf: { perf: {
shortCut: { shortCut: {
showAndHidden: "Option+R", showAndHidden: 'Option+R',
separate: "Ctrl+D", separate: 'Ctrl+D',
quit: "Shift+Escape", quit: 'Shift+Escape',
capture: 'Ctrl+Shift+A',
}, },
common: { common: {
start: true, start: true,
@ -14,7 +15,7 @@ export default {
// 是否失焦隐藏。默认在dev环境不隐藏在打包后隐藏。 // 是否失焦隐藏。默认在dev环境不隐藏在打包后隐藏。
hideOnBlur: commonConst.production(), hideOnBlur: commonConst.production(),
autoPast: false, autoPast: false,
darkMode: false darkMode: false,
}, },
local: { local: {
search: true, search: true,

View File

@ -1,27 +1,31 @@
import path from "path"; import path from 'path';
import fs from "fs"; import fs from 'fs';
import getLocalDataFile from "./getLocalDataFile"; import getLocalDataFile from './getLocalDataFile';
import { PluginHandler } from "@/core"; import { PluginHandler } from '@/core';
import { PLUGIN_INSTALL_DIR as baseDir } from "@/common/constans/main"; import { PLUGIN_INSTALL_DIR as baseDir } from '@/common/constans/main';
import API from "@/main/common/api"; import API from '@/main/common/api';
const configPath = path.join(getLocalDataFile(), "./rubick-local-plugin.json"); const configPath = path.join(getLocalDataFile(), './rubick-local-plugin.json');
let registry; let registry;
let pluginInstance; let pluginInstance;
(async () => { (async () => {
try { try {
registry = (await API.dbGet({ data: { id: "rubick-localhost-config" } })) const res = await API.dbGet({
.data.register; data: {
console.log(registry); id: 'rubick-localhost-config',
},
});
registry = res && res.data.register;
pluginInstance = new PluginHandler({ pluginInstance = new PluginHandler({
baseDir, baseDir,
registry registry,
}); });
} catch (e) { } catch (e) {
pluginInstance = new PluginHandler({ pluginInstance = new PluginHandler({
baseDir, baseDir,
registry registry,
}); });
} }
})(); })();
@ -32,13 +36,13 @@ global.LOCAL_PLUGINS = {
await pluginInstance.install([plugin.name], { isDev: plugin.isDev }); await pluginInstance.install([plugin.name], { isDev: plugin.isDev });
if (plugin.isDev) { if (plugin.isDev) {
// 获取 dev 插件信息 // 获取 dev 插件信息
const pluginPath = path.resolve(baseDir, "node_modules", plugin.name); const pluginPath = path.resolve(baseDir, 'node_modules', plugin.name);
const pluginInfo = JSON.parse( const pluginInfo = JSON.parse(
fs.readFileSync(path.join(pluginPath, "./package.json"), "utf8") fs.readFileSync(path.join(pluginPath, './package.json'), 'utf8')
); );
plugin = { plugin = {
...plugin, ...plugin,
...pluginInfo ...pluginInfo,
}; };
} }
global.LOCAL_PLUGINS.addPlugin(plugin); global.LOCAL_PLUGINS.addPlugin(plugin);
@ -46,18 +50,18 @@ global.LOCAL_PLUGINS = {
}, },
refreshPlugin(plugin) { refreshPlugin(plugin) {
// 获取 dev 插件信息 // 获取 dev 插件信息
const pluginPath = path.resolve(baseDir, "node_modules", plugin.name); const pluginPath = path.resolve(baseDir, 'node_modules', plugin.name);
const pluginInfo = JSON.parse( const pluginInfo = JSON.parse(
fs.readFileSync(path.join(pluginPath, "./package.json"), "utf8") fs.readFileSync(path.join(pluginPath, './package.json'), 'utf8')
); );
plugin = { plugin = {
...plugin, ...plugin,
...pluginInfo ...pluginInfo,
}; };
// 刷新 // 刷新
let currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins(); let currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins();
currentPlugins = currentPlugins.map(p => { currentPlugins = currentPlugins.map((p) => {
if (p.name === plugin.name) { if (p.name === plugin.name) {
return plugin; return plugin;
} }
@ -73,7 +77,7 @@ global.LOCAL_PLUGINS = {
try { try {
if (!global.LOCAL_PLUGINS.PLUGINS.length) { if (!global.LOCAL_PLUGINS.PLUGINS.length) {
global.LOCAL_PLUGINS.PLUGINS = JSON.parse( global.LOCAL_PLUGINS.PLUGINS = JSON.parse(
fs.readFileSync(configPath, "utf-8") fs.readFileSync(configPath, 'utf-8')
); );
} }
return global.LOCAL_PLUGINS.PLUGINS; return global.LOCAL_PLUGINS.PLUGINS;
@ -85,7 +89,7 @@ global.LOCAL_PLUGINS = {
addPlugin(plugin) { addPlugin(plugin) {
let has = false; let has = false;
const currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins(); const currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins();
currentPlugins.some(p => { currentPlugins.some((p) => {
has = p.name === plugin.name; has = p.name === plugin.name;
return has; return has;
}); });
@ -96,20 +100,22 @@ global.LOCAL_PLUGINS = {
} }
}, },
updatePlugin(plugin) { updatePlugin(plugin) {
global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.map(origin => { global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.map(
if (origin.name === plugin.name) { (origin) => {
return plugin; if (origin.name === plugin.name) {
return plugin;
}
return origin;
} }
return origin; );
});
fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS)); fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS));
}, },
async deletePlugin(plugin) { async deletePlugin(plugin) {
await pluginInstance.uninstall([plugin.name], { isDev: plugin.isDev }); await pluginInstance.uninstall([plugin.name], { isDev: plugin.isDev });
global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.filter( global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.filter(
p => plugin.name !== p.name (p) => plugin.name !== p.name
); );
fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS)); fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS));
return global.LOCAL_PLUGINS.PLUGINS; return global.LOCAL_PLUGINS.PLUGINS;
} },
}; };

View File

@ -13,6 +13,7 @@ export interface DocRes {
ok: boolean; ok: boolean;
rev: RevisionId; rev: RevisionId;
_id: string; _id: string;
data?: any;
} }
export interface DBError { export interface DBError {

View File

@ -15,6 +15,7 @@ import { LocalDb } from '@/core';
import plist from 'plist'; import plist from 'plist';
import { DECODE_KEY } from '@/common/constans/main'; import { DECODE_KEY } from '@/common/constans/main';
import mainInstance from '../index'; import mainInstance from '../index';
import { screenshots } from './registerScreenshots';
const runnerInstance = runner(); const runnerInstance = runner();
const detachInstance = detach(); const detachInstance = detach();
const dbInstance = new LocalDb(app.getPath('userData')); const dbInstance = new LocalDb(app.getPath('userData'));
@ -33,6 +34,14 @@ class API {
event.returnValue = data; event.returnValue = data;
// event.sender.send(`msg-back-${arg.type}`, data); // event.sender.send(`msg-back-${arg.type}`, data);
}); });
// 注册截屏成功回调事件
screenshots.on('ok', (e, buffer) => {
const image = nativeImage.createFromBuffer(buffer);
runnerInstance.executeHooks('ScreenCapture', {
data: image.toDataURL(),
});
});
} }
public getCurrentWindow = (window, e) => { public getCurrentWindow = (window, e) => {
@ -313,6 +322,10 @@ class API {
shell.beep(); shell.beep();
return true; return true;
} }
public screenCapture() {
screenshots.startCapture();
}
} }
export default new API(); export default new API();

View File

@ -5,8 +5,9 @@ import {
BrowserView, BrowserView,
screen, screen,
ipcMain, ipcMain,
app app,
} from "electron"; } from 'electron';
import { screenshots } from './registerScreenshots';
const registerHotKey = (mainWindow: BrowserWindow): void => { const registerHotKey = (mainWindow: BrowserWindow): void => {
// 设置开机启动 // 设置开机启动
@ -14,7 +15,7 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
const config = global.OP_CONFIG.get(); const config = global.OP_CONFIG.get();
app.setLoginItemSettings({ app.setLoginItemSettings({
openAtLogin: config.perf.common.start, openAtLogin: config.perf.common.start,
openAsHidden: true openAsHidden: true,
}); });
}; };
// 设置暗黑模式 // 设置暗黑模式
@ -22,7 +23,7 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
const config = global.OP_CONFIG.get(); const config = global.OP_CONFIG.get();
const isDark = config.perf.common.darkMode; const isDark = config.perf.common.darkMode;
if (isDark) { if (isDark) {
nativeTheme.themeSource = "dark"; nativeTheme.themeSource = 'dark';
mainWindow.webContents.executeJavaScript( mainWindow.webContents.executeJavaScript(
`document.body.classList.add("dark");window.rubick.theme="dark"` `document.body.classList.add("dark");window.rubick.theme="dark"`
); );
@ -32,7 +33,7 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
); );
}); });
} else { } else {
nativeTheme.themeSource = "light"; nativeTheme.themeSource = 'light';
mainWindow.webContents.executeJavaScript( mainWindow.webContents.executeJavaScript(
`document.body.classList.remove("dark");window.rubick.theme="light"` `document.body.classList.remove("dark");window.rubick.theme="light"`
); );
@ -71,12 +72,16 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
mainWindow.focus(); mainWindow.focus();
mainWindow.setVisibleOnAllWorkspaces(false, { mainWindow.setVisibleOnAllWorkspaces(false, {
visibleOnFullScreen: true visibleOnFullScreen: true,
}); });
mainWindow.setPosition(wx, wy); mainWindow.setPosition(wx, wy);
mainWindow.show(); mainWindow.show();
}); });
globalShortcut.register(config.perf.shortCut.capture, () => {
screenshots.startCapture();
});
// globalShortcut.register(config.perf.shortCut.separate, () => { // globalShortcut.register(config.perf.shortCut.separate, () => {
// //
// }); // });
@ -87,15 +92,15 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
}); });
// 注册自定义全局快捷键 // 注册自定义全局快捷键
config.global.forEach(sc => { config.global.forEach((sc) => {
if (!sc.key || !sc.value) return; if (!sc.key || !sc.value) return;
globalShortcut.register(sc.key, () => { globalShortcut.register(sc.key, () => {
mainWindow.webContents.send("global-short-key", sc.value); mainWindow.webContents.send('global-short-key', sc.value);
}); });
}); });
}; };
init(); init();
ipcMain.on("re-register", () => { ipcMain.on('re-register', () => {
init(); init();
}); });
}; };

View File

@ -0,0 +1,8 @@
import Screenshots from 'electron-screenshots';
let screenshots;
const initScreenShots = () => {
screenshots = new Screenshots();
};
export { initScreenShots, screenshots };

View File

@ -17,6 +17,7 @@ import '../common/utils/localPlugin';
import '../common/utils/localConfig'; import '../common/utils/localConfig';
import registerySystemPlugin from './common/registerySystemPlugin'; import registerySystemPlugin from './common/registerySystemPlugin';
import { initScreenShots } from './common/registerScreenshots';
class App { class App {
public windowCreator: { init: () => void; getWindow: () => BrowserWindow }; public windowCreator: { init: () => void; getWindow: () => BrowserWindow };
@ -58,6 +59,7 @@ class App {
const readyFunction = () => { const readyFunction = () => {
this.createWindow(); this.createWindow();
const mainWindow = this.windowCreator.getWindow(); const mainWindow = this.windowCreator.getWindow();
initScreenShots();
API.init(mainWindow); API.init(mainWindow);
createTray(this.windowCreator.getWindow()); createTray(this.windowCreator.getWindow());
registerHotKey(this.windowCreator.getWindow()); registerHotKey(this.windowCreator.getWindow());

View File

@ -1,37 +1,37 @@
// eslint-disable-next-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require("path"); const path = require('path');
module.exports = { module.exports = {
// transpileDependencies: ["fix-path"], // transpileDependencies: ["fix-path"],
configureWebpack: { configureWebpack: {
resolve: { resolve: {
alias: { alias: {
"@": path.join(__dirname, "./src"), '@': path.join(__dirname, './src'),
}, },
}, },
externals: { externals: {
'extract-file-icon': 'commonjs extract-file-icon' 'extract-file-icon': 'commonjs extract-file-icon',
}, },
}, },
pages: { pages: {
index: { index: {
entry: "src/renderer/main.ts", entry: 'src/renderer/main.ts',
}, },
}, },
productionSourceMap: false, productionSourceMap: false,
pluginOptions: { pluginOptions: {
electronBuilder: { electronBuilder: {
nodeIntegration: true, nodeIntegration: true,
mainProcessFile: "src/main/index.ts", mainProcessFile: 'src/main/index.ts',
mainProcessWatch: ["src/main"], mainProcessWatch: ['src/main'],
externals: ["pouchdb", "extract-file-icon"], externals: ['pouchdb', 'extract-file-icon', 'electron-screenshots'],
// Use this to change the entry point of your app's render process. default src/[main|index].[js|ts] // Use this to change the entry point of your app's render process. default src/[main|index].[js|ts]
builderOptions: { builderOptions: {
productName: "rubick2", productName: 'rubick2',
appId: "com.muwoo.rubick", appId: 'com.muwoo.rubick',
compression: "maximum", compression: 'maximum',
directories: { directories: {
output: "build", output: 'build',
}, },
// files: ["dist_electron/**/*"], // files: ["dist_electron/**/*"],
dmg: { dmg: {
@ -39,35 +39,35 @@ module.exports = {
{ {
x: 410, x: 410,
y: 150, y: 150,
type: "link", type: 'link',
path: "/Applications", path: '/Applications',
}, },
{ {
x: 130, x: 130,
y: 150, y: 150,
type: "file", type: 'file',
}, },
], ],
}, },
mac: { mac: {
icon: "public/icons/icon.icns", icon: 'public/icons/icon.icns',
target: ["pkg"], target: ['pkg'],
extendInfo: { extendInfo: {
LSUIElement: 1, LSUIElement: 1,
}, },
}, },
win: { win: {
icon: "public/icons/icon.ico", icon: 'public/icons/icon.ico',
target: "nsis", target: 'nsis',
}, },
nsis: { nsis: {
oneClick: false, oneClick: false,
allowToChangeInstallationDirectory: true, allowToChangeInstallationDirectory: true,
}, },
linux: { linux: {
icon: "public/icons/", icon: 'public/icons/',
publish: ["github"], publish: ['github'],
target: "deb", target: 'deb',
}, },
}, },
}, },

View File

@ -4130,7 +4130,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4" version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@ -4680,6 +4680,16 @@ electron-publish@22.14.13:
lazy-val "^1.0.5" lazy-val "^1.0.5"
mime "^2.5.2" mime "^2.5.2"
electron-screenshots@^0.5.19:
version "0.5.19"
resolved "https://registry.yarnpkg.com/electron-screenshots/-/electron-screenshots-0.5.19.tgz#2cef4bf2af4cc92d999a5a9e07cada99bccdcf59"
integrity sha512-+3Ia7f8D4oRmoVoTxvUkS/U288zA21W4TERX8Cy3A7OUXkoIqfRF48Caz5Q8I5tRoWy+QIqfXOupEv9M4fcwlQ==
dependencies:
debug "^4.3.4"
fs-extra "^11.1.1"
node-screenshots "^0.1.2"
react-screenshots "^0.5.19"
electron-to-chromium@^1.4.202: electron-to-chromium@^1.4.202:
version "1.4.211" version "1.4.211"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz#afaa8b58313807501312d598d99b953568d60f91" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz#afaa8b58313807501312d598d99b953568d60f91"
@ -5606,6 +5616,15 @@ fs-extra@^10.0.0:
jsonfile "^6.0.1" jsonfile "^6.0.1"
universalify "^2.0.0" universalify "^2.0.0"
fs-extra@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^7.0.1: fs-extra@^7.0.1:
version "7.0.1" version "7.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
@ -8014,6 +8033,54 @@ node-releases@^2.0.6:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
node-screenshots-darwin-arm64@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-darwin-arm64/-/node-screenshots-darwin-arm64-0.1.2.tgz#6662d6c5ff43c0f0a423d6c93d3572dfd459ebb1"
integrity sha512-K7Gz1HxYBdchAzFtDFei1sOJf6DosBZw4MWTDfybuBhGPlJWHdqdgBu01qBb6IrTLFl6soC1tpLEGzNmJ4sDxA==
node-screenshots-darwin-x64@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-darwin-x64/-/node-screenshots-darwin-x64-0.1.2.tgz#6926c3714337bed7c21fcb0a6b4f351d675ed04c"
integrity sha512-4zVzuVPveFivpTBEx9cGw0nz8NayqIrtyoclTuEcTrnS1iUCkSL8/G9FUMgqy8HgzE2j534sQQmRt1KOV8RkCA==
node-screenshots-linux-x64-gnu@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-linux-x64-gnu/-/node-screenshots-linux-x64-gnu-0.1.2.tgz#0a1d34ef49fb0342e3dfe05de2729940716034f4"
integrity sha512-0hK1EK8UdH5i9lt4kEUAVcCm2lYtYBM9smWGosiSoxcz0hzjSTMIKTNzK+VY6qspNYMNM71Q14jbiQfSsXg5iQ==
node-screenshots-linux-x64-musl@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-linux-x64-musl/-/node-screenshots-linux-x64-musl-0.1.2.tgz#23db04426a3bbaed8802e84d5f9fbb089375f480"
integrity sha512-DLjKKexhrq5gM8SoAB5AhExfJ9ftnJqTcxBx2sX17aTyCnLJ8VAl0ID4PbweU/zkEmLSN5YM7rTAgfIOvWBC0Q==
node-screenshots-win32-arm64-msvc@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-win32-arm64-msvc/-/node-screenshots-win32-arm64-msvc-0.1.2.tgz#e3096a4e597898fbef5be9e92fa4529f9c03eb34"
integrity sha512-BTZHxHy3Z0hjdC2mDTHbKYrDGIFqloe0Dr7FXCIkDyQua4X2SB+vz2Q2NBUe/yDynzNvZHLLKBwZjFJ7cuf9gg==
node-screenshots-win32-ia32-msvc@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-win32-ia32-msvc/-/node-screenshots-win32-ia32-msvc-0.1.2.tgz#89b9c78fedf285a93e0e492726afc33f25dba3cc"
integrity sha512-5QREHYvq3BXAO40+gWHnVc8xu6BRfN55DmjCKg9NA/LSH21xLALA6tjh24hoa3Ng5Hv09ARNafVic7EwPr0Iwg==
node-screenshots-win32-x64-msvc@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots-win32-x64-msvc/-/node-screenshots-win32-x64-msvc-0.1.2.tgz#546fce36009c0e05653d2d18d8a5a72046690809"
integrity sha512-yoByNKjL0oRTmkkLs22HmcsaijbblfPGyPiRtajkbQWAmambWWbvoKHFkx/ZMFfIbxjTKHdFMmlhuwO+GaiAmw==
node-screenshots@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/node-screenshots/-/node-screenshots-0.1.2.tgz#3a4997e9f839e977fcd3bf1fde75caecd1ae214a"
integrity sha512-+DHuQsiqyNj5TDQZKt2pICfIOYmeeyfhOgvGy0Q7RWXFesiFASOyDz6/G3urMp1gtMn3snrrFHLXvO6aFdcQBw==
optionalDependencies:
node-screenshots-darwin-arm64 "0.1.2"
node-screenshots-darwin-x64 "0.1.2"
node-screenshots-linux-x64-gnu "0.1.2"
node-screenshots-linux-x64-musl "0.1.2"
node-screenshots-win32-arm64-msvc "0.1.2"
node-screenshots-win32-ia32-msvc "0.1.2"
node-screenshots-win32-x64-msvc "0.1.2"
normalize-package-data@^2.5.0: normalize-package-data@^2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -9259,6 +9326,11 @@ rc@1.2.8, rc@^1.2.8:
minimist "^1.2.0" minimist "^1.2.0"
strip-json-comments "~2.0.1" strip-json-comments "~2.0.1"
react-screenshots@^0.5.19:
version "0.5.19"
resolved "https://registry.yarnpkg.com/react-screenshots/-/react-screenshots-0.5.19.tgz#6cda8a9bf29d3a9e0baff2102916371b2be977aa"
integrity sha512-n1ovKoiwJJ04DWSWX1ko1hjSf+B9IqnMz+M4tr9VgKb67nQ1IeByqOjs52vwsSDJc5SrlXDtIvRjBcq7bO/raA==
read-config-file@6.2.0: read-config-file@6.2.0:
version "6.2.0" version "6.2.0"
resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade"