Added splash screen that shows recent files

Choosing open file will go to the last opened directory
This commit is contained in:
Matthew Welch 2020-11-21 23:02:21 -08:00
parent 5c6438764b
commit 606b358d5d
7 changed files with 315 additions and 72 deletions

View File

@ -46,6 +46,7 @@
}, },
"dependencies": { "dependencies": {
"electron-squirrel-startup": "^1.0.0", "electron-squirrel-startup": "^1.0.0",
"electron-store": "^6.0.1",
"jquery": "^3.5.1", "jquery": "^3.5.1",
"jsdom": "^16.4.0" "jsdom": "^16.4.0"
}, },

View File

@ -1,11 +1,12 @@
body { body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
padding: 2rem;
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
} }
#editor {
.editor {
padding: 2rem;
} }
#tables { #tables {
@ -37,3 +38,16 @@ td > textarea {
height: 5em; height: 5em;
margin: 5px; margin: 5px;
} }
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #dedede;
}
::-webkit-scrollbar-thumb {
background: #888;
}

View File

@ -2,15 +2,18 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Hello World!</title> <title>Web Editor</title>
<link rel="stylesheet" href="css/w3.css"> <link rel="stylesheet" href="css/w3.css">
<link rel="stylesheet" href="css/index.css"> <link rel="stylesheet" href="css/index.css">
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script> <script>if (typeof module === 'object') {
window.module = module;
module = undefined;
}</script>
<script src="js/jquery-3.5.1.min.js"></script> <script src="js/jquery-3.5.1.min.js"></script>
<script src="js/w3.js"></script> <script src="js/w3.js"></script>
<script>if (window.module) module = window.module;</script> <script>if (window.module) module = window.module;</script>
</head> </head>
<body> <body class="editor">
<nav id="nav" class="w3-bar"></nav> <nav id="nav" class="w3-bar"></nav>

View File

@ -1,16 +1,19 @@
const { app, BrowserWindow, dialog, Menu } = require('electron'); const { app, BrowserWindow, dialog, Menu } = require('electron');
const fs = require("fs"); const fs = require("fs");
const {ipcMain} = require("electron") const {ipcMain} = require("electron");
const Store = require("electron-store");
var jsdom = require("jsdom"); var jsdom = require("jsdom");
const { JSDOM } = jsdom; const { JSDOM } = jsdom;
const { window } = new JSDOM(); const { window } = new JSDOM();
const { document } = (new JSDOM('')).window; const { document } = (new JSDOM('')).window;
const store = new Store();
global.document = document; global.document = document;
var $ = jQuery = require('jquery')(window); var $ = jQuery = require('jquery')(window);
let mainWindow = null; let mainWindow = null;
let splash_screen = null;
let save_data = { let save_data = {
file_path: null file_path: null
} }
@ -35,26 +38,7 @@ let menu_template = [
{ {
label: "Open", label: "Open",
accelerator: "Ctrl+O", accelerator: "Ctrl+O",
click: function () { click: openFile
let options = {
//Placeholder 1
title: "Open website data",
//Placeholder 2
defaultPath : app.getPath("documents"),
//Placeholder 3
filters :[
{name: 'json', extensions: ['json']},
{name: 'All Files', extensions: ['*']}
]
}
let file = dialog.showOpenDialogSync(options);
if (file) {
save_data.file_path = file[0];
mainWindow.webContents.send("open", save_data.file_path);
}
}
}, },
{ {
label: "Exit", label: "Exit",
@ -66,6 +50,40 @@ let menu_template = [
} }
] ]
function openFile() {
let options = {
//Placeholder 1
title: "Open website data",
//Placeholder 2
defaultPath : store.get("default_dir", app.getPath("documents")),
//Placeholder 3
filters :[
{name: 'json', extensions: ['json']},
{name: 'All Files', extensions: ['*']}
]
}
let file = dialog.showOpenDialogSync(options);
if (file) {
store.set("default_dir", file[0])
save_data.file_path = file[0];
if (mainWindow) {
mainWindow.webContents.send("open", save_data.file_path);
} else {
loadFile(file[0]);
}
}
}
function loadFile(file_name) {
createWindow();
mainWindow.webContents.once("dom-ready", () => {
mainWindow.webContents.send("open", file_name);
splash_screen.close();
})
}
function sanitizeName(table_name) { function sanitizeName(table_name) {
let pattern = " !@#$%^&*()_+=/?.,<>;':\"[]{}\\`~|-" let pattern = " !@#$%^&*()_+=/?.,<>;':\"[]{}\\`~|-"
let new_name = table_name.toLowerCase(); let new_name = table_name.toLowerCase();
@ -174,6 +192,29 @@ ipcMain.on("save", (event, data, new_file) => {
} }
}) })
ipcMain.on("loadFile", (event, file_name) => {
loadFile();
})
ipcMain.on("newFile", (event) => {
createWindow();
mainWindow.webContents.once("dom-ready", () => {
splash_screen.close();
})
})
ipcMain.on("openFile", (event) => {
openFile();
})
ipcMain.handle("getStoreValue", (event, key) => {
return store.get(key);
})
ipcMain.handle("setStoreValue", (event, key, value) => {
store.set(key, value);
})
// Handle creating/removing shortcuts on Windows when installing/uninstalling. // Handle creating/removing shortcuts on Windows when installing/uninstalling.
if (require('electron-squirrel-startup')) { // eslint-disable-line global-require if (require('electron-squirrel-startup')) { // eslint-disable-line global-require
app.quit(); app.quit();
@ -182,8 +223,8 @@ if (require('electron-squirrel-startup')) { // eslint-disable-line global-requir
const createWindow = () => { const createWindow = () => {
// Create the browser window. // Create the browser window.
mainWindow = new BrowserWindow({ mainWindow = new BrowserWindow({
width: 800, width: 900,
height: 600, height: 700,
webPreferences: { webPreferences: {
nodeIntegration: true nodeIntegration: true
} }
@ -199,10 +240,38 @@ const createWindow = () => {
// mainWindow.webContents.openDevTools(); // mainWindow.webContents.openDevTools();
}; };
const splashScreen = () => {
// Create the browser window.
splash_screen = new BrowserWindow({
width: 806,
height: 529,
webPreferences: {
nodeIntegration: true
},
autoHideMenuBar: true,
resizable: false,
frame: true
});
let menu = Menu.buildFromTemplate(menu_template);
Menu.setApplicationMenu(menu);
if (!store.has("recent_files")) {
store.set("recent_files", []);
}
// and load the index.html of the app.
splash_screen.loadFile('src/splash.html');
// Open the DevTools.
// splash_screen.webContents.openDevTools();
// store.openInEditor();
};
// This method will be called when Electron has finished // This method will be called when Electron has finished
// initialization and is ready to create browser windows. // initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs. // Some APIs can only be used after this event occurs.
app.on('ready', createWindow); app.on('ready', splashScreen);
// Quit when all windows are closed, except on macOS. There, it's common // Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits // for applications and their menu bar to stay active until the user quits

View File

@ -614,10 +614,21 @@ function openFile(file_path) {
}); });
} }
async function updateRecentFiles(new_file) {
let recent_files = await ipcRenderer.invoke("getStoreValue", "recent_files");
if (recent_files.includes(new_file)) {
recent_files.splice(recent_files.indexOf(new_file), 1);
// delete recent_files[recent_files.indexOf(new_file)];
}
recent_files.splice(0, 0, new_file);
ipcRenderer.invoke("setStoreValue", "recent_files", recent_files);
}
ipcRenderer.on("save", (event, new_file) => { ipcRenderer.on("save", (event, new_file) => {
saveFile(new_file); saveFile(new_file);
}) })
ipcRenderer.on("open", (event, file_path) => { ipcRenderer.on("open", (event, file_path) => {
updateRecentFiles(file_path);
openFile(file_path); openFile(file_path);
}) })

53
src/splash.html Normal file
View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Web Editor</title>
<link rel="stylesheet" href="css/w3.css">
<link rel="stylesheet" href="css/index.css">
<script>if (typeof module === 'object') {
window.module = module;
module = undefined;
}</script>
<script src="js/jquery-3.5.1.min.js"></script>
<script src="js/w3.js"></script>
<script>if (window.module) module = window.module;</script>
</head>
<body>
<div id="recent-files" class="w3-light-gray w3-small" style="width: 300px; height: 500px; float: left; border-right: 1px solid gray; overflow-y: scroll">
</div>
<div class="w3-center" style="width: 500px; height: 500px; float: right; padding-top: 20px">
<h1 class="">Web Editor</h1>
<button class="w3-btn w3-green" onclick="newFile()">Create New!</button><br/>
<button class="w3-btn" onclick="openFile()">Open File</button>
</div>
</body>
<script>
const {ipcRenderer} = require("electron");
let recent_files = null;
async function getRecentFiles() {
recent_files = await ipcRenderer.invoke("getStoreValue", "recent_files");
let recent_files_elm = $("#recent-files");
if (recent_files.length > 0) {
for (let file of recent_files) {
let match = RegExp(/[^\\]+.json/).exec(file);
recent_files_elm.append(`<div><button class="w3-btn w3-left-align" style="width: 100%" onclick="loadFile(recent_files[${recent_files.indexOf(file)}])">${match[0]}<br/>${file}</button></div>`)
}
} else {
recent_files_elm.append("<div class='w3-container'><h3>No recent files</h3></div>")
}
}
getRecentFiles();
function loadFile(file_name) {
ipcRenderer.send("loadFile", file_name.toString());
}
function newFile(file_name) {
ipcRenderer.send("newFile");
}
function openFile() {
ipcRenderer.send("openFile");
}
</script>
</html>

View File

@ -355,6 +355,16 @@ acorn@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
ajv@^6.12.2:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^6.12.3: ajv@^6.12.3:
version "6.12.4" version "6.12.4"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
@ -474,6 +484,11 @@ at-least-node@^1.0.0:
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
atomically@^1.3.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe"
integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==
author-regex@^1.0.0: author-regex@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450"
@ -763,6 +778,22 @@ concat-stream@^1.6.2:
readable-stream "^2.2.2" readable-stream "^2.2.2"
typedarray "^0.0.6" typedarray "^0.0.6"
conf@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/conf/-/conf-7.1.2.tgz#d9678a9d8f04de8bf5cd475105da8fdae49c2ec4"
integrity sha512-r8/HEoWPFn4CztjhMJaWNAe5n+gPUCSaJ0oufbqDLFKsA1V8JjAG7G+p0pgoDFAws9Bpk2VtVLLXqOBA7WxLeg==
dependencies:
ajv "^6.12.2"
atomically "^1.3.1"
debounce-fn "^4.0.0"
dot-prop "^5.2.0"
env-paths "^2.2.0"
json-schema-typed "^7.0.3"
make-dir "^3.1.0"
onetime "^5.1.0"
pkg-up "^3.1.0"
semver "^7.3.2"
config-chain@^1.1.11: config-chain@^1.1.11:
version "1.1.12" version "1.1.12"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
@ -858,6 +889,13 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0" whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0" whatwg-url "^8.0.0"
debounce-fn@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7"
integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==
dependencies:
mimic-fn "^3.0.0"
debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.8, debug@^2.6.9: debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.8, debug@^2.6.9:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -947,6 +985,13 @@ domexception@^2.0.1:
dependencies: dependencies:
webidl-conversions "^5.0.0" webidl-conversions "^5.0.0"
dot-prop@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
dependencies:
is-obj "^2.0.0"
duplexer3@^0.1.4: duplexer3@^0.1.4:
version "0.1.4" version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
@ -1069,6 +1114,14 @@ electron-squirrel-startup@^1.0.0:
dependencies: dependencies:
debug "^2.2.0" debug "^2.2.0"
electron-store@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-6.0.1.tgz#2178b9dc37aeb749d99cf9d1d1bc090890b922dc"
integrity sha512-8rdM0XEmDGsLuZM2oRABzsLX+XmD5x3rwxPMEPv0MrN9/BWanyy3ilb2v+tCrKtIZVF3MxUiZ9Bfqe8e0popKQ==
dependencies:
conf "^7.1.2"
type-fest "^0.16.0"
electron-winstaller@^4.0.0: electron-winstaller@^4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/electron-winstaller/-/electron-winstaller-4.0.1.tgz#69da2a439a6986210c3106305f921a522369207d" resolved "https://registry.yarnpkg.com/electron-winstaller/-/electron-winstaller-4.0.1.tgz#69da2a439a6986210c3106305f921a522369207d"
@ -1696,6 +1749,11 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
is-potential-custom-element-name@^1.0.0: is-potential-custom-element-name@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
@ -1807,6 +1865,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
json-schema-typed@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9"
integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==
json-schema@0.2.3: json-schema@0.2.3:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
@ -1986,6 +2049,13 @@ lowercase-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
map-age-cleaner@^0.1.1: map-age-cleaner@^0.1.1:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
@ -2052,6 +2122,11 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-fn@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74"
integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==
mimic-response@^1.0.0, mimic-response@^1.0.1: mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
@ -2502,6 +2577,13 @@ pkg-dir@^4.2.0:
dependencies: dependencies:
find-up "^4.0.0" find-up "^4.0.0"
pkg-up@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
dependencies:
find-up "^3.0.0"
plist@^3.0.0, plist@^3.0.1: plist@^3.0.0, plist@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c"
@ -2840,6 +2922,11 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.0.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2:
version "7.3.2" version "7.3.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
@ -3274,6 +3361,11 @@ type-fest@^0.13.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
type-fest@^0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
typedarray@^0.0.6: typedarray@^0.0.6:
version "0.0.6" version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"