Original commit: da0872f05a
This commit is contained in:
Wojciech Daniło 2020-03-17 03:44:27 +01:00 committed by GitHub
parent e207e0afa9
commit 4f95075f2f
5 changed files with 419 additions and 462 deletions

View File

@ -4,19 +4,19 @@ let config = {
main: "index.js",
dependencies: {
"enso-studio-content": "2.0.0-alpha.0",
"enso-studio-common": "2.0.0-alpha.0",
"enso-studio-icons": "2.0.0-alpha.0",
"copy-webpack-plugin": "^5.1.1",
"create-servers": "^3.1.0",
"electron-is-dev": "^1.1.0"
"electron-is-dev": "^1.1.0",
"enso-studio-common": "2.0.0-alpha.0",
"enso-studio-content": "2.0.0-alpha.0",
"enso-studio-icons": "2.0.0-alpha.0",
"yargs": "^15.3.0"
},
devDependencies: {
"compression-webpack-plugin": "^3.1.0",
"copy-webpack-plugin": "^5.1.1",
"devtron": "^1.4.0",
"electron": "8.0.2",
"electron": "8.1.1",
"electron-builder": "^22.3.2"
},

View File

@ -1,15 +1,18 @@
'use strict'
import * as buildCfg from '../../../../../dist/build.json'
import * as Electron from 'electron'
import * as isDev from 'electron-is-dev'
import * as minimist from 'minimist'
import * as path from 'path'
import * as pkg from '../package.json'
import * as rootCfg from '../../../package.json'
import * as buildCfg from '../../../../../dist/build.json'
import * as Server from 'enso-studio-common/src/server'
import * as yargs from 'yargs'
// FIXME default options parsed wrong
// https://github.com/yargs/yargs/issues/1590
// ================
// === Defaults ===
@ -22,72 +25,112 @@ let windowCfg = {
// =============
// === Utils ===
// =============
// =====================
// === Option Parser ===
// =====================
function kebabToCamelCase(str){
let arr = str.split('-');
let capital = arr.map((item,index) => {
return index ? item.charAt(0).toUpperCase() + item.slice(1).toLowerCase() : item
})
return capital.join("");
}
function parseCmdArgs() {
let argv = isDev ? process.argv.slice(process.argv.indexOf('--') + 1) : process.argv
let args = minimist(argv)
for (let argName in args) {
let newName = kebabToCamelCase(argName)
args[newName] = args[argName]
}
return args
}
// ==================================
// === Command Line Args Handlers ===
// ==================================
const HELP_MESSAGE = `
let usage = `
${pkg.build.productName} ${rootCfg.version} command line interface.
Usage: ${pkg.build.productName} [options]
Config Options:
--port Port to use [${Server.DEFAULT_PORT}].
--server Run the server [true].
--window Show the window [true].
Debug Options:
--background-throttling Throttle animations when the app becomes background.
--debug-scene [SCENE] Run the debug scene instead of the main app.
--dev Run the application in development mode.
--devtron Install the Devtron Developer Tools extension.
Style Options:
--frame Draw window frame.
--vibrancy Use the vibrancy effect [true].
--window-size [SIZE] Set the window size [${windowCfg.width}x${windowCfg.height}].
Other Options:
--help Print the help message and exit.
--version Print the version.
`
let optParser = yargs
.scriptName("")
.usage(usage)
.help()
.version(false)
.parserConfiguration({'populate--':true})
.strict()
// === Config Options ===
let configOptionsGroup = 'Config Options:'
optParser.options('port', {
group : configOptionsGroup,
describe : `Port to use [${Server.DEFAULT_PORT}]`,
})
optParser.options('server', {
group : configOptionsGroup,
describe : 'Run the server [true]',
})
optParser.options('window', {
group : configOptionsGroup,
describe : 'Show the window [true]',
})
optParser.options('background-throttling', {
group : configOptionsGroup,
describe : 'Throttle animations when run in background [false]',
})
// === Debug Options ===
let debugOptionsGroup = 'Debug Options:'
optParser.options('debug-scene', {
group : debugOptionsGroup,
describe : 'Run the debug scene instead of the main app',
requiresArg : true
})
optParser.options('dev', {
group : debugOptionsGroup,
describe : 'Run the application in development mode',
})
optParser.options('devtron', {
group : debugOptionsGroup,
describe : 'Install the Devtron Developer Tools extension',
})
// === Style Options ===
let styleOptionsGroup = 'Style Options:'
optParser.options('frame', {
group : styleOptionsGroup,
describe : 'Draw window frame [false]'
})
optParser.options('vibrancy', {
group : styleOptionsGroup,
describe : 'Use the vibrancy effect [true]'
})
optParser.options('window-size', {
group : styleOptionsGroup,
describe : `Set the window size [${windowCfg.width}x${windowCfg.height}]`,
requiresArg : true
})
// === Other Options ===
optParser.options('info', {
describe : `Print the system debug info`,
})
optParser.options('version', {
describe : `Print the version`,
})
// === Parsing ===
function parseCmdArgs() {
let argv = isDev ? process.argv.slice(process.argv.indexOf('--') + 1) : process.argv
return optParser.parse(argv)
}
let args = parseCmdArgs()
if (args.help) {
console.log(HELP_MESSAGE)
process.exit()
}
if (args.version) {
console.log(`${rootCfg.version} (build ${buildCfg.buildVersion})`)
process.exit();
}
if (args.windowSize) {
let size = args.windowSize.split('x')
let width = parseInt(size[0])
@ -102,6 +145,47 @@ if (args.windowSize) {
// ==================
// === Debug Info ===
// ==================
let versionInfo = {
core: rootCfg.version,
build: buildCfg.buildVersion,
electron: process.versions.electron,
chrome: process.versions.chrome,
}
async function getDebugInfo() {
let procMemInfo = await process.getProcessMemoryInfo()
return {
version: versionInfo,
creation: process.getCreationTime(),
perf: {
cpu: process.getCPUUsage(),
},
memory: {
heap: process.getHeapStatistics(),
blink: process.getBlinkMemoryInfo(),
process: procMemInfo,
system: process.getSystemMemoryInfo(),
},
system: {
platform: process.platform,
arch: process.arch,
version: process.getSystemVersion(),
},
}
}
async function printDebugInfo() {
let info = await getDebugInfo()
console.log(JSON.stringify(info,undefined,4))
process.exit();
}
// ================
// === Security ===
// ================
@ -297,9 +381,19 @@ Electron.app.on('activate', () => {
})
Electron.app.on('ready', () => {
if (args.version) {
console.log(`core : ${versionInfo.core}`)
console.log(`build : ${versionInfo.build}`)
console.log(`electron : ${versionInfo.electron}`)
console.log(`chrome : ${versionInfo.chrome}`)
process.exit();
} else if (args.info) {
printDebugInfo()
} else {
if(args.window !== false) {
main()
}
}
})
if (process.platform === 'darwin') {

View File

@ -47,7 +47,7 @@
<script type="module" src="/assets/index.js" defer></script>
</head>
<body>
<div class="titlebar"></div>
<!-- <div class="titlebar"></div> -->
<div id="root"></div>
<noscript>
This page requires JavaScript to run. Please enable it in your browser.

View File

@ -1,140 +1,32 @@
/// This file generates the product logo as SVG and then converts it to set of PNGs, MacOS ICNS, and
/// Windows ICO formats.
class Text {
constructor(size = 64, compatibleMode = true, xoff = 0) {
this.size = size;
this.compatibleMode = compatibleMode;
this.borderMax = 10
this.borderSpread = 0
this.xoff = xoff
this.init();
}
init() {
var scaleStop = 128;
var scaleLog = Math.log2(scaleStop);
this.borderWidth = this.borderMax - Math.pow(Math.log2(Math.min(this.size, 128)) / scaleLog, 3) * scaleLog;
this.scale = this.size / 64;
this.d = this.borderWidth;
this.height = 64;
this.r = this.height / 3.5;
this.baseHeight = this.r * 2;
this.ww = 240 * 10; // FIXME: * 10 added to make letters not clipped in small scale. Just a hack.
this.hh = this.size * 10; // FIXME: ^^^
this.spacing = 10;
if (this.compatibleMode) { this.ref = "xlink:href" } else { this.ref = "href" }
this.defs = ''
this.body = `<use ${this.ref}="#text" fill="#AE8035"/>`
}
generate() {
var widthOf_l = this.d + this.spacing
var widthOf_lu = widthOf_l + 2 * this.r + this.spacing
var widthOf_lun = widthOf_lu + 2 * this.r + this.spacing
var widthOf_luna = widthOf_lun + 2 * this.r + this.spacing
var docWidth = (widthOf_luna + this.xoff - this.spacing) * this.scale
return `
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="${this.size}" width="${docWidth}" viewBox="0 0 ${docWidth} ${this.size}">
<defs>
<rect id="bg" width="${this.ww}" height="${this.hh}" fill="white"/>
<circle id="dotT" r="${this.d/2}" cx="${this.d/2}" cy="${this.d/2}"/>
<circle id="dotB" r="${this.d/2}" cx="${this.d/2}" cy="-${this.d/2}"/>
<circle id="dotM" r="${this.d/2}" cx="${this.d/2}" cy="${this.d/2 + this.height - this.baseHeight}"/>
<g id="letter_l">
<use ${this.ref}="#dotT"/>
<rect y="${this.d/2}" width="${this.d}" height="${this.height-this.d}"/>
<use transform="translate(0,${this.height})" ${this.ref}="#dotB"/>
</g>
<mask id="letter_u_mask">
<use ${this.ref}="#bg"/>
<circle cx="${this.r}" cy="${this.height-this.r}" r="${this.r-this.d}" fill="black"/>
<rect width="${this.r*2}" height="${this.height-this.r-1}" fill="black"/>
</mask>
<rect id="letter_u_side" y="${this.height-this.baseHeight+this.d/2}" width="${this.d}" height="${this.baseHeight-this.r-this.d/2}"/>
<g id="letter_u">
<use ${this.ref}="#dotM"/>
<use ${this.ref}="#dotM" transform="translate(${this.r*2-this.d})"/>
<circle cx="${this.r}" cy="${this.height-this.r}" r="${this.r}" mask="url(#letter_u_mask)"/>
<use ${this.ref}="#letter_u_side"/>
<use ${this.ref}="#letter_u_side" transform="translate(${this.r*2-this.d})"/>
</g>
<g id="letter_n">
<use ${this.ref}="#letter_u" transform="rotate(180,${this.r},${this.height}) translate(0,${this.baseHeight})"/>
</g>
<mask id="letter_a_mask">
<use ${this.ref}="#bg"/>
<circle cx="${this.r}" cy="${this.height-this.r}" r="${this.r-this.d}" fill="black"/>
<rect y="${this.height-this.r}" x="${this.r}" width="${this.r-this.d}" height="${this.r-this.d}" fill="black"/>
</mask>
<g id="letter_a" mask="url(#letter_a_mask)">
<circle cx="${this.r}" cy="${this.height-this.r}" r="${this.r}"/>
<rect y="${this.height-this.r}" x="${this.r}" width="${this.r}" height="${this.r}"/>
</g>
<g id="text">
<use ${this.ref}="#letter_l"/>
<use ${this.ref}="#letter_u" transform="translate(${widthOf_l})"/>
<use ${this.ref}="#letter_n" transform="translate(${widthOf_lu})"/>
<use ${this.ref}="#letter_a" transform="translate(${widthOf_lun})"/>
</g>
${this.defs}
</defs>
<g transform="scale(${this.scale}) translate(${this.xoff})">${this.body}</g>
</svg>
`
}
}
class Logo {
constructor(size = 64, compatibleMode = true) {
this.xsize = size
this.size = 64;
this.compatibleMode = compatibleMode;
this.size = 64
this.compatibleMode = compatibleMode
this.borderMax = 10
this.borderSpread = 0
this.init();
this.init()
}
init() {
var scaleStop = 128;
var scaleLog = Math.log2(scaleStop);
this.borderWidth = this.borderMax - Math.pow(Math.log2(Math.min(this.size, 128)) / scaleLog, 3) * scaleLog;
this.topRadius = 32;
this.borderOffset = this.borderWidth - this.borderSpread;
this.innerRadius = this.topRadius - this.borderWidth - this.borderOffset;
this.atomRadius = this.innerRadius / 2;
this.atomDiff = 0;
this.d = 4;
this.scale = this.xsize / 64;
var scaleStop = 128
var scaleLog = Math.log2(scaleStop)
this.borderWidth = 6
this.topRadius = 32
this.borderOffset = this.borderWidth - this.borderSpread
this.innerRadius = this.topRadius - this.borderWidth - this.borderOffset
this.atomRadius = this.innerRadius / 2
this.atomDiff = 0
this.d = 4
let innerSize = 56
this.scale1 = innerSize / 64
this.scale = (this.xsize / 64)
this.tx = (64 - innerSize) / 2
if (this.compatibleMode) { this.ref = "xlink:href" } else { this.ref = "href" }
this.defs = ''
this.body = `<use ${this.ref}="#logo" fill="red"/>`
}
generate() {
@ -174,138 +66,48 @@ class Logo {
<use ${this.ref}="#front" transform="rotate(35 32 32)"/>
</g>
<g id="logo-scaled">
<g transform="translate(${this.tx} ${this.tx}) scale(${this.scale1})">
<use ${this.ref}="#logo" fill="#fafafa"/>
</g>
</g>
<g id="background">
<circle id="innerCircle" cx="32" cy="32" r="31" fill="#24292f"/>
</g>
<g id="final">
<g> <use ${this.ref}="#background"/> </g>
<g> <use ${this.ref}="#logo-scaled"/> </g>
</g>
${this.defs}
</defs>
<g transform="scale(${this.scale})">${this.body}</g>
<g transform="scale(${this.scale})"> <use ${this.ref}="#final"/> </g>
</svg>
`
}
}
class InAppLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
this.body = `<use ${this.ref}="#logo" fill="#AE8035"/>`
}
}
class MinimalBlackLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
this.borderMax = 10
this.borderSpread = 0
this.init()
this.body = `<use ${this.ref}="#logo" fill="black"/>`
}
}
class MinimalWhiteLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
super(size, compatibleMode)
this.borderMax = 10
this.borderSpread = 0
this.init()
this.body = `<use ${this.ref}="#logo" fill="#fafafa"/>`
}
}
class AppLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
var border = 4
var scale = (64 - 2 * border) / 64
this.defs = `
<linearGradient id="cd" x1="0" y1="0" x2="0" y2="64px" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#ECAE67;stop-opacity:1" />
<stop offset="100%" style="stop-color:#E2963B;stop-opacity:1" />
</linearGradient>
<filter id="toShadow" x="-50%" y="-50%" width="200%" height="200%">
<feOffset result="offOut" in="SourceAlpha" dx="0" dy="2" />
<feGaussianBlur result="blurOut" in="offOut" stdDeviation="1" />
</filter>
<g id="txLogo" transform="translate(${border}, ${border})"><use ${this.ref}="#scalledLogo"/></g>
<g id="scalledLogo" transform="scale(${scale})"><use ${this.ref}="#filledLogo"/></g>
<g id="filledLogo">
<circle cx="32" cy="32" r="30" fill="#211F1A"/>
<use ${this.ref}="#logo" fill="url(#cd)"/>
</g>`;
this.body = `
<use ${this.ref}="#txLogo" filter="url(#toShadow)" opacity="0.7"/>
<use ${this.ref}="#txLogo"/>
`;
}
}
class BlackBackgroundLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
var border = 4
var scale = (64 - 2 * border) / 64
this.defs = `
<linearGradient id="cd" x1="0" y1="0" x2="0" y2="64px" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#ECAE67;stop-opacity:1" />
<stop offset="100%" style="stop-color:#E2963B;stop-opacity:1" />
</linearGradient>
<g id="txLogo" transform="translate(${border}, ${border})"><use ${this.ref}="#scalledLogo"/></g>
<g id="scalledLogo" transform="scale(${scale})"><use ${this.ref}="#filledLogo"/></g>
<g id="filledLogo">
<use ${this.ref}="#logo" fill="url(#cd)"/>
</g>`;
this.body = `
<rect id="bg" width="64" height="64" fill="#211F1A"/>
<use ${this.ref}="#txLogo"/>
`;
}
}
class WhiteBackgroundLogo extends Logo {
constructor(size, compatibleMode) {
super(size, compatibleMode);
var border = 4
var scale = (64 - 2 * border) / 64
this.defs = `
<linearGradient id="cd" x1="0" y1="0" x2="0" y2="64px" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="stop-color:#FAAF67;stop-opacity:1" />
<stop offset="100%" style="stop-color:#EB9139;stop-opacity:1" />
</linearGradient>
<g id="txLogo" transform="translate(${border}, ${border})"><use ${this.ref}="#scalledLogo"/></g>
<g id="scalledLogo" transform="scale(${scale})"><use ${this.ref}="#filledLogo"/></g>
<g id="filledLogo">
<use ${this.ref}="#logo" fill="url(#cd)"/>
</g>`;
this.body = `
<use ${this.ref}="#txLogo"/>
`;
}
}
fastGenerate = (cons) => (...args) => new cons(...args).generate()
exports.generateLogo = fastGenerate(Logo);
exports.generateAppLogo = fastGenerate(AppLogo);
exports.generateInAppLogo = fastGenerate(InAppLogo);
exports.generateMinimalBlackLogo = fastGenerate(MinimalBlackLogo);
exports.generateMinimalWhiteLogo = fastGenerate(MinimalWhiteLogo);
exports.generateBlackBackgroundLogo = fastGenerate(BlackBackgroundLogo);
exports.generateWhiteBackgroundLogo = fastGenerate(WhiteBackgroundLogo);
exports.generateInAppLogoWithText = (size, mode) => exports.generateInAppLogo(size, mode) + exports.generateText(size, mode, 20);
exports.generateText = fastGenerate(Text);
exports.generateMinimalWhiteLogo = fastGenerate(MinimalWhiteLogo)
const fss = require('fs')
const fs = fss.promises
const exec = require('child_process').exec;
const spawn = require('child_process').spawn;
const exec = require('child_process').exec
const spawn = require('child_process').spawn
const toIco = require('to-ico')
const sharp = require("sharp")
const path = require('path')

