moved a bunch of node files to typescript

pull/2239/head
Audric Ackermann 3 years ago
parent 92814ba36c
commit 38774a9344

@ -1,14 +0,0 @@
const path = require('path');
const { app } = require('electron');
const { start } = require('./base_config');
const userDataPath = app.getPath('userData');
const targetPath = path.join(userDataPath, 'ephemeral.json');
const ephemeralConfig = start('ephemeral', targetPath, {
allowMalformedOnStartup: true,
});
module.exports = ephemeralConfig;

@ -1,3 +0,0 @@
import { BaseConfig } from './base_config';
type UserConfig = BaseConfig;

@ -1,2 +0,0 @@
export function markShouldQuit(): void;
export function shouldQuit(): void;

@ -1,14 +0,0 @@
let shouldQuitFlag = false;
function markShouldQuit() {
shouldQuitFlag = true;
}
function shouldQuit() {
return shouldQuitFlag;
}
module.exports = {
shouldQuit,
markShouldQuit,
};

@ -83,7 +83,7 @@
"nan": "2.14.2", "nan": "2.14.2",
"node-fetch": "2.3.0", "node-fetch": "2.3.0",
"node-sass": "6.0.1", "node-sass": "6.0.1",
"os-locale": "2.1.0", "os-locale": "6.0.2",
"p-retry": "^4.2.0", "p-retry": "^4.2.0",
"pify": "3.0.0", "pify": "3.0.0",
"protobufjs": "^6.11.2", "protobufjs": "^6.11.2",

