From 2dfd09a7b10a6caf82ca7b8a7b1f0dc3ceeebad7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 31 Mar 2022 10:22:13 +1100 Subject: [PATCH] app kind of start background side --- .nvmrc | 2 +- Gruntfile.js | 29 +- package.json | 20 +- patches/bunyan+1.8.15.patch | 14 + patches/bytebuffer+5.0.1.patch | 13 + patches/component-classes+1.2.6.patch | 13 + patches/config+1.28.1.patch | 162 +++++++++ ts/attachments/attachments.ts | 5 +- .../dialog/SessionPasswordDialog.tsx | 7 +- ts/components/dialog/SessionSeedModal.tsx | 4 +- ts/components/settings/SessionSettings.tsx | 4 +- ts/hooks/useAppFocused.ts | 10 +- ts/mains/main_node.ts | 43 +-- ts/mains/main_renderer.ts | 6 +- ts/node/attachment_channel.ts | 14 +- ts/node/config.ts | 2 +- ts/node/global_errors.ts | 6 +- ts/node/local_attachments_encrypter.ts | 31 ++ ts/node/permissions.ts | 2 +- ts/node/protocol_filter.ts | 3 +- ts/node/spell_check.ts | 3 +- ts/node/sql.ts | 19 +- ts/node/sql_channel.ts | 15 +- ts/node/tray_icon.ts | 3 +- ts/session/apis/seed_node_api/SeedNodeAPI.ts | 11 +- ts/session/utils/WindowUtils.ts | 6 +- .../unit/crypto/MessageEncrypter_test.ts | 6 - ts/test/session/unit/utils/Password_test.ts | 2 +- ts/types/Attachment.ts | 22 +- ts/types/MessageAttachment.ts | 8 +- ts/util/index.ts | 2 - tsconfig.json | 2 +- webpack.config.js | 98 ++++-- yarn.lock | 324 +++++++++++------- 34 files changed, 638 insertions(+), 273 deletions(-) create mode 100644 patches/bunyan+1.8.15.patch create mode 100644 patches/bytebuffer+5.0.1.patch create mode 100644 patches/component-classes+1.2.6.patch create mode 100644 patches/config+1.28.1.patch create mode 100644 ts/node/local_attachments_encrypter.ts diff --git a/.nvmrc b/.nvmrc index 2a0dc9a81..58a4133d9 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.16.0 +16.13.0 diff --git a/Gruntfile.js b/Gruntfile.js index d26ae2ce8..fc25f6ad5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -7,16 +7,15 @@ const toConcatForApp = [ 'node_modules/jquery/dist/jquery.js', 'node_modules/bytebuffer/dist/bytebuffer.min.js', 'node_modules/long/dist/long.js', - 'components/protobuf/**/*.js', 'node_modules/mustache/mustache.js', 'node_modules/underscore/underscore-min.js', 'node_modules/backbone/backbone.js', ]; -const toConcatForComponentTextsecure = [ - 'node_modules/long/dist/long.js', - 'components/protobuf/**/*.js', -]; +// const toConcatForComponentTextsecure = [ +// 'node_modules/long/dist/long.js', +// 'components/protobuf/**/*.js', +// ]; module.exports = grunt => { const components = []; @@ -25,11 +24,11 @@ module.exports = grunt => { components.push(toConcatForApp[i]); } - const libtextsecurecomponents = []; - // eslint-disable-next-line guard-for-in, no-restricted-syntax - for (const i in toConcatForComponentTextsecure) { - libtextsecurecomponents.push(toConcatForComponentTextsecure[i]); - } + // const libtextsecurecomponents = []; + // // eslint-disable-next-line guard-for-in, no-restricted-syntax + // for (const i in toConcatForComponentTextsecure) { + // libtextsecurecomponents.push(toConcatForComponentTextsecure[i]); + // } const utilWorkerComponents = [ 'node_modules/bytebuffer/dist/bytebuffer.js', @@ -54,16 +53,16 @@ module.exports = grunt => { src: utilWorkerComponents, dest: 'js/util_worker.js', }, - libtextsecurecomponents: { - src: libtextsecurecomponents, - dest: 'libtextsecure/components.js', - }, + // libtextsecurecomponents: { + // src: libtextsecurecomponents, + // dest: 'libtextsecure/components.js', + // }, libtextsecure: { options: { banner: ';(function() {\n', footer: '})();\n', }, - src: ['libtextsecure/errors.js', 'libtextsecure/libsignal-protocol.js'], + src: ['libtextsecure/libsignal-protocol.js'], dest: 'js/libtextsecure.js', }, }, diff --git a/package.json b/package.json index 7b6ed2eaf..3c3f428dd 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "type": "git", "url": "https://github.com/oxen-io/session-desktop.git" }, - "main": "main.js", + "main": "dist/electron_main.js", "scripts": { - "postinstall": "electron-builder install-app-deps && rimraf node_modules/dtrace-provider", + "postinstall": "yarn patch-package && yarn electron-builder install-app-deps", "start-prod": "cross-env NODE_ENV=production NODE_APP_INSTANCE=devprod$MULTI electron .", "grunt": "yarn clean-transpile && grunt", "generate": "yarn grunt --force", @@ -41,19 +41,19 @@ "sedtoAppImage": "sed -i 's/\"target\": \\[\"deb\", \"rpm\", \"freebsd\"\\]/\"target\": \"AppImage\"/g' package.json", "sedtoDeb": "sed -i 's/\"target\": \"AppImage\"/\"target\": \\[\"deb\", \"rpm\", \"freebsd\"\\]/g' package.json", "build:webpack": "webpack --config ./webpack.config.js", - "start:webpack": "yarn build && electron ./dist/electron.js" + "start:webpack": "yarn build && electron ./dist/electron_main.js" }, "dependencies": { "@reduxjs/toolkit": "^1.4.0", "abort-controller": "3.0.0", "auto-bind": "^4.0.0", "backbone": "1.3.3", - "better-sqlite3": "https://github.com/signalapp/better-sqlite3#ad0db5dd09c0ea4007b1c46bd4f7273827803347", + "better-sqlite3": "https://github.com/signalapp/better-sqlite3#4f66ee7b85477016dd0b2c3d2f13dcb60abd452e", "blob-util": "2.0.2", "blueimp-canvas-to-blob": "^3.29.0", "blueimp-load-image": "5.14.0", "buffer-crc32": "0.2.13", - "bunyan": "1.8.12", + "bunyan": "^1.8.15", "bytebuffer": "^5.0.1", "classnames": "2.2.5", "color": "^3.1.2", @@ -116,7 +116,7 @@ "devDependencies": { "@playwright/test": "^1.16.3", "@types/backbone": "^1.4.2", - "@types/better-sqlite3": "5.4.1", + "@types/better-sqlite3": "7.4.0", "@types/blueimp-load-image": "5.14.4", "@types/buffer-crc32": "^0.2.0", "@types/bunyan": "^1.8.8", @@ -159,7 +159,7 @@ "chai-as-promised": "^7.1.1", "chai-bytes": "^0.1.2", "cross-env": "^6.0.3", - "electron": "^13.6.2", + "electron": "^17.1.2", "electron-builder": "22.8.0", "electron-notarize": "^0.2.0", "eslint": "4.14.0", @@ -179,13 +179,17 @@ "html-webpack-plugin": "^5.5.0", "mocha": "4.1.0", "mocha-testcheck": "1.0.0-rc.0", + "node-bindings-loader": "^1.5.0", "node-gyp": "3.8.0", + "node-loader": "^2.0.0", "node-sass-import-once": "1.2.0", + "patch-package": "^6.4.7", "playwright": "^1.16.3", "postinstall-prepare": "^1.0.1", "prettier": "1.19.0", "run-script-os": "^1.1.6", "sinon": "9.0.2", + "terser-webpack-plugin": "^5.3.1", "ts-loader": "^9.2.8", "ts-mock-imports": "^1.3.0", "tslint": "5.19.0", @@ -196,7 +200,7 @@ "webpack-cli": "^4.9.2" }, "engines": { - "node": "^14.16.0" + "node": "16.13.0" }, "build": { "appId": "com.loki-project.messenger-desktop", diff --git a/patches/bunyan+1.8.15.patch b/patches/bunyan+1.8.15.patch new file mode 100644 index 000000000..c3c90f73c --- /dev/null +++ b/patches/bunyan+1.8.15.patch @@ -0,0 +1,14 @@ +diff --git a/node_modules/bunyan/lib/bunyan.js b/node_modules/bunyan/lib/bunyan.js +index f988560..11af013 100644 +--- a/node_modules/bunyan/lib/bunyan.js ++++ b/node_modules/bunyan/lib/bunyan.js +@@ -76,7 +76,8 @@ if (runtimeEnv === 'browser') { + os = require('os'); + fs = require('fs'); + try { +- dtrace = require('dtrace-provider' + ''); ++ throw new Error('dtrace-provider is not available') ++ // dtrace = require('dtrace-provider' + ''); + } catch (e) { + dtrace = null; + } diff --git a/patches/bytebuffer+5.0.1.patch b/patches/bytebuffer+5.0.1.patch new file mode 100644 index 000000000..5e9e2671f --- /dev/null +++ b/patches/bytebuffer+5.0.1.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/bytebuffer/dist/bytebuffer-node.js b/node_modules/bytebuffer/dist/bytebuffer-node.js +index 93a7c46..11fed8c 100644 +--- a/node_modules/bytebuffer/dist/bytebuffer-node.js ++++ b/node_modules/bytebuffer/dist/bytebuffer-node.js +@@ -26,7 +26,7 @@ module.exports = (function() { + var buffer = require("buffer"), + Buffer = buffer["Buffer"], + Long = require("long"), +- memcpy = null; try { memcpy = require("memcpy"); } catch (e) {} ++ memcpy = null; // try { memcpy = require("memcpy"); } catch (e) {} + + /** + * Constructs a new ByteBuffer. diff --git a/patches/component-classes+1.2.6.patch b/patches/component-classes+1.2.6.patch new file mode 100644 index 000000000..23db4f91e --- /dev/null +++ b/patches/component-classes+1.2.6.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/component-classes/index.js b/node_modules/component-classes/index.js +index eb9d292..752ebf2 100644 +--- a/node_modules/component-classes/index.js ++++ b/node_modules/component-classes/index.js +@@ -3,7 +3,7 @@ + */ + + try { +- var index = require('indexof'); ++ // var index = require('indexof'); + } catch (err) { + var index = require('component-indexof'); + } diff --git a/patches/config+1.28.1.patch b/patches/config+1.28.1.patch new file mode 100644 index 000000000..b083f994a --- /dev/null +++ b/patches/config+1.28.1.patch @@ -0,0 +1,162 @@ +index a7651ef..9f29cc7 100644 +--- a/node_modules/config/lib/config.js ++++ b/node_modules/config/lib/config.js +@@ -870,59 +870,8 @@ util.parseFile = function(fullFilename) { + } + } + +- if (extension === 'js') { +- // Use the built-in parser for .js files +- configObject = require(fullFilename); +- } +- else if (extension === 'ts') { +- require('ts-node').register({ +- lazy: true, +- compilerOptions: { +- allowJs: true, +- } +- }); +- +- // Because of ES6 modules usage, `default` is treated as named export (like any other) +- // Therefore config is a value of `default` key. +- configObject = require(fullFilename).default; +- } +- else if (extension === 'coffee') { +- // .coffee files can be loaded with either coffee-script or iced-coffee-script. +- // Prefer iced-coffee-script, if it exists. +- // Lazy load the appropriate extension +- if (!Coffee) { +- Coffee = {}; +- +- // The following enables iced-coffee-script on .coffee files, if iced-coffee-script is available. +- // This is commented as per a decision on a pull request. +- //try { +- // Coffee = require("iced-coffee-script"); +- //} +- //catch (e) { +- // Coffee = require("coffee-script"); +- //} +- +- Coffee = require("coffee-script"); +- +- // coffee-script >= 1.7.0 requires explicit registration for require() to work +- if (Coffee.register) { +- Coffee.register(); +- } +- } +- // Use the built-in parser for .coffee files with coffee-script +- configObject = require(fullFilename); +- } +- else if (extension === 'iced') { +- Iced = require("iced-coffee-script"); +- +- // coffee-script >= 1.7.0 requires explicit registration for require() to work +- if (Iced.register) { +- Iced.register(); +- } +- } +- else { + configObject = util.parseString(fileContent, extension); +- } ++ + } + catch (e3) { + if (gitCryptTestRegex.test(fileContent)) { +@@ -974,36 +923,7 @@ util.parseString = function (content, format) { + var configObject = null; + + // Parse the file based on extension +- if (format === 'yaml' || format === 'yml') { +- if (!Yaml && !VisionmediaYaml) { +- // Lazy loading +- try { +- // Try to load the better js-yaml module +- Yaml = require('js-yaml'); +- } +- catch (e) { +- try { +- // If it doesn't exist, load the fallback visionmedia yaml module. +- VisionmediaYaml = require('yaml'); +- } +- catch (e) { } +- } +- } +- +- if (Yaml) { +- configObject = Yaml.load(content); +- } +- else if (VisionmediaYaml) { +- // The yaml library doesn't like strings that have newlines but don't +- // end in a newline: https://github.com/visionmedia/js-yaml/issues/issue/13 +- content += '\n'; +- configObject = VisionmediaYaml.eval(util.stripYamlComments(content)); +- } +- else { +- console.error("No YAML parser loaded. Suggest adding js-yaml dependency to your package.json file.") +- } +- } +- else if (format === 'json') { ++ if (format === 'json') { + try { + configObject = JSON.parse(content); + } +@@ -1021,59 +941,6 @@ util.parseString = function (content, format) { + configObject = JSON5.parse(content); + } + } +- else if (format === 'json5') { +- +- if (!JSON5) { +- JSON5 = require('json5'); +- } +- +- configObject = JSON5.parse(content); +- +- } else if (format === 'hjson') { +- +- if (!HJSON) { +- HJSON = require('hjson'); +- } +- +- configObject = HJSON.parse(content); +- +- } else if (format === 'toml') { +- +- if(!TOML) { +- TOML = require('toml'); +- } +- +- configObject = TOML.parse(content); +- } +- else if (format === 'cson') { +- if (!CSON) { +- CSON = require('cson'); +- } +- // Allow comments in CSON files +- if (typeof CSON.parseSync === 'function') { +- configObject = CSON.parseSync(util.stripComments(content)); +- } else { +- configObject = CSON.parse(util.stripComments(content)); +- } +- } +- else if (format === 'properties') { +- if (!PPARSER) { +- PPARSER = require('properties'); +- } +- configObject = PPARSER.parse(content, { namespaces: true, variables: true, sections: true }); +- } else if (format === 'xml') { +- +- if (!XML) { +- XML = require('x2js'); +- } +- +- var x2js = new XML(); +- configObject = x2js.xml2js(content); +- var rootKeys = Object.keys(configObject); +- if(rootKeys.length == 1) { +- configObject = configObject[rootKeys[0]]; +- } +- } + + return configObject; + }; diff --git a/ts/attachments/attachments.ts b/ts/attachments/attachments.ts index b8fda937f..6fc7f5cb1 100644 --- a/ts/attachments/attachments.ts +++ b/ts/attachments/attachments.ts @@ -5,7 +5,10 @@ import pify from 'pify'; import { default as glob } from 'glob'; import fse from 'fs-extra'; import { isArrayBuffer, isString, map } from 'lodash'; -import { decryptAttachmentBuffer, encryptAttachmentBuffer } from '../../ts/types/Attachment'; +import { + decryptAttachmentBuffer, + encryptAttachmentBuffer, +} from '../node/local_attachments_encrypter'; const PATH = 'attachments.noindex'; diff --git a/ts/components/dialog/SessionPasswordDialog.tsx b/ts/components/dialog/SessionPasswordDialog.tsx index e492fe52c..6f4230288 100644 --- a/ts/components/dialog/SessionPasswordDialog.tsx +++ b/ts/components/dialog/SessionPasswordDialog.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { missingCaseError, PasswordUtil } from '../../util'; +import { missingCaseError } from '../../util'; import { ToastUtils } from '../../session/utils'; import { getPasswordHash } from '../../data/data'; import { SpacerLG, SpacerSM } from '../basic/Text'; @@ -9,6 +9,7 @@ import { sessionPassword } from '../../state/ducks/modalDialog'; import { LocalizerKeys } from '../../types/LocalizerKeys'; import { SessionButton, SessionButtonColor } from '../basic/SessionButton'; import { SessionWrapperModal } from '../SessionWrapperModal'; +import { matchesHash, validatePassword } from '../../util/passwordUtils'; export type PasswordAction = 'set' | 'change' | 'remove'; @@ -118,7 +119,7 @@ export class SessionPasswordDialog extends React.Component { public async validatePasswordHash(password: string | null) { // Check if the password matches the hash we have stored const hash = await getPasswordHash(); - if (hash && !PasswordUtil.matchesHash(password, hash)) { + if (hash && !matchesHash(password, hash)) { return false; } @@ -146,7 +147,7 @@ export class SessionPasswordDialog extends React.Component { */ private validatePassword(firstPassword: string) { // if user did not fill the first password field, we can't do anything - const errorFirstInput = PasswordUtil.validatePassword(firstPassword); + const errorFirstInput = validatePassword(firstPassword); if (errorFirstInput !== null) { this.setState({ error: errorFirstInput, diff --git a/ts/components/dialog/SessionSeedModal.tsx b/ts/components/dialog/SessionSeedModal.tsx index c24c66373..3f5e0d34d 100644 --- a/ts/components/dialog/SessionSeedModal.tsx +++ b/ts/components/dialog/SessionSeedModal.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { ToastUtils } from '../../session/utils'; -import { PasswordUtil } from '../../util'; +import { matchesHash } from '../../util/passwordUtils'; import { getPasswordHash } from '../../data/data'; import { QRCode } from 'react-qr-svg'; import { mn_decode } from '../../session/crypto/mnemonic'; @@ -27,7 +27,7 @@ const Password = (props: PasswordProps) => { const confirmPassword = () => { const passwordValue = jQuery('#seed-input-password').val(); - const isPasswordValid = PasswordUtil.matchesHash(passwordValue as string, passwordHash); + const isPasswordValid = matchesHash(passwordValue as string, passwordHash); if (!passwordValue) { setError('noGivenPassword'); diff --git a/ts/components/settings/SessionSettings.tsx b/ts/components/settings/SessionSettings.tsx index 334ace1a0..6d5ab055a 100644 --- a/ts/components/settings/SessionSettings.tsx +++ b/ts/components/settings/SessionSettings.tsx @@ -12,7 +12,7 @@ import { SettingsCategoryAppearance } from './section/CategoryAppearance'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton'; import { getPasswordHash } from '../../data/data'; import { LocalizerKeys } from '../../types/LocalizerKeys'; -import { PasswordUtil } from '../../util'; +import { matchesHash } from '../../util/passwordUtils'; export function getMediaPermissionsSettings() { return window.getSettingValue('media-permissions'); @@ -161,7 +161,7 @@ export class SessionSettingsView extends React.Component { - remote.app.on('browser-window-focus', onFocusCallback); - remote.app.on('browser-window-blur', onBlurCallback); + app.on('browser-window-focus', onFocusCallback); + app.on('browser-window-blur', onBlurCallback); return () => { - remote.app.removeListener('browser-window-blur', onBlurCallback); - remote.app.removeListener('browser-window-focus', onFocusCallback); + app.removeListener('browser-window-blur', onBlurCallback); + app.removeListener('browser-window-focus', onFocusCallback); }; }); diff --git a/ts/mains/main_node.ts b/ts/mains/main_node.ts index 61823955c..afdc17254 100644 --- a/ts/mains/main_node.ts +++ b/ts/mains/main_node.ts @@ -19,9 +19,12 @@ import crypto from 'crypto'; import _ from 'lodash'; import pify from 'pify'; -import { setup as setupSpellChecker } from '../node/spell_check'; -import packageJson from '../../package.json'; -import { setupGlobalErrorHandler } from '../node/global_errors'; +import Logger from 'bunyan'; + +import { setup as setupSpellChecker } from '../node/spell_check'; // checked - only node +import { setupGlobalErrorHandler } from '../node/global_errors'; // checked - only node + +import packageJson from '../../package.json'; // checked - only node setupGlobalErrorHandler(); import electronLocalshortcut from 'electron-localshortcut'; @@ -51,12 +54,12 @@ let readyForShutdown: boolean = false; // Tray icon and related objects let tray: any = null; -import { config } from '../node/config'; +import { config } from '../node/config'; // checked - only node // Very important to put before the single instance check, since it is based on the // userData directory. -import { userConfig } from '../node/config/user_config'; -import * as passwordUtil from '../util/passwordUtils'; +import { userConfig } from '../node/config/user_config'; // checked - only node +import * as PasswordUtil from '../util/passwordUtils'; // checked - only node const development = (config as any).environment === 'development'; const appInstance = config.util.getEnv('NODE_APP_INSTANCE') || 0; @@ -65,18 +68,17 @@ const appInstance = config.util.getEnv('NODE_APP_INSTANCE') || 0; // data directory has been set. import { initAttachmentsChannel } from '../node/attachment_channel'; -import * as updater from '../updater/index'; +import * as updater from '../updater/index'; // checked - only node -import { createTrayIcon } from '../node/tray_icon'; -import { ephemeralConfig } from '../node/config/ephemeral_config'; -import { getLogger, initializeLogger } from '../node/logging'; -import { sqlNode } from '../node/sql'; -import * as sqlChannels from '../node/sql_channel'; -import { windowMarkShouldQuit, windowShouldQuit } from '../node/window_state'; -import { createTemplate } from '../node/menu'; -import { installFileHandler, installWebHandler } from '../node/protocol_filter'; -import { installPermissionsHandler } from '../node/permissions'; -import Logger from 'bunyan'; +import { createTrayIcon } from '../node/tray_icon'; // checked - only node +import { ephemeralConfig } from '../node/config/ephemeral_config'; // checked - only node +import { getLogger, initializeLogger } from '../node/logging'; // checked - only node +import { sqlNode } from '../node/sql'; // checked - only node +import * as sqlChannels from '../node/sql_channel'; // checked - only node +import { windowMarkShouldQuit, windowShouldQuit } from '../node/window_state'; // checked - only node +import { createTemplate } from '../node/menu'; // checked - only node +import { installFileHandler, installWebHandler } from '../node/protocol_filter'; // checked - only node +import { installPermissionsHandler } from '../node/permissions'; // checked - only node let appStartInitialSpellcheckSetting = true; @@ -244,6 +246,7 @@ function getStartInTray() { // tslint:disable-next-line: max-func-body-length async function createWindow() { const { minWidth, minHeight, width, height } = getWindowSize(); + windowConfig = windowConfig || {}; const picked = { maximized: (windowConfig as any).maximized || false, autoHideMenuBar: (windowConfig as any).autoHideMenuBar || false, @@ -364,7 +367,7 @@ async function createWindow() { } }); - await mainWindow.loadURL(prepareURL([__dirname, 'background.html'])); + await mainWindow.loadURL(prepareURL([__dirname, '../background.html'])); if ((process.env.NODE_APP_INSTANCE || '').startsWith('devprod')) { // Open the DevTools. @@ -914,7 +917,7 @@ ipc.on('set-password', async (event, passPhrase, oldPhrase) => { // Check if the hash we have stored matches the hash of the old passphrase. const hash = sqlNode.getPasswordHash(); - const hashMatches = oldPhrase && passwordUtil.matchesHash(oldPhrase, hash); + const hashMatches = oldPhrase && PasswordUtil.matchesHash(oldPhrase, hash); if (hash && !hashMatches) { const incorrectOldPassword = locale.messages.invalidOldPassword; sendResponse( @@ -930,7 +933,7 @@ ipc.on('set-password', async (event, passPhrase, oldPhrase) => { userConfig.set('dbHasPassword', false); } else { sqlNode.setSQLPassword(passPhrase); - const newHash = passwordUtil.generateHash(passPhrase); + const newHash = PasswordUtil.generateHash(passPhrase); sqlNode.savePasswordHash(newHash); userConfig.set('dbHasPassword', true); } diff --git a/ts/mains/main_renderer.ts b/ts/mains/main_renderer.ts index 9e53481eb..25edd0064 100644 --- a/ts/mains/main_renderer.ts +++ b/ts/mains/main_renderer.ts @@ -3,7 +3,7 @@ import { MessageModel } from '../models/message'; import { isMacOS } from '../OS'; import { queueAllCached } from '../receiver/receiver'; import { getConversationController } from '../session/conversations'; -import { AttachmentDownloads } from '../session/utils'; +import { AttachmentDownloads, ToastUtils } from '../session/utils'; import { getOurPubKeyStrFromCache } from '../session/utils/User'; import { BlockedNumberController } from '../util'; import { ExpirationTimerOptions } from '../util/expiringMessages'; @@ -166,7 +166,7 @@ Storage.onready(async () => { window.Events.setThemeSetting(newThemeSetting); try { - AttachmentDownloads.initAttachmentPaths(); + await AttachmentDownloads.initAttachmentPaths(); await Promise.all([getConversationController().load(), BlockedNumberController.load()]); } catch (error) { @@ -280,7 +280,7 @@ async function start() { // if not undefined, we take the opposite const newValue = currentValue !== undefined ? !currentValue : false; window.Events.setSpellCheck(newValue); - window.libsession.Utils.ToastUtils.pushRestartNeeded(); + ToastUtils.pushRestartNeeded(); }; window.toggleMediaPermissions = async () => { diff --git a/ts/node/attachment_channel.ts b/ts/node/attachment_channel.ts index e809cc634..b6b6e6ab5 100644 --- a/ts/node/attachment_channel.ts +++ b/ts/node/attachment_channel.ts @@ -1,19 +1,19 @@ import { ipcMain } from 'electron'; import rimraf from 'rimraf'; -import * as Attachments from '../attachments/attachments'; +import { deleteAll, ensureDirectory, getAllAttachments, getPath } from '../attachments/attachments'; // tslint:disable: no-console -import { sqlNode } from './sql'; +import { sqlNode } from './sql'; // checked - only node let initialized = false; const ERASE_ATTACHMENTS_KEY = 'erase-attachments'; const CLEANUP_ORPHANED_ATTACHMENTS_KEY = 'cleanup-orphaned-attachments'; -export async function cleanupOrphanedAttachments(userDataPath: string) { - const allAttachments = await Attachments.getAllAttachments(userDataPath); +async function cleanupOrphanedAttachments(userDataPath: string) { + const allAttachments = await getAllAttachments(userDataPath); const orphanedAttachments = sqlNode.removeKnownAttachments(allAttachments); //sql.js - await Attachments.deleteAll({ + await deleteAll({ userDataPath, attachments: orphanedAttachments, }); @@ -26,9 +26,9 @@ export async function initAttachmentsChannel({ userDataPath }: { userDataPath: s initialized = true; console.log('Ensure attachments directory exists'); - await Attachments.ensureDirectory(userDataPath); + await ensureDirectory(userDataPath); - const attachmentsDir = Attachments.getPath(userDataPath); + const attachmentsDir = getPath(userDataPath); ipcMain.on(ERASE_ATTACHMENTS_KEY, event => { try { diff --git a/ts/node/config.ts b/ts/node/config.ts index b1ed7004f..0936dcc3e 100644 --- a/ts/node/config.ts +++ b/ts/node/config.ts @@ -37,7 +37,7 @@ import c from 'config'; // Log resulting env vars in use by config ['NODE_ENV', 'NODE_APP_INSTANCE', 'NODE_CONFIG_DIR', 'NODE_CONFIG'].forEach(s => { - console.log(`${s} ${config.util.getEnv(s)}`); + console.log(`${s} ${c.util.getEnv(s)}`); }); export const config = c; diff --git a/ts/node/global_errors.ts b/ts/node/global_errors.ts index c2afcc31e..08ab2a2c3 100644 --- a/ts/node/global_errors.ts +++ b/ts/node/global_errors.ts @@ -1,7 +1,7 @@ import { app, clipboard, dialog } from 'electron'; -import { redactAll } from '../util/privacy'; -import { LocaleMessagesType } from './locale'; -import { ConsoleCustom } from './logging'; +import { redactAll } from '../util/privacy'; // checked - only node +import { LocaleMessagesType } from './locale'; // checked - only node +import { ConsoleCustom } from './logging'; // checked - only node // tslint:disable: no-console // We use hard-coded strings until we're able to update these strings from the locale. diff --git a/ts/node/local_attachments_encrypter.ts b/ts/node/local_attachments_encrypter.ts new file mode 100644 index 000000000..8f1511d75 --- /dev/null +++ b/ts/node/local_attachments_encrypter.ts @@ -0,0 +1,31 @@ +import { isArrayBuffer } from 'lodash'; +import { fromHexToArray } from '../session/utils/String'; +import { sqlNode } from './sql'; + +export const encryptAttachmentBuffer = async (bufferIn: ArrayBuffer) => { + if (!isArrayBuffer(bufferIn)) { + throw new TypeError("'bufferIn' must be an array buffer"); + } + const key = sqlNode.getItemById('local_attachment_encrypted_key')?.value as string | undefined; + if (!key) { + throw new TypeError( + "'encryptAttachmentBuffer' needs a key set in local_attachment_encrypted_key" + ); + } + const encryptingKey = fromHexToArray(key); + return window.callWorker('encryptAttachmentBuffer', encryptingKey, bufferIn); +}; + +export const decryptAttachmentBuffer = async (bufferIn: ArrayBuffer): Promise => { + if (!isArrayBuffer(bufferIn)) { + throw new TypeError("'bufferIn' must be an array buffer"); + } + const key = sqlNode.getItemById('local_attachment_encrypted_key')?.value as string; + if (!key) { + throw new TypeError( + "'decryptAttachmentBuffer' needs a key set in local_attachment_encrypted_key" + ); + } + const encryptingKey = fromHexToArray(key); + return window.callWorker('decryptAttachmentBuffer', encryptingKey, bufferIn); +}; diff --git a/ts/node/permissions.ts b/ts/node/permissions.ts index 64dd61267..74b0ac129 100644 --- a/ts/node/permissions.ts +++ b/ts/node/permissions.ts @@ -3,7 +3,7 @@ // tslint:disable: no-console import { UserConfig } from './config/user_config'; -import { session } from 'electron/main'; +import { session } from 'electron'; const PERMISSIONS: Record = { // Allowed diff --git a/ts/node/protocol_filter.ts b/ts/node/protocol_filter.ts index b7af1ef6a..842ed12fd 100644 --- a/ts/node/protocol_filter.ts +++ b/ts/node/protocol_filter.ts @@ -1,7 +1,6 @@ import path from 'path'; import fs from 'fs'; -import { Protocol } from 'electron'; -import { ProtocolRequest } from 'electron/main'; +import { Protocol, ProtocolRequest } from 'electron'; // tslint:disable: no-console function eliminateAllAfterCharacter(str: string, character: string) { diff --git a/ts/node/spell_check.ts b/ts/node/spell_check.ts index 6fa6d37fe..352ddb6bf 100644 --- a/ts/node/spell_check.ts +++ b/ts/node/spell_check.ts @@ -1,7 +1,6 @@ // tslint:disable: no-console -import { Menu } from 'electron'; -import { BrowserWindow } from 'electron/main'; +import { BrowserWindow, Menu } from 'electron'; import { osLocaleSync } from 'os-locale'; export const setup = (browserWindow: BrowserWindow, messages: any) => { diff --git a/ts/node/sql.ts b/ts/node/sql.ts index 961d32bcc..e37ab0c07 100644 --- a/ts/node/sql.ts +++ b/ts/node/sql.ts @@ -16,15 +16,20 @@ import { map, uniq, } from 'lodash'; -import { redactAll } from '../util/privacy'; -import { LocaleMessagesType } from './locale'; -import { PubKey } from '../session/types'; -import { StorageItem } from './storage_item'; +import { redactAll } from '../util/privacy'; // checked - only node +import { LocaleMessagesType } from './locale'; // checked - only node +import { PubKey } from '../session/types/PubKey'; // checked - only node +import { StorageItem } from './storage_item'; // checked - only node // tslint:disable: no-console // tslint:disable: non-literal-fs-path // tslint:disable: one-variable-per-declaration // tslint:disable: quotemark +const openDbOptions = { + verbose: undefined, + nativeBinding: './node_modules/better-sqlite3/build/Release/better_sqlite3.node', +}; + const CONVERSATIONS_TABLE = 'conversations'; const MESSAGES_TABLE = 'messages'; const MESSAGES_FTS_TABLE = 'messages_fts'; @@ -134,7 +139,7 @@ function openAndMigrateDatabase(filePath: string, key: string) { // First, we try to open the database without any cipher changes try { - db = new BetterSqlite3.default(filePath, { verbose: undefined }); + db = new BetterSqlite3.default(filePath, openDbOptions); keyDatabase(db, key); switchToWAL(db); @@ -154,7 +159,7 @@ function openAndMigrateDatabase(filePath: string, key: string) { let db1; try { - db1 = new BetterSqlite3.default(filePath, { verbose: undefined }); + db1 = new BetterSqlite3.default(filePath, openDbOptions); keyDatabase(db1, key); // https://www.zetetic.net/blog/2018/11/30/sqlcipher-400-release/#compatability-sqlcipher-4-0-0 @@ -172,7 +177,7 @@ function openAndMigrateDatabase(filePath: string, key: string) { // migrate to the latest ciphers after we've modified the defaults. let db2; try { - db2 = new BetterSqlite3.default(filePath, { verbose: undefined }); + db2 = new BetterSqlite3.default(filePath, openDbOptions); keyDatabase(db2, key); db2.pragma('cipher_migrate'); diff --git a/ts/node/sql_channel.ts b/ts/node/sql_channel.ts index 66182fe66..e812edcd1 100644 --- a/ts/node/sql_channel.ts +++ b/ts/node/sql_channel.ts @@ -1,7 +1,7 @@ -import { ipcMain } from 'electron'; -import { sqlNode } from './sql'; -import { userConfig } from './config/user_config'; -import { ephemeralConfig } from './config/ephemeral_config'; +import { app, ipcMain } from 'electron'; +import { sqlNode } from './sql'; // checked - only node +import { userConfig } from './config/user_config'; // checked - only node +import { ephemeralConfig } from './config/ephemeral_config'; // checked - only node let initialized = false; @@ -42,4 +42,11 @@ export function initialize() { event.sender.send(`${ERASE_SQL_KEY}-done`, error); } }); + + ipcMain.on('get-user-data-path', () => { + return app.getPath('userData'); + }); + ipcMain.on('get-data-path', () => { + return app.getAppPath(); + }); } diff --git a/ts/node/tray_icon.ts b/ts/node/tray_icon.ts index 219860fa0..1219641f5 100644 --- a/ts/node/tray_icon.ts +++ b/ts/node/tray_icon.ts @@ -1,7 +1,6 @@ import path from 'path'; -import { app, Menu, Tray } from 'electron'; -import { BrowserWindow } from 'electron/main'; +import { app, BrowserWindow, Menu, Tray } from 'electron'; import { LocaleMessagesType } from './locale'; let trayContextMenu = null; diff --git a/ts/session/apis/seed_node_api/SeedNodeAPI.ts b/ts/session/apis/seed_node_api/SeedNodeAPI.ts index 6769a9866..e1d39473b 100644 --- a/ts/session/apis/seed_node_api/SeedNodeAPI.ts +++ b/ts/session/apis/seed_node_api/SeedNodeAPI.ts @@ -6,11 +6,11 @@ import _ from 'lodash'; import fs from 'fs'; import path from 'path'; import tls from 'tls'; -import { remote } from 'electron'; import { sha256 } from '../../crypto'; import * as Data from '../../../data/data'; import pRetry from 'p-retry'; import { SeedNodeAPI } from '.'; +import { ipcRenderer } from 'electron'; // tslint:disable: function-name @@ -57,7 +57,9 @@ export async function fetchSnodePoolFromSeedNodeWithRetries( } } -const getSslAgentForSeedNode = (seedNodeHost: string, isSsl = false) => { +let cachedAppPath: string | undefined; + +const getSslAgentForSeedNode = async (seedNodeHost: string, isSsl = false) => { let filePrefix = ''; let pubkey256 = ''; let cert256 = ''; @@ -92,7 +94,8 @@ const getSslAgentForSeedNode = (seedNodeHost: string, isSsl = false) => { } // tslint:disable: non-literal-fs-path // read the cert each time. We only run this request once for each seed node nevertheless. - const appPath = remote.app.getAppPath(); + const appPath = cachedAppPath || (await ipcRenderer.invoke('get-data-path')); + cachedAppPath = appPath; const crt = fs.readFileSync(path.join(appPath, `/certificates/${filePrefix}.crt`), 'utf-8'); const sslOptions = { // as the seed nodes are using a self signed certificate, we have to provide it here. @@ -244,7 +247,7 @@ async function getSnodesFromSeedUrl(urlObj: URL): Promise> { params, }; - const sslAgent = getSslAgentForSeedNode( + const sslAgent = await getSslAgentForSeedNode( urlObj.hostname, urlObj.protocol !== Constants.PROTOCOLS.HTTP ); diff --git a/ts/session/utils/WindowUtils.ts b/ts/session/utils/WindowUtils.ts index 95f6a0edf..23d807278 100644 --- a/ts/session/utils/WindowUtils.ts +++ b/ts/session/utils/WindowUtils.ts @@ -1,8 +1,8 @@ -import { remote } from 'electron'; +import { BrowserWindow } from 'electron'; export function isElectronWindowFocused() { - const [yourBrowserWindow] = remote.BrowserWindow.getAllWindows(); + const [yourBrowserWindow] = BrowserWindow.getAllWindows(); const isFocused = yourBrowserWindow?.isFocused() || false; - + // throw new Error('TOFIX'); return isFocused; } diff --git a/ts/test/session/unit/crypto/MessageEncrypter_test.ts b/ts/test/session/unit/crypto/MessageEncrypter_test.ts index 23c2a188e..2d2ee073c 100644 --- a/ts/test/session/unit/crypto/MessageEncrypter_test.ts +++ b/ts/test/session/unit/crypto/MessageEncrypter_test.ts @@ -98,12 +98,6 @@ describe('MessageEncrypter', () => { }; beforeEach(() => { - TestUtils.stubWindow('textsecure', { - storage: { - protocol: sandbox.stub(), - }, - }); - sandbox.stub(UserUtils, 'getOurPubKeyStrFromCache').returns(ourNumber); sandbox.stub(UserUtils, 'getUserED25519KeyPair').resolves(ourUserEd25516Keypair); }); diff --git a/ts/test/session/unit/utils/Password_test.ts b/ts/test/session/unit/utils/Password_test.ts index b1747b0d2..71da02c91 100644 --- a/ts/test/session/unit/utils/Password_test.ts +++ b/ts/test/session/unit/utils/Password_test.ts @@ -1,5 +1,5 @@ import { assert } from 'chai'; -import { PasswordUtil } from '../../../../util'; +import * as PasswordUtil from '../../../../util/passwordUtils'; describe('Password Util', () => { describe('hash generation', () => { diff --git a/ts/types/Attachment.ts b/ts/types/Attachment.ts index 59fe9f3d6..5335ce0f1 100644 --- a/ts/types/Attachment.ts +++ b/ts/types/Attachment.ts @@ -1,13 +1,11 @@ import moment from 'moment'; -import { isArrayBuffer, isUndefined, padStart } from 'lodash'; +import { isUndefined, padStart } from 'lodash'; import * as MIME from './MIME'; import { saveURLAsFile } from '../util/saveURLAsFile'; import { SignalService } from '../protobuf'; import { isImageTypeSupported, isVideoTypeSupported } from '../util/GoogleChrome'; -import { fromHexToArray } from '../session/utils/String'; import { ATTACHMENT_DEFAULT_MAX_SIDE } from '../util/attachmentsUtil'; -import { Storage } from '../util/storage'; const MAX_WIDTH = 200; const MAX_HEIGHT = MAX_WIDTH; @@ -392,21 +390,3 @@ export const getFileExtension = (attachment: AttachmentType): string | undefined return attachment.contentType.split('/')[1]; } }; - -export const encryptAttachmentBuffer = async (bufferIn: ArrayBuffer) => { - if (!isArrayBuffer(bufferIn)) { - throw new TypeError("'bufferIn' must be an array buffer"); - } - const key = Storage.get('local_attachment_encrypted_key') as string; - const encryptingKey = fromHexToArray(key); - return window.callWorker('encryptAttachmentBuffer', encryptingKey, bufferIn); -}; - -export const decryptAttachmentBuffer = async (bufferIn: ArrayBuffer): Promise => { - if (!isArrayBuffer(bufferIn)) { - throw new TypeError("'bufferIn' must be an array buffer"); - } - const key = Storage.get('local_attachment_encrypted_key') as string; - const encryptingKey = fromHexToArray(key); - return window.callWorker('decryptAttachmentBuffer', encryptingKey, bufferIn); -}; diff --git a/ts/types/MessageAttachment.ts b/ts/types/MessageAttachment.ts index 555cbc729..a41b91d02 100644 --- a/ts/types/MessageAttachment.ts +++ b/ts/types/MessageAttachment.ts @@ -1,4 +1,4 @@ -import { remote } from 'electron'; +import { ipcRenderer } from 'electron'; import { isArrayBuffer, isEmpty, isUndefined, omit } from 'lodash'; import { createAbsolutePathGetter, @@ -88,8 +88,10 @@ let internalDeleteOnDisk: ((relativePath: string) => Promise) | undefined; let internalWriteNewAttachmentData: ((arrayBuffer: ArrayBuffer) => Promise) | undefined; // userDataPath must be app.getPath('userData'); -export function initializeAttachmentLogic() { - const userDataPath = remote.app.getPath('userData'); +export async function initializeAttachmentLogic() { + const userDataPath = await ipcRenderer.invoke('get-user-data-path'); + + // const userDataPath = remote.app.getPath('userData'); if (attachmentsPath) { throw new Error('attachmentsPath already initialized'); } diff --git a/ts/util/index.ts b/ts/util/index.ts index ffe85ee48..0f359efc4 100644 --- a/ts/util/index.ts +++ b/ts/util/index.ts @@ -2,7 +2,6 @@ import * as GoogleChrome from './GoogleChrome'; import { arrayBufferToObjectURL } from './arrayBufferToObjectURL'; import { missingCaseError } from './missingCaseError'; import { makeLookup } from './makeLookup'; -import * as PasswordUtil from './passwordUtils'; import * as AttachmentUtil from './attachmentsUtil'; import * as LinkPreviewUtil from './linkPreviewFetch'; @@ -13,7 +12,6 @@ export { GoogleChrome, makeLookup, missingCaseError, - PasswordUtil, AttachmentUtil, LinkPreviewUtil, }; diff --git a/tsconfig.json b/tsconfig.json index 9834181bd..8ddce822b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,6 +34,6 @@ // "allowSyntheticDefaultImports": true, // Allow default imports from modules with no default export. This does not affect code emit, just typechecking. "useUnknownInCatchVariables": false, "esModuleInterop": true, // Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. - "inlineSourceMap": true // Emit a single file with source maps instead of having a separate file. + "inlineSourceMap": false // Emit a single file with source maps instead of having a separate file. } } diff --git a/webpack.config.js b/webpack.config.js index 363f17155..10781638f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,53 +1,99 @@ +/* eslint-disable class-methods-use-this */ const path = require('path'); +const { Compilation } = require('webpack'); + const HtmlWebpackPlugin = require('html-webpack-plugin'); +const optimization = { + nodeEnv: false, + removeAvailableModules: true, + removeEmptyChunks: true, + providedExports: true, + minimize: false, + // minimizer: [new TerserPlugin({ parallel: true })], + // splitChunks: true, +}; + module.exports = [ - // { - // // bundling mode + { + // bundling mode - // mode: 'development', // mode: 'production', + mode: 'development', // mode: 'production', + devtool: false, - // // entry files + optimization, - // entry: './main.js', - // target: 'electron-main', - // module: { - // // loaders + // entry files + resolve: { + extensions: ['.ts', '.tsx', '.js', '.json'], + // alias: { + // 'better_sqlite3.node': path.resolve(__dirname), + // }, + }, + entry: './ts/mains/main_node.ts', + target: 'electron-main', + module: { + // loaders - // rules: [ - // { - // test: /\.tsx?$/, - // include: /ts/, - // use: [{ loader: 'ts-loader' }], - // exclude: /node_modules/, - // }, - // ], - // }, - // // output bundles (location) + rules: [ + { + test: /\.js$/, + loader: `node-bindings-loader`, + }, + { + test: /\.node$/, + loader: `node-loader`, + }, + { + test: /\.tsx?$/, + include: /ts/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + experimentalWatchApi: true, + }, + }, + ], + exclude: /node_modules/, + }, + ], + }, + // output bundles (location) - // output: { - // path: path.resolve(__dirname, 'dist'), - // filename: 'electron.js', - // }, - // }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'electron_main.js', + }, + }, { mode: 'development', entry: './ts/mains/main_renderer.ts', target: 'electron-renderer', - devtool: 'source-map', + devtool: false, resolve: { extensions: ['.ts', '.tsx', '.js', '.json'], }, module: { rules: [ { - test: /\.ts(x?)$/, + test: /\.tsx?$/, include: [path.resolve(__dirname, 'ts'), path.resolve(__dirname, 'js')], - use: [{ loader: 'ts-loader' }], + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + experimentalWatchApi: true, + }, + }, + ], }, ], }, + optimization, output: { path: path.resolve(__dirname, 'dist', 'js'), filename: 'electron-renderer.js', diff --git a/yarn.lock b/yarn.lock index 165b3df67..6adcb3096 100644 --- a/yarn.lock +++ b/yarn.lock @@ -605,22 +605,6 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@electron/get@^1.0.1": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.9.0.tgz#7fa6e61d7ff50fb82a8a41f437af7de3b97aa9a5" - integrity sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^9.6.0" - progress "^2.0.3" - sanitize-filename "^1.6.2" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^2.0.2" - global-tunnel-ng "^2.7.1" - "@electron/get@^1.13.0": version "1.14.1" resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" @@ -845,12 +829,10 @@ "@types/jquery" "*" "@types/underscore" "*" -"@types/better-sqlite3@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz#d45600bc19f8f41397263d037ca9b0d05df85e58" - integrity sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng== - dependencies: - "@types/integer" "*" +"@types/better-sqlite3@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.4.0.tgz#2b88d8474fc3f755617c0a5a8643388252c10aa1" + integrity sha512-tmSORlztb2cdWZDy4V81mRDgL+q7bd+ext4pI+Wj8EtJ5EHIZ6v7yiWbJ6A5eKVtoz77EsBEm7amwAzfqR/kAw== "@types/blueimp-load-image@5.14.4": version "5.14.4" @@ -1032,11 +1014,6 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/integer@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/integer/-/integer-4.0.0.tgz#3b778715df72d2cf8ba73bad27bd9d830907f944" - integrity sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -1510,6 +1487,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1875,13 +1857,18 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -"better-sqlite3@https://github.com/signalapp/better-sqlite3#ad0db5dd09c0ea4007b1c46bd4f7273827803347": +"better-sqlite3@https://github.com/signalapp/better-sqlite3#4f66ee7b85477016dd0b2c3d2f13dcb60abd452e": version "7.1.4" - resolved "https://github.com/signalapp/better-sqlite3#ad0db5dd09c0ea4007b1c46bd4f7273827803347" + resolved "https://github.com/signalapp/better-sqlite3#4f66ee7b85477016dd0b2c3d2f13dcb60abd452e" dependencies: bindings "^1.5.0" tar "^6.1.0" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" @@ -1959,11 +1946,6 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boolean@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" - integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== - boolean@^3.0.1: version "3.2.0" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" @@ -1991,7 +1973,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1: +braces@^3.0.1, braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2081,13 +2063,13 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -bunyan@1.8.12: - version "1.8.12" - resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" - integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= +bunyan@^1.8.15: + version "1.8.15" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" + integrity sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig== optionalDependencies: dtrace-provider "~0.8" - moment "^2.10.6" + moment "^2.19.3" mv "~2" safe-json-stringify "~1" @@ -2141,6 +2123,11 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -2557,11 +2544,6 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2588,6 +2570,17 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -3099,7 +3092,7 @@ electron-updater@^4.2.2: pako "^1.0.11" semver "^7.1.3" -electron@*: +electron@*, electron@^17.1.2: version "17.3.0" resolved "https://registry.yarnpkg.com/electron/-/electron-17.3.0.tgz#cdcc46a7a3cd0b6f2a1757fbeb807f6b2fce847e" integrity sha512-KuYHCOw1a+CE9thZlWRqTScf6M81KLd6n5qpdBGb0rl62+50RUuau9CnYpBb3EJxrjsXLaiQCBBSdPsozf/XUg== @@ -3108,15 +3101,6 @@ electron@*: "@types/node" "^14.6.2" extract-zip "^1.0.3" -electron@^13.6.2: - version "13.6.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-13.6.3.tgz#c0217178807d3e0b2175c49dbe33ea8dac447e73" - integrity sha512-kevgR6/RuEhchJQbgCKhHle9HvJhi2dOJlicFZJqbbqa9BVpZARqqFDlwTSatYxmUPUJwu09FvyMwJG2DMQIng== - dependencies: - "@electron/get" "^1.0.1" - "@types/node" "^14.6.2" - extract-zip "^1.0.3" - emoji-mart@^2.11.2: version "2.11.2" resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-2.11.2.tgz#ed331867f7f55bb33c8421c9a493090fa4a378c7" @@ -3134,6 +3118,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3651,6 +3640,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + findup-sync@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" @@ -3717,6 +3713,15 @@ fs-extra@9.0.0: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -3906,6 +3911,18 @@ glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -3929,19 +3946,6 @@ glob@~7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -global-agent@^2.0.2: - version "2.1.8" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.8.tgz#99d153662b2c04cbc1199ffbc081a3aa656ac50f" - integrity sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A== - dependencies: - boolean "^3.0.0" - core-js "^3.6.4" - es6-error "^4.1.1" - matcher "^2.1.0" - roarr "^2.15.2" - semver "^7.1.2" - serialize-error "^5.0.0" - global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -4009,6 +4013,11 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" +graceful-fs@^4.1.11, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" @@ -4019,11 +4028,6 @@ graceful-fs@^4.2.3, graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" @@ -4587,7 +4591,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -4892,6 +4896,13 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -4988,6 +4999,15 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5140,13 +5160,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== -matcher@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28" - integrity sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ== - dependencies: - escape-string-regexp "^2.0.0" - matcher@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" @@ -5218,6 +5231,14 @@ micromatch@^4.0.0, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + mime-db@1.43.0: version "1.43.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" @@ -5293,6 +5314,11 @@ minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + minipass@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" @@ -5321,11 +5347,11 @@ mkdirp@^1.0.3: integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mkpath@^0.1.0: version "0.1.0" @@ -5369,10 +5395,10 @@ moment@2.21.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== -moment@^2.10.6: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moment@^2.19.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== ms@0.7.1: version "0.7.1" @@ -5419,9 +5445,9 @@ nan@2.14.2, nan@^2.13.2: integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nan@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nano-css@^5.3.1: version "5.3.1" @@ -5452,6 +5478,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + nise@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.3.tgz#9f79ff02fa002ed5ffbc538ad58518fa011dc913" @@ -5471,6 +5502,15 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-bindings-loader@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/node-bindings-loader/-/node-bindings-loader-1.5.0.tgz#326b23d0ab88c5e3a218d819a16ee730e2af0470" + integrity sha512-0aixWkyrttzM94eUXqliYdS7v8PXHw5tKlUmbCm+dleoGe9ZajUKcpxYN84ftddCGkip2V4p435jVjQVKf5Q2w== + dependencies: + glob "^7.1.6" + parent-module "^2.0.0" + webpack-sources "^2.2.0" + node-fetch@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" @@ -5510,6 +5550,13 @@ node-gyp@^7.1.0: tar "^6.0.2" which "^2.0.2" +node-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-2.0.0.tgz#9109a6d828703fd3e0aa03c1baec12a798071562" + integrity sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q== + dependencies: + loader-utils "^2.0.0" + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" @@ -5689,6 +5736,14 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + open@^8.3.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" @@ -5823,6 +5878,13 @@ param-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -5853,6 +5915,25 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +patch-package@^6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -5880,6 +5961,11 @@ path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -5943,6 +6029,11 @@ picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@3.0.0, pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -6799,7 +6890,7 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@2, rimraf@^2.2.8: +rimraf@2, rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6839,18 +6930,6 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" -roarr@^2.15.2: - version "2.15.2" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.2.tgz#34f6229ae3c8c12167c4ae60f58fe75e79a1e394" - integrity sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q== - dependencies: - boolean "^3.0.0" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -6919,7 +6998,7 @@ safe-json-stringify@~1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: +sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== @@ -6988,7 +7067,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -7003,7 +7082,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.2, semver@^7.1.3: +semver@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== @@ -7020,13 +7099,6 @@ semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -serialize-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" - integrity sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA== - dependencies: - type-fest "^0.8.0" - serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -7117,6 +7189,11 @@ sinon@9.0.2: nise "^4.0.1" supports-color "^7.1.0" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -7151,6 +7228,11 @@ socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" +source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + source-map-support@^0.4.18: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -7563,7 +7645,7 @@ term-size@^2.1.0: resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== -terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== @@ -7822,7 +7904,7 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.0, type-fest@^0.8.1: +type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -8015,6 +8097,14 @@ webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"