View File

@ -265,6 +265,69 @@
"dedent": "^0.7.0",
"npmlog": "^4.1.2",
"yargs": "^14.2.2"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
},
"yargs": {
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
"integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.1"
}
},
"yargs-parser": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
}
}
},
"@lerna/collect-uncommitted": {
@ -4084,9 +4147,9 @@
"integrity": "sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw=="
},
"electron": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.0.2.tgz",
"integrity": "sha512-hiQaFtFhd9X2Vjs01l3GXb8hPWSCa31o/kXydo+RC7vwcx9AGuzG7jWIq8vidzAWsF/YPM0LFVjFRZrfkqi03Q==",
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.1.1.tgz",
"integrity": "sha512-t+5zzFo7VOgckJc9YpImHJkpqeWxwpmEjywWbAa4IT5MULS7h1XU52H9gMswK/y8xc5lBNwxLhJSty/15+gi1A==",
"requires": {
"@electron/get": "^1.0.1",
"@types/node": "^12.0.12",
@ -4121,11 +4184,6 @@
"yargs": "^15.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
@ -4144,16 +4202,6 @@
"supports-color": "^7.1.0"
}
},
"cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -4167,69 +4215,11 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"requires": {
"p-locate": "^4.1.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"requires": {
"p-limit": "^2.2.0"
}
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"requires": {
"ansi-regex": "^5.0.0"
}
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
@ -12213,63 +12203,134 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"yargs": {
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
"integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"dev": true,
"version": "15.3.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
"integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
"requires": {
"cliui": "^5.0.0",
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.1"
"yargs-parser": "^18.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"requires": {
"p-locate": "^4.1.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"requires": {
"p-limit": "^2.2.0"
}
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"requires": {
"ansi-regex": "^4.1.0"
"ansi-regex": "^5.0.0"
}
},
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
}
}
},
"yargs-parser": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"version": "18.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.0.tgz",
"integrity": "sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ==",
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"