@ -1,30 +1,35 @@
const electron = require('electron'); import { ipcMain } from 'electron';
const Attachments = require('../ts/attachments/attachments'); import rimraf from 'rimraf';
const rimraf = require('rimraf');
const { ipcMain } = electron; import * as Attachments from '../attachments/attachments';
// tslint:disable: no-console
module.exports = {
initialize,
};
let initialized = false; let initialized = false;
const ERASE_ATTACHMENTS_KEY = 'erase-attachments'; const ERASE_ATTACHMENTS_KEY = 'erase-attachments';
const CLEANUP_ORPHANED_ATTACHMENTS_KEY = 'cleanup-orphaned-attachments'; const CLEANUP_ORPHANED_ATTACHMENTS_KEY = 'cleanup-orphaned-attachments';
async function initialize({ configDir, cleanupOrphanedAttachments }) { export async function cleanupOrphanedAttachments(userDataPath: string) {
const allAttachments = await Attachments.getAllAttachments(userDataPath);
const orphanedAttachments = await sql.removeKnownAttachments(allAttachments); //sql.js
await Attachments.deleteAll({
userDataPath,
attachments: orphanedAttachments,
});
}
export async function initialize({ userDataPath }: { userDataPath: string }) {
if (initialized) { if (initialized) {
throw new Error('initialze: Already initialized!'); throw new Error('initialze: Already initialized!');
} }
initialized = true; initialized = true;
console.log('Ensure attachments directory exists'); console.log('Ensure attachments directory exists');
await Attachments.ensureDirectory(configDir); await Attachments.ensureDirectory(userDataPath);
const attachmentsDir = Attachments.getPath(configDir); const attachmentsDir = Attachments.getPath(userDataPath);
ipcMain.on(ERASE_ATTACHMENTS_KEY, async event => { ipcMain.on(ERASE_ATTACHMENTS_KEY, event => {
try { try {
rimraf.sync(attachmentsDir); rimraf.sync(attachmentsDir);
event.sender.send(`${ERASE_ATTACHMENTS_KEY}-done`); event.sender.send(`${ERASE_ATTACHMENTS_KEY}-done`);
@ -37,7 +42,7 @@ async function initialize({ configDir, cleanupOrphanedAttachments }) {
ipcMain.on(CLEANUP_ORPHANED_ATTACHMENTS_KEY, async event => { ipcMain.on(CLEANUP_ORPHANED_ATTACHMENTS_KEY, async event => {
try { try {
await cleanupOrphanedAttachments(); await cleanupOrphanedAttachments(userDataPath);
event.sender.send(`${CLEANUP_ORPHANED_ATTACHMENTS_KEY}-done`); event.sender.send(`${CLEANUP_ORPHANED_ATTACHMENTS_KEY}-done`);
} catch (error) { } catch (error) {
const errorForDisplay = error && error.stack ? error.stack : error; const errorForDisplay = error && error.stack ? error.stack : error;

@ -1,19 +1,19 @@
const fs = require('fs'); import { readFileSync, unlinkSync, writeFileSync } from 'fs';
const _ = require('lodash');
const ENCODING = 'utf8'; const ENCODING = 'utf8';
module.exports = { export function start(
start, name: string,
}; targetPath: string,
options: {
function start(name, targetPath, options = {}) { allowMalformedOnStartup?: boolean;
} = {}
) {
const { allowMalformedOnStartup } = options; const { allowMalformedOnStartup } = options;
let cachedValue = null; let cachedValue: Record<string, number | string | boolean> = {};
try { try {
const text = fs.readFileSync(targetPath, ENCODING); const text = readFileSync(targetPath, ENCODING);
cachedValue = JSON.parse(text); cachedValue = JSON.parse(text);
console.log(`config/get: Successfully read ${name} config file`); console.log(`config/get: Successfully read ${name} config file`);
@ -30,20 +30,20 @@ function start(name, targetPath, options = {}) {
cachedValue = Object.create(null); cachedValue = Object.create(null);
} }
function get(keyPath) { function get(keyPath: string) {
return _.get(cachedValue, keyPath); return cachedValue[keyPath];
} }
function set(keyPath, value) { function set(keyPath: string, value: number | string | boolean) {
_.set(cachedValue, keyPath, value); cachedValue[keyPath] = value;
console.log(`config/set: Saving ${name} config to disk`); console.log(`config/set: Saving ${name} config to disk`);
const text = JSON.stringify(cachedValue, null, ' '); const text = JSON.stringify(cachedValue, null, ' ');
fs.writeFileSync(targetPath, text, ENCODING); writeFileSync(targetPath, text, ENCODING);
} }
function remove() { function remove() {
console.log(`config/remove: Deleting ${name} config from disk`); console.log(`config/remove: Deleting ${name} config from disk`);
fs.unlinkSync(targetPath); unlinkSync(targetPath);
cachedValue = Object.create(null); cachedValue = Object.create(null);
} }

@ -0,0 +1,12 @@
import path from 'path';
import { app } from 'electron';
import { start } from './base_config';
const userDataPath = app.getPath('userData');
const targetPath = path.join(userDataPath, 'ephemeral.json');
export const ephemeralConfig = start('ephemeral', targetPath, {
allowMalformedOnStartup: true,
});

@ -0,0 +1,39 @@
import path from 'path';
import process from 'process';
import { app } from 'electron';
import { start } from './base_config';
// tslint:disable: no-console
let storageProfile;
// Node makes sure all environment variables are strings
const { NODE_ENV: environment, NODE_APP_INSTANCE: instance } = process.env;
// We need to make sure instance is not empty
const isValidInstance = typeof instance === 'string' && instance.length > 0;
const isProduction = environment === 'production' && !isValidInstance;
// Use seperate data directories for each different environment and app instances
if (!isProduction) {
storageProfile = environment;
if (isValidInstance) {
storageProfile = (storageProfile || '').concat(`-${instance}`);
}
}
if (storageProfile) {
const userData = path.join(app.getPath('appData'), `Session-${storageProfile}`);
app.setPath('userData', userData);
}
console.log(`userData: ${app.getPath('userData')}`);
const userDataPath = app.getPath('userData');
const targetPath = path.join(userDataPath, 'config.json');
const userConfig = start('user', targetPath);
export type UserConfig = typeof userConfig;

@ -1,8 +1,8 @@
const path = require('path'); import path from 'path';
const fs = require('fs'); import fs from 'fs';
const _ = require('lodash'); import _ from 'lodash';
function normalizeLocaleName(locale) { function normalizeLocaleName(locale: string) {
if (/^en-/.test(locale)) { if (/^en-/.test(locale)) {
return 'en'; return 'en';
} }
@ -10,15 +10,21 @@ function normalizeLocaleName(locale) {
return locale; return locale;
} }
function getLocaleMessages(locale) { function getLocaleMessages(locale: string): LocaleMessagesType {
const onDiskLocale = locale.replace('-', '_'); const onDiskLocale = locale.replace('-', '_');
const targetFile = path.join(__dirname, '..', '_locales', onDiskLocale, 'messages.json'); const targetFile = path.join(__dirname, '..', '_locales', onDiskLocale, 'messages.json');
// tslint:disable-next-line: non-literal-fs-path
return JSON.parse(fs.readFileSync(targetFile, 'utf-8')); return JSON.parse(fs.readFileSync(targetFile, 'utf-8'));
} }
export type LocaleMessagesType = Record<string, string>;
export type LocaleMessagesWithNameType = { messages: LocaleMessagesType; name: string };
function load({ appLocale, logger } = {}) { export function load({
appLocale,
logger,
}: { appLocale?: string; logger?: any } = {}): LocaleMessagesWithNameType {
if (!appLocale) { if (!appLocale) {
throw new TypeError('`appLocale` is required'); throw new TypeError('`appLocale` is required');
} }
@ -55,7 +61,3 @@ function load({ appLocale, logger } = {}) {
messages, messages,
}; };
} }
module.exports = {
load,
};

@ -1,17 +1,30 @@
const { isString } = require('lodash'); import { LocaleMessagesType } from './locale';
exports.createTemplate = (options, messages) => { import { isString } from 'lodash';
// tslint:disable-next-line: max-func-body-length
export const createTemplate = (
options: {
openReleaseNotes: () => void;
openSupportPage: () => void;
platform: () => void;
showAbout: () => void;
showDebugLog: () => void;
showWindow: () => void;
},
messages: LocaleMessagesType
) => {
if (!isString(options.platform)) { if (!isString(options.platform)) {
throw new TypeError('`options.platform` must be a string'); throw new TypeError('`options.platform` must be a string');
} }
const { const {
includeSetup,
openReleaseNotes, openReleaseNotes,
openSupportPage, openSupportPage,
platform, platform,
showAbout, showAbout,
showDebugLog, showDebugLog,
showWindow,
} = options; } = options;
const template = [ const template = [
@ -138,25 +151,22 @@ exports.createTemplate = (options, messages) => {
}, },
]; ];
if (includeSetup) {
const fileMenu = template[0];
// These are in reverse order, since we're prepending them one at a time
fileMenu.submenu.unshift({
type: 'separator',
});
}
if (platform === 'darwin') { if (platform === 'darwin') {
return updateForMac(template, messages, options); return updateForMac(template, messages, {
showAbout: showAbout,
showWindow: showWindow,
});
} }
return template; return template;
}; };
function updateForMac(template, messages, options) { function updateForMac(
const { includeSetup, showAbout, showWindow } = options; template: any,
messages: LocaleMessagesType,
options: { showAbout: () => void; showWindow: () => void }
) {
const { showAbout, showWindow } = options;
// Remove About item and separator from Help menu, since it's on the first menu // Remove About item and separator from Help menu, since it's on the first menu
template[4].submenu.pop(); template[4].submenu.pop();
@ -165,16 +175,6 @@ function updateForMac(template, messages, options) {
// Remove File menu // Remove File menu
template.shift(); template.shift();
if (includeSetup) {
// Add a File menu just for these setup options. Because we're using unshift(), we add
// the file menu first, though it ends up to the right of the Signal Desktop menu.
const fileMenu = {
label: messages.mainMenuFile,
};
template.unshift(fileMenu);
}
// Add the OSX-specific Signal Desktop menu at the far left // Add the OSX-specific Signal Desktop menu at the far left
template.unshift({ template.unshift({
label: messages.sessionMessenger, label: messages.sessionMessenger,
@ -212,7 +212,7 @@ function updateForMac(template, messages, options) {
}); });
// Replace Window menu // Replace Window menu
const windowMenuTemplateIndex = includeSetup ? 4 : 3; const windowMenuTemplateIndex = 3;
// eslint-disable-next-line no-param-reassign // eslint-disable-next-line no-param-reassign
template[windowMenuTemplateIndex].submenu = [ template[windowMenuTemplateIndex].submenu = [
{ {

@ -1,12 +1,12 @@
/* global exports, require */ // tslint:disable: no-console
/* eslint-disable strict */
const { Menu } = require('electron'); import { Menu } from 'electron';
const osLocale = require('os-locale'); import { BrowserWindow } from 'electron/main';
import { osLocaleSync } from 'os-locale';
exports.setup = (browserWindow, messages) => { export const setup = (browserWindow: BrowserWindow, messages: any) => {
const { session } = browserWindow.webContents; const { session } = browserWindow.webContents;
const userLocale = osLocale.sync().replace(/_/g, '-'); const userLocale = osLocaleSync().replace(/_/g, '-');
const userLocales = [userLocale, userLocale.split('-')[0]]; const userLocales = [userLocale, userLocale.split('-')[0]];
const available = session.availableSpellCheckerLanguages; const available = session.availableSpellCheckerLanguages;
@ -16,7 +16,7 @@ exports.setup = (browserWindow, messages) => {
console.log('spellcheck: setting languages to: ', languages); console.log('spellcheck: setting languages to: ', languages);
session.setSpellCheckerLanguages(languages); session.setSpellCheckerLanguages(languages);
browserWindow.webContents.on('context-menu', (_event, params) => { browserWindow.webContents.on('context-menu', (_event: any, params: any) => {
const { editFlags } = params; const { editFlags } = params;
const isMisspelled = Boolean(params.misspelledWord); const isMisspelled = Boolean(params.misspelledWord);
const showMenu = params.isEditable || editFlags.canCopy; const showMenu = params.isEditable || editFlags.canCopy;
@ -28,7 +28,7 @@ exports.setup = (browserWindow, messages) => {
if (isMisspelled) { if (isMisspelled) {
if (params.dictionarySuggestions.length > 0) { if (params.dictionarySuggestions.length > 0) {
template.push( template.push(
...params.dictionarySuggestions.map(label => ({ ...params.dictionarySuggestions.map((label: any) => ({
label, label,
click: () => { click: () => {
browserWindow.webContents.replaceMisspelling(label); browserWindow.webContents.replaceMisspelling(label);
@ -75,7 +75,7 @@ exports.setup = (browserWindow, messages) => {
} }
const menu = Menu.buildFromTemplate(template); const menu = Menu.buildFromTemplate(template);
menu.popup(browserWindow); menu.popup({ window: browserWindow });
} }
}); });
}; };

@ -1,17 +1,20 @@
const path = require('path'); import path from 'path';
const { app, Menu, Tray } = require('electron'); import { app, Menu, Tray } from 'electron';
import { BrowserWindow } from 'electron/main';
import { LocaleMessagesType } from './locale';
let trayContextMenu = null; let trayContextMenu = null;
let tray = null; let tray: Tray | null = null;
let trayAny: any;
function createTrayIcon(getMainWindow, messages) { function createTrayIcon(getMainWindow: () => BrowserWindow, messages: LocaleMessagesType) {
// keep the duplicated part to allow for search and find // keep the duplicated part to allow for search and find
const iconFile = process.platform === 'darwin' ? 'session_icon_16.png' : 'session_icon_32.png'; const iconFile = process.platform === 'darwin' ? 'session_icon_16.png' : 'session_icon_32.png';
const iconNoNewMessages = path.join(__dirname, '..', 'images', 'session', iconFile); const iconNoNewMessages = path.join(__dirname, '..', 'images', 'session', iconFile);
tray = new Tray(iconNoNewMessages); tray = new Tray(iconNoNewMessages);
trayAny = tray;
tray.forceOnTop = mainWindow => { trayAny.forceOnTop = (mainWindow: BrowserWindow) => {
if (mainWindow) { if (mainWindow) {
// On some versions of GNOME the window may not be on top when restored. // On some versions of GNOME the window may not be on top when restored.
// This trick should fix it. // This trick should fix it.
@ -22,7 +25,7 @@ function createTrayIcon(getMainWindow, messages) {
} }
}; };
tray.toggleWindowVisibility = () => { trayAny.toggleWindowVisibility = () => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
if (mainWindow) { if (mainWindow) {
if (mainWindow.isVisible()) { if (mainWindow.isVisible()) {
@ -30,25 +33,25 @@ function createTrayIcon(getMainWindow, messages) {
} else { } else {
mainWindow.show(); mainWindow.show();
tray.forceOnTop(mainWindow); trayAny.forceOnTop(mainWindow);
} }
} }
tray.updateContextMenu(); trayAny.updateContextMenu();
}; };
tray.showWindow = () => { trayAny.showWindow = () => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
if (mainWindow) { if (mainWindow) {
if (!mainWindow.isVisible()) { if (!mainWindow.isVisible()) {
mainWindow.show(); mainWindow.show();
} }
tray.forceOnTop(mainWindow); trayAny.forceOnTop(mainWindow);
} }
tray.updateContextMenu(); trayAny.updateContextMenu();
}; };
tray.updateContextMenu = () => { trayAny.updateContextMenu = () => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
// NOTE: we want to have the show/hide entry available in the tray icon // NOTE: we want to have the show/hide entry available in the tray icon
@ -59,7 +62,7 @@ function createTrayIcon(getMainWindow, messages) {
{ {
id: 'toggleWindowVisibility', id: 'toggleWindowVisibility',
label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'], label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'],
click: tray.toggleWindowVisibility, click: trayAny.toggleWindowVisibility,
}, },
{ {
id: 'quit', id: 'quit',
@ -68,13 +71,13 @@ function createTrayIcon(getMainWindow, messages) {
}, },
]); ]);
tray.setContextMenu(trayContextMenu); trayAny.setContextMenu(trayContextMenu);
}; };
tray.on('click', tray.showWindow); tray.on('click', trayAny.showWindow);
tray.setToolTip(messages.sessionMessenger); tray.setToolTip(messages.sessionMessenger);
tray.updateContextMenu(); trayAny.updateContextMenu();
return tray; return tray;
} }

@ -0,0 +1,9 @@
let shouldQuitFlag = false;
export function markShouldQuit() {
shouldQuitFlag = true;
}
export function shouldQuit() {
return shouldQuitFlag;
}

@ -1,7 +1,7 @@
import { BrowserWindow } from 'electron'; import { BrowserWindow } from 'electron';
import { start as startUpdater, stop as stopUpdater } from './updater'; import { start as startUpdater, stop as stopUpdater } from './updater';
import { LoggerType, MessagesType } from './common'; import { LoggerType, MessagesType } from './common';
import { UserConfig } from '../../app/user_config'; import { UserConfig } from '../node/config/user_config';
let initialized = false; let initialized = false;
let localUserConfig: UserConfig; let localUserConfig: UserConfig;

@ -2,7 +2,7 @@ import * as path from 'path';
import * as fs from 'fs-extra'; import * as fs from 'fs-extra';
import { autoUpdater, UpdateInfo } from 'electron-updater'; import { autoUpdater, UpdateInfo } from 'electron-updater';
import { app, BrowserWindow } from 'electron'; import { app, BrowserWindow } from 'electron';
import { markShouldQuit } from '../../app/window_state'; import { markShouldQuit } from '../node/window_state';
import { import {
getPrintableError, getPrintableError,

@ -2542,7 +2542,7 @@ cross-env@^6.0.3:
dependencies: dependencies:
cross-spawn "^7.0.0" cross-spawn "^7.0.0"
cross-spawn@^5.0.1, cross-spawn@^5.1.0: cross-spawn@^5.1.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
@ -3375,19 +3375,6 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^5.0.0: execa@^5.0.0:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
@ -3795,11 +3782,6 @@ get-stdin@^5.0.1:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
get-stream@^4.1.0: get-stream@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@ -4412,10 +4394,10 @@ invariant@^2.2.4:
dependencies: dependencies:
loose-envify "^1.0.0" loose-envify "^1.0.0"
invert-kv@^1.0.0: invert-kv@^3.0.0:
version "1.0.0" version "3.0.1"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==
ip2country@1.0.1: ip2country@1.0.1:
version "1.0.1" version "1.0.1"
@ -4537,11 +4519,6 @@ is-resolvable@^1.0.0:
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
is-stream@^2.0.0: is-stream@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
@ -4888,12 +4865,12 @@ lazy-val@^1.0.4:
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65"
integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==
lcid@^1.0.0: lcid@^3.1.1:
version "1.0.0" version "3.1.1"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0"
integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==
dependencies: dependencies:
invert-kv "^1.0.0" invert-kv "^3.0.0"
levn@^0.3.0, levn@~0.3.0: levn@^0.3.0, levn@~0.3.0:
version "0.3.0" version "0.3.0"
@ -5127,13 +5104,6 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
mem@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
dependencies:
mimic-fn "^1.0.0"
meow@^3.3.0: meow@^3.3.0:
version "3.7.0" version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@ -5586,13 +5556,6 @@ npm-conf@^1.1.3:
config-chain "^1.1.11" config-chain "^1.1.11"
pify "^3.0.0" pify "^3.0.0"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
dependencies:
path-key "^2.0.0"
npm-run-path@^4.0.1: npm-run-path@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
@ -5701,14 +5664,12 @@ os-homedir@1.0.2, os-homedir@^1.0.0:
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@2.1.0: os-locale@6.0.2:
version "2.1.0" version "6.0.2"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-6.0.2.tgz#2e5122600f48cd9b846524c07f898db1c596bf20"
integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== integrity sha512-qIb8bzRqaN/vVqEYZ7lTAg6PonskO7xOmM7OClD28F6eFa4s5XGe4bGpHUHMoCHbNNuR0pDYFeSLiW5bnjWXIA==
dependencies: dependencies:
execa "^0.7.0" lcid "^3.1.1"
lcid "^1.0.0"
mem "^1.1.0"
os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
version "1.0.2" version "1.0.2"
@ -5728,11 +5689,6 @@ p-cancelable@^1.0.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
p-limit@^1.1.0: p-limit@^1.1.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@ -5873,11 +5829,6 @@ path-is-inside@^1.0.2:
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
path-key@^2.0.0:
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: path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@ -7385,11 +7336,6 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
strip-final-newline@^2.0.0: strip-final-newline@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"

Loading…
Cancel
Save