diff --git a/Jenkinsfile b/Jenkinsfile index 6285faa0b8..0275778f7e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,21 +19,48 @@ To set up pipeline in Jenkins: New Item > Pipeline > name it > OK > Scroll to Pi Note: this pipeline uses a private repository as well as private shared library which is not available externally. */ -@Library('jenkins-shared-lib') + +@Library('jenkins-shared-lib') _ import devops.waves.* ut = new utils() scripts = new scripts() +wallet = new wallet() + def buildTasks = [:] -def deployTasks = [:] -def remote_destination = [:] -def artifactsDir = 'out' -def container_info = [:] buildTasks.failFast = true -def repo_url = 'https://github.com/wavesplatform/WavesGUI.git' +def deployTasks = [:] +def electronContainerTasks = [:] +def electronMacTasks = [:] +def electronGlobalTasks = [:] +def winElectronBuildTasks = [:] +def macElectronBuildTasks = [:] +def source = false +def action = false +def repoUrl = 'https://github.com/wavesplatform/WavesGUI.git' def deploymentFile = "./kubernetes/waves-wallet-stage-io/deployment.yaml" -def pipeline_tasks = ['build': false, 'deploy': false, 'electron': false] -def pipeline_status = [:] -def pipeline_trigger_token = 'wavesGuiGithubToken' +def pipelineTriggerToken = 'wavesGuiGithubToken' +def gitDescribeTag = false +def windowsSingCertName = 'WavesPlatformLTD.pfx' +def macSingCertName = 'mac_app.p12' +def itemTemplate = [niceName: false, platform: false, dockerTag: false, containerInfo: false, buildTask: false, buildSuccess: false, buildArtifacts: false, deployTask: false, deploySuccess: false, deployArtifacts: false, remoteDestination: false] +def items = [wallet: itemTemplate.clone(), walletElectron: itemTemplate.clone(), electron: itemTemplate.clone()] +def slackChannelBuild = 'docker_builds' +def slackChannelDeploy = "waves-deploy-alerts" +items['wallet'].platform = 'web' +items['wallet'].niceName = 'wallet' +items['electron'].niceName = 'electron' +items['walletElectron'].platform = 'desktop' +items['walletElectron'].niceName = 'wallet-electron' + +def branchesOrTagsScript(String imageName, String repoUrl){ + return """ + if (binding.variables.get('action') == 'Deploy to stage' || binding.variables.get('action').contains('PROD')) { + ${getDockerTagsScript(imageName, Constants.WAVES_DOCKER_REGISTRY_CREDS, 'Waves')} + } else { + ${getGitBranchesScript(repoUrl)} + } + """ +} properties([ @@ -41,23 +68,23 @@ properties([ parameters([ // action - choose if you want to deploy or build or both - ut.choiceParameterObject('action', scripts.getActions()), + ut.choiceParameterObject('action', "return ['Build', 'Build and Deploy to stage', 'Deploy to stage', 'Deploy PROD mainnet', 'Deploy PROD testnet', 'Deploy PROD stagenet', 'Build Electron']"), // source depends on choice parameter above and dynamically // loads either Git repo branches for building or Docker Registry tags for deploy - ut.cascadeChoiceParameterObject('source', scripts.getBranchesOrTags('waves/wallet', 'Waves', repo_url), 'action', 'PARAMETER_TYPE_SINGLE_SELECT', true), + ut.cascadeChoiceParameterObject('source', branchesOrTagsScript('waves/wallet', repoUrl), 'action', 'PARAMETER_TYPE_SINGLE_SELECT', true), // image to deploy from - depends on choice parameter above and used if deploying is specified. - ut.cascadeChoiceParameterObject('image', scripts.getImages(), 'action'), + ut.cascadeChoiceParameterObject('image', wallet.getImages(), 'action'), // network is either mainnet, testnet or stagenet - depends on choice parameter above and used if deploying is specified. - ut.cascadeChoiceParameterObject('network', scripts.getNetworks(), 'action'), + ut.cascadeChoiceParameterObject('network', wallet.getNetworks(), 'action'), // destination is a remote server to deploy to - depends on choice parameter above and used if deploying is specified. - ut.cascadeChoiceParameterObject('destination', scripts.getDestinations(Constants.WAVES_WALLET_PROD_DOMAIN_NAMES, Constants.WAVES_WALLET_STAGE_SERVERS, true), 'action,image'), + ut.cascadeChoiceParameterObject('destination', wallet.getDestinations(wallet.wavesWalletProdDomainNames(), wallet.wavesWalletStageServers(), true), 'action,image'), // confirm is an extra check before we deploy to prod - ut.cascadeChoiceParameterObject('confirm', scripts.getConfirms(), 'action', 'PARAMETER_TYPE_CHECK_BOX'), + ut.cascadeChoiceParameterObject('confirm', wallet.getConfirms(), 'action', 'PARAMETER_TYPE_CHECK_BOX'), ]), // this is a trigger to run a build when hooks from GitHub received @@ -71,45 +98,49 @@ properties([ causeString: "Triggered by GitHub Webhook", printContributedVariables: true, printPostContent: true, - token: pipeline_trigger_token ] + token: pipelineTriggerToken ] ]) ]) -stage('Aborting this build'){ - // On the first launch pipeline doesn't have any parameters configured and must skip all the steps - if (env.BUILD_NUMBER == '1'){ - echo "This is the first run of the pipeline! It is now should be configured and ready to go!" +stage('Build info'){ + echo "Parameters specified: ${params}" + action = params.action + if ((params.action.contains('PROD') && ! params.confirm) || ! params.source || ! params.source.length() || params.source.contains('Please select parameter')){ + if (params.action.contains('PROD')) + echo "Aborting this build. Deploy to PROD ${params.network} was not confirmed." + else + echo "Aborting this build. Variable 'source' not defined." currentBuild.result = Constants.PIPELINE_ABORTED return } - - if (! source ) { - echo "Aborting this build. Please run it again with the required parameters specified." - currentBuild.result = Constants.PIPELINE_ABORTED - return + source = params.source + if (action.contains('Electron')){ + items['electron'].buildTask = true } - if (( action.contains('PROD') ) && ! confirm){ - echo "Aborting this build. Deploy to PROD ${network} was not confirmed." - currentBuild.result = Constants.PIPELINE_ABORTED - return + else if (action.contains('Build')){ + items.each{ + if (it.key != 'electron'){ + item = it.value + item.buildTask = true + item.dockerTag = source + '.latest' + } + } + } + if (action.contains('Deploy')){ + items.each{ + item = it.value + if (!action.contains('Build')) + item.dockerTag = source + if (it.key != 'electron' && (item.niceName == params.image || params.image == "both")) + item.deployTask = true + } } - else - echo "Parameters are specified:\n" + - "action: ${action}\n" + - "source: ${source}\n" + - "image: ${image}\n" + - "destination: ${destination}\n" + - "network: ${network}" - if (action.contains('Deploy')) pipeline_tasks['deploy'] = true - if (action.contains('Build') && ! action.contains('Electron')) pipeline_tasks['build'] = true - if (action.contains('Electron')) pipeline_tasks['electron'] = true } - if (currentBuild.result == Constants.PIPELINE_ABORTED){ return } - -timeout(time:20, unit:'MINUTES') { +println items +timeout(time:40, unit:'MINUTES') { node('buildagent'){ currentBuild.result = Constants.PIPELINE_SUCCESS timestamps { @@ -121,168 +152,226 @@ timeout(time:20, unit:'MINUTES') { sh 'env' step([$class: 'WsCleanup']) if (action.contains('Build')) { - ut.checkoutRelative(source, repo_url, 'WavesGUI', '') - - sh """ - mkdir ${artifactsDir} - cp -R ./WavesGUI/build-wallet/ ./WavesGUI/build-wallet-desktop/ - cp -R ./WavesGUI/ ./WavesGUI_tmp/ - cp -R ./WavesGUI_tmp/ ./WavesGUI/build-wallet/WavesGUI/ - mv ./WavesGUI_tmp/ ./WavesGUI/build-wallet-desktop/WavesGUI/ - """ + gitCheckout(branch: source, url: repoUrl, relativeTargetDir: 'WavesGUI') + + + dir ('WavesGUI'){ + gitDescribeTag = ut.shWithOutput("git describe --tags") + } + if (action.contains('Electron')) { - withCredentials([file(credentialsId: 'electron-signing-cert', variable: 'signingCert'), - file(credentialsId: 'electron-mac-signing-cert', variable: 'signingCertMac')]) { - sh "cp '${signingCert}' 'WavesGUI/WavesPlatformLTD.pfx'" - sh "cp '${signingCertMac}' 'WavesGUI/mac_app.p12'" - stash includes: '**', name: 'repo', useDefaultExcludes: false + dir ('WavesGUI'){ + withCredentials([ + file(credentialsId: 'electron-signing-cert', variable: 'signingCert'), + file(credentialsId: 'electron-mac-signing-cert', variable: 'signingCertMac'), + string(credentialsId: 'electron-signing-cert-passphrase', variable: 'winCertPass'), + string(credentialsId: 'electron-mac-signing-cert-passphrase', variable: 'macCertPass') + ]){ + sh "cp '${signingCert}' '${windowsSingCertName}'" + sh "cp '${signingCertMac}' '${macSingCertName}'" + writeFile file: './jenkinsBuildElectronScript.sh', text: wallet.wavesElectronInstallScript(windowsSingCertName, winCertPass, macSingCertName, macCertPass) + sh "chmod 700 '${windowsSingCertName}' '${macSingCertName}' 'jenkinsBuildElectronScript.sh'" + } + } } - source += '.latest' + + stash includes: 'WavesGUI/**,', name: 'repo' + + // this two lines are for compatibility with the branches that already exist + // after 'build-wallet' files are replaced in all branches in the repo - these checks can be removed + // and commented code should be uncommented + // once 'newApproach' is merged to dev/master - rename the branch in the string below: + gitCheckout(branch: 'newApproach', url: repoUrl, relativeTargetDir: 'newTemplate') + + dir('newTemplate/build-wallet'){ + stash includes: '**', name: 'docker', useDefaultExcludes: false + } + + // dir('WavesGUI/build-wallet'){ + // stash includes: '**', name: 'docker', useDefaultExcludes: false + // } } if (action.contains('Deploy')) { - ut.checkoutRelative('master', Constants.KUBERNETES_REPO, 'kubernetes', Constants.KUBERNETES_REPO_CREDS) + gitCheckout(url: Constants.KUBERNETES_REPO, relativeTargetDir: 'kubernetes', repoCreds: Constants.KUBERNETES_REPO_CREDS) } - } - ['wallet', 'wallet-electron'].each{ serviceName -> - buildTasks["Building " + serviceName] = { - dir(Constants.DOCKERFILE_LOCATION_MAP[serviceName]) { - stage("Building " + serviceName) { - pipeline_status["built-${serviceName}"] = false - if (pipeline_tasks['build']) { - def platform = (serviceName == 'wallet') ? 'web' : 'desktop' - - // configure nginx template - def waves_wallet_nginx_map = Constants.WAVES_WALLET_NGINX_MAP.clone() - waves_wallet_nginx_map.nginx_platform = "${platform}" - String nginxConfFileContent = ut.replaceTemplateVars('./nginx/default_template.conf', waves_wallet_nginx_map) - writeFile file: './nginx/default.conf', text: nginxConfFileContent - - // configure Dockerfile template - def waves_wallet_dockerfile_map = [jenkins_platform: platform, trading_view_token: '$trading_view_token'] - String dockerfileConfFileContent = ut.replaceTemplateVars('./Dockerfile_template', waves_wallet_dockerfile_map) - writeFile file: './Dockerfile', text: dockerfileConfFileContent - - // configure a page with container_info which - // contains all info about Jenkins build and git parameters - container_info["${serviceName}"] = "" + - "

Job name: ${env.JOB_NAME}

" + - "

Job build tag: ${env.BUILD_TAG}

" + - "

Docker image: ${Constants.DOCKER_REGISTRY}/waves/${serviceName}:${source}

" + - "

Web environment: \${WEB_ENVIRONMENT}

" - - writeFile file: './info.html', text: container_info["${serviceName}"] - - // copy all the generated text files - sh """ - cp ./nginx/default.conf "${env.WORKSPACE}/${artifactsDir}/default.conf-${serviceName}" - cp ./Dockerfile "${env.WORKSPACE}/${artifactsDir}/Dockerfile-${serviceName}" - cp ./info.html "${env.WORKSPACE}/${artifactsDir}/info.html-${serviceName}" - """ - - // run build - ut.buildDockerImage('waves/' + serviceName, source.split("\\.")[0], "--build-arg trading_view_token=${Constants.WAVES_WALLET_TRADING_VIEW_TOKEN} --build-arg platform=${platform}") - pipeline_status["built-${serviceName}"] = true - ut.notifySlack("docker_builds", - currentBuild.result, - "Built image: ${Constants.DOCKER_REGISTRY}/waves/${serviceName}:${source}") + } + items.each{ + def item = it.value + buildTasks["Building " + item.niceName] = { + stage("Building " + item.niceName) { + dir(it.key){ + if (item.buildTask) { + if (it.key == 'electron'){ + item.buildArtifacts = it.key + '-electronArtifacts-' + electronGlobalTasks['container']={ + node("wavesnode||vostok"){ + step([$class: 'WsCleanup']) + electronContainerTasks['linux'] = { + dir('linux'){ + try{ + docker.image('node').inside("-u 0"){ + unstash name: 'repo' + wallet.launchElectronContainerBuild('linux') + } + } + finally{ + sh 'sudo chmod -R 777 ./' + stash includes: '**/Waves*.deb', name: item.buildArtifacts + 'linux', allowEmpty: true + } + } + } + // electronContainerTasks['windows'] = { + // dir('windows'){ + // try{ + // docker.image('electronuserland/builder:wine').inside("-u 0"){ + // unstash name: 'repo' + // wallet.launchElectronContainerBuild('win') + // } + // } + // finally{ + // sh 'sudo chmod -R 777 ./' + // stash includes: '**/waves*.exe,**/Waves*.exe', name: 'win', allowEmpty: true, excludes: '**/Waves DEX.exe' + // } + // } + // } + parallel electronContainerTasks + } + } + electronGlobalTasks['mac']={ + node('electron'){ + step([$class: 'WsCleanup']) + electronMacTasks['windowsVagrant'] = { + dir('windowsVagrant'){ + try{ + wallet.removeElectronBuilderVM() + unstash name: 'repo' + writeFile file: 'Vagrantfile', text: wallet.wavesElectronVagrantfile() + winElectronBuildTasks['windowsVagrant'] = { + sh 'vagrant up && pkill -f tail' + } + winElectronBuildTasks['windowsVagrantLog'] = { + sleep 20 + sh 'touch WavesGUI/electron.log && tail -f WavesGUI/electron.log || true' + } + parallel winElectronBuildTasks + } + finally{ + stash includes: '**/waves*.exe,**/Waves*.exe', name: item.buildArtifacts + 'win', allowEmpty: true, excludes: '**/Waves DEX.exe' + wallet.removeElectronBuilderVM() + } + } + } + electronMacTasks['mac'] = { + dir('mac'){ + try{ + unstash name: 'repo' + dir('WavesGUI'){ + withCredentials([usernamePassword(credentialsId: 'appleid-specific-password-for-electron-notarization', usernameVariable: 'appleIdUsername', passwordVariable: 'appleIdPassword')]) { + def macNotarizeMap = [appleIdUsername: appleIdUsername, appleIdPassword: appleIdPassword] + cookThisTemplate( + templateMap: macNotarizeMap, + template: './electron/notarize.ts' + ) + } + sh "PATH=/usr/local/opt/node@10/bin:${PATH} DEBUG=electron* ./jenkinsBuildElectronScript.sh mac" + } + } + finally{ + stash includes: '**/Waves*.dmg', name: item.buildArtifacts + 'mac', allowEmpty: true + } + } + } + parallel electronMacTasks + } + } + parallel electronGlobalTasks + item.buildSuccess = true + slackIt(channel: slackChannelBuild, message: "Built electron images. <${env.BUILD_URL}/|`Click me to download!`>") + } + else{ + step([$class: 'WsCleanup']) + unstash name: 'repo' + unstash name: 'docker' + + // configure nginx template + def wavesWalletNginxMap = wallet.wavesWalletNginxMap().clone() + wavesWalletNginxMap.nginxPlatform = item.platform + cookThisTemplate( + templateMap: wavesWalletNginxMap, + template: './nginx/default.conf' + ) + + // configure Dockerfile template + def wavesWalletDockerfileMap = [jenkinsPlatform: item.platform] + cookThisTemplate( + templateMap: wavesWalletDockerfileMap, + template: './Dockerfile' + ) + + // configure a page with container_info which + // contains all info about Jenkins build and git parameters + item.containerInfo = wallet.wavesWalletContainerInfo(gitDescribeTag, item.niceName, item.dockerTag) + writeFile file: './info.html', text: item.containerInfo + + // copy all the generated text files + item.buildArtifacts = it.key + '-dockerBuildArtifacts' + stash includes: 'nginx/default.conf,Dockerfile,info.html', allowEmpty: true, name: item.buildArtifacts + + imageIt( + imageName: 'waves/' + item.niceName, + dockerTag: item.dockerTag, + args: " --build-arg trading_view_token=${wallet.wavesWalletTradingViewToken()}" + + " --build-arg platform=${item.platform}" + + " --no-cache" + ) + item.buildSuccess = true + slackIt(channel: slackChannelBuild, message: "Built image: ${Constants.DOCKER_REGISTRY}/waves/${item.niceName}:${item.dockerTag}") + } } else{ - org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Building " + serviceName) + org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Building " + item.niceName) } } } } } parallel buildTasks - stage("Building Electron") { - if (pipeline_tasks['electron']) { - node('mobile'){ - step([$class: 'WsCleanup']) - unstash name: "repo" - withCredentials([string(credentialsId: 'electron-signing-cert-passphrase', variable: 'signingCertPassphrase'), string(credentialsId: 'electron-mac-signing-cert-passphrase', variable: 'signingMacCertPassphrase')]) { - dir('WavesGUI'){ - pipeline_status["built-electron"] = false - sh """ - export DEBUG=electron-builder - npm cache --force clean - npm ci --unsafe-perm - node_modules/.bin/gulp build --platform desktop --config ./configs/mainnet.json - cd ./dist/desktop/mainnet && npm i --unsafe-perm && cd ../../../ - WIN_CSC_LINK=WavesPlatformLTD.pfx \ - WIN_CSC_KEY_PASSWORD=${signingCertPassphrase} \ - CSC_LINK=mac_app.p12 \ - CSC_KEY_PASSWORD=${signingMacCertPassphrase} \ - WAVES_CONFIGURATION=mainnet \ - ./node_modules/.bin/build -mwl -p never \ - --config.directories.app=dist/desktop/mainnet - """ - stash includes: '**/mainnet/*.deb, **/mainnet/*.dmg, **/mainnet/*.exe', name: 'electron-clients' - pipeline_status["built-electron"] = true - ut.notifySlack("docker_builds", currentBuild.result, "Built Electron clients") + items.findAll{ it.key !='electron' }.collect{ + println it + def item = it.value + item.remoteDestination = destination + deployTasks["Deploying " + item.niceName] = { + stage("Deploying " + item.niceName) { + if (item.deployTask){ + + def wavesWalletDeploymentMap = [ + domainName: item.remoteDestination.replaceAll("\\.","-"), + network: network, + tag: item.dockerTag, + imageName: item.niceName + ] + + if (action.contains('PROD')) { + item.remoteDestination = wallet.wavesWalletProdDomainNames()[network + '-' + item.niceName] + deploymentFile = "./kubernetes/waves-wallet-${network}/deployment.yaml" + wavesWalletDeploymentMap.domainName = wallet.wavesWalletProdDomainNames()[network + '-' + item.niceName].replaceAll("\\.","-") } - } - } - - ['wallet', 'wallet-electron'].each{ serviceName -> - org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Building " + serviceName) - } - }else{ - org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Building Electron") - } - } - ['wallet', 'wallet-electron'].each{ serviceName -> - remote_destination[serviceName] = destination - deployTasks["Deploying " + serviceName] = { - stage("Deploying " + serviceName) { - pipeline_status["deployed-${serviceName}"] = false - if (action.contains('Deploy')) { - if (image == serviceName || image =="both" ) { - def waves_wallet_deployment_map = [ - domain_name: remote_destination[serviceName].replaceAll("\\.","-"), - network: network, - tag: source, - image: serviceName, - current_date: "'${ut.shWithOutput('date +%s')}'" - ] - - if (action.contains('PROD')) { - remote_destination[serviceName] = Constants.WAVES_WALLET_PROD_DOMAIN_NAMES[network + '-' + serviceName] - deploymentFile = "./kubernetes/waves-wallet-${network}/deployment.yaml" - waves_wallet_deployment_map.domain_name = Constants.WAVES_WALLET_PROD_DOMAIN_NAMES[network + '-' + serviceName].replaceAll("\\.","-") - } - // configure deployment template - String deploymentConfFileContent = ut.replaceTemplateVars(deploymentFile, waves_wallet_deployment_map) - def deployment_config = "./${artifactsDir}/${serviceName}-deployment.yaml" - writeFile file: "./${artifactsDir}/${serviceName}/${serviceName}-deployment.yaml", text: deploymentConfFileContent - - // deploy container to kuber - withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: Constants.AWS_KUBERNETES_KEY, secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { - sh """ - docker run -i --rm \ - -v "${env.WORKSPACE}/${artifactsDir}/${serviceName}":/root/app \ - -e AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" \ - -e AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" \ - -e KUBE_CLUSTER_NAME="${Constants.AWS_KUBERNETES_KUBE_CLUSTER_NAME}" \ - -e AWS_REGION="${Constants.AWS_KUBERNETES_AWS_REGION}" \ - -e CONFIG_PATH="${serviceName}-deployment.yaml" \ - "${Constants.DOCKER_KUBERNETES_EXECUTOR_IMAGE}" - """ - } - pipeline_status["deployed-${serviceName}"] = true - ut.notifySlack("waves-deploy-alerts", - currentBuild.result, - "Deployed image:\n${Constants.DOCKER_REGISTRY}/waves/${serviceName}:${source} ${network} to ${remote_destination[serviceName]}") + def deploymentFileOutput = kubeIt( + deploymentTemplate: deploymentFile, + deploymentMap: wavesWalletDeploymentMap + ) + item.deployArtifacts = item.niceName + '-kubeDeployArtifacts' + stash includes: 'kubeItOut/**', allowEmpty: true, name: item.deployArtifacts - } else { - org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Deploying " + serviceName) - } + item.deploySuccess = true + slackIt(channel: slackChannelDeploy, message: "Deployed image:\n${Constants.DOCKER_REGISTRY}/waves/${item.niceName}:${item.dockerTag} ${network} to ${item.remoteDestination}") } else { - org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Deploying " + serviceName) + org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional("Deploying " + item.niceName) } } } @@ -301,30 +390,42 @@ timeout(time:20, unit:'MINUTES') { println(err.toString()) } finally{ - ['wallet', 'wallet-electron'].each{ serviceName -> - if (pipeline_tasks['build'] && ! pipeline_status["built-${serviceName}"]) - ut.notifySlack("docker_builds", - currentBuild.result, - "Failed to build image: ${Constants.DOCKER_REGISTRY}/waves/${serviceName}:${source}") - - if (pipeline_tasks['deploy'] && !pipeline_status["deployed-${serviceName}"]) - if (image == serviceName || image =="both" ) { - ut.notifySlack("waves-deploy-alerts", - currentBuild.result, - "Failed to deploy image:\n${Constants.DOCKER_REGISTRY}/waves/${serviceName}:${source} ${network} to ${remote_destination[serviceName]}") - } - } - if (pipeline_tasks['electron']) { - if (! pipeline_status["built-electron"]){ - ut.notifySlack("docker_builds", currentBuild.result, "Failed to build Electron clients") - } else{ - dir("${artifactsDir}") { - unstash "electron-clients" + items.each{ + def item = it.value + if (item.buildTask && !item.buildSuccess) + if (item.niceName == 'electron') + slackIt(channel: slackChannelBuild, buildStatus: currentBuild.result, message: "Failed to build electron images in branch ${source}") + else + slackIt(channel: slackChannelBuild, buildStatus: currentBuild.result, message: "Failed to build image: ${Constants.DOCKER_REGISTRY}/waves/${item.niceName}:${item.dockerTag}") + + if (item.deployTask && !item.deploySuccess) + slackIt(channel: slackChannelBuild, buildStatus: currentBuild.result, message: "Failed to deploy image:\n${Constants.DOCKER_REGISTRY}/waves/${item.niceName}:${item.dockerTag} ${network} to ${item.remoteDestination}") + + dir("out/${item.niceName}"){ + if(item.buildArtifacts){ + if (it.key == 'electron'){ + ['linux','mac','win'].each{ os -> + dir(os){ + unstash name: item.buildArtifacts + os + } + } + // dir("winOnLinux"){ + // unstash name: 'win' + // } + } else{ + unstash name: item.buildArtifacts + } } + if(item.deployArtifacts) + unstash name: item.deployArtifacts } + + } + dir("out"){ + def isNotEmpty = ut.shWithOutput('ls') + if (isNotEmpty) + archiveArtifacts artifacts: "**/**" } - sh "tar -czvf artifacts.tar.gz -C ./${artifactsDir} ." - archiveArtifacts artifacts: 'artifacts.tar.gz' } } } diff --git a/build-wallet/Dockerfile_template b/build-wallet/Dockerfile similarity index 81% rename from build-wallet/Dockerfile_template rename to build-wallet/Dockerfile index 3f82de116b..17fd22a7c2 100644 --- a/build-wallet/Dockerfile_template +++ b/build-wallet/Dockerfile @@ -1,10 +1,10 @@ -FROM node:lts-alpine as trading-view-${jenkins_platform} +FROM node:lts-alpine as trading-view-${jenkinsPlatform} ARG trading_view_token WORKDIR /root -RUN echo "//registry.npmjs.org/:_authToken=${trading_view_token}" > /root/.npmrc && \ +RUN echo "//registry.npmjs.org/:_authToken=\$trading_view_token" > /root/.npmrc && \ npm i @waves/trading-view -FROM node:lts-alpine as static-${jenkins_platform} +FROM node:lts-alpine as static-${jenkinsPlatform} RUN apk update && apk add git COPY ./WavesGUI/ /srv/www/WavesGUI/ @@ -30,8 +30,8 @@ RUN mkdir -p /etc/nginx/sites-enabled && \ apk update && \ apk add gettext libintl WORKDIR /srv/www -COPY --from=trading-view-${jenkins_platform} /root/node_modules node_modules -COPY --from=static-${jenkins_platform} /srv/www . +COPY --from=trading-view-${jenkinsPlatform} /root/node_modules node_modules +COPY --from=static-${jenkinsPlatform} /srv/www . COPY ./nginx/default.conf /etc/nginx/sites-available/default.conf COPY ./info.html /srv/www/info COPY ./nginx/nginx.conf /etc/nginx/nginx.conf diff --git a/build-wallet/nginx/default_template.conf b/build-wallet/nginx/default.conf similarity index 58% rename from build-wallet/nginx/default_template.conf rename to build-wallet/nginx/default.conf index 4b5306e725..643d0dc1e0 100644 --- a/build-wallet/nginx/default_template.conf +++ b/build-wallet/nginx/default.conf @@ -19,20 +19,20 @@ server { server { listen 80; - server_name ${nginx_server_name}; + server_name ${nginxServerName}; index index.html index.htm; - access_log syslog:server=td-agent-${nginx_access_log_address} nginx_ltsv_access; - error_log syslog:server=td-agent-${nginx_error_log_address} error; + access_log syslog:server=td-agent-${nginxAccessLogAddress} nginx_ltsv_access; + error_log syslog:server=td-agent-${nginxErrorLogAddress} error; rewrite ^/(.*)/\$ /\$1 permanent; - root /srv/www/WavesGUI/dist/${nginx_platform}/\${WEB_ENVIRONMENT}/; + root /srv/www/WavesGUI/dist/${nginxPlatform}/\${WEB_ENVIRONMENT}/; add_header X-Frame-Options "SAMEORIGIN"; add_header Access-Control-Allow-Origin *; add_header Referrer-Policy origin always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection "1; mode=block" always; add_header strict-transport-security "max-age=2592000; includeSubDomains" always; - add_header Content-Security-Policy "default-src * 'unsafe-inline' data: blob: https:; script-src 'self' ${nginx_security_policy_domains} 'unsafe-inline' 'unsafe-eval' blob:; upgrade-insecure-requests; report-uri ${nginx_security_policy_domain}-uri.com/r/d/csp/enforce" always; + add_header Content-Security-Policy "default-src * 'unsafe-inline' data: blob: https:; script-src 'self' ${nginxSecurityPolicyDomains} 'unsafe-inline' 'unsafe-eval' blob:; upgrade-insecure-requests; report-uri ${nginxSecurityPolicyDomain}-uri.com/r/d/csp/enforce" always; location /img/images-list.json { auth_basic off; @@ -48,8 +48,12 @@ server { rewrite /wallet /wallet/assets; } - location ~ ^/(sign-up|switch|migrate|sign-in|dex-demo|dex|wallet/transactions|wallet/portfolio|wallet/assets|import/ledger|import/restore|import|restore|export|create|tokens) { - rewrite /(sign-up|switch|migrate|sign-in|dex-demo|dex|wallet/transactions|wallet/portfolio|wallet/assets|import/ledger|import/restore|import|restore|export|create|tokens) /index.html; + location ~ ^/(sign-in|dex-demo|dex|wallet/transactions|wallet/portfolio|wallet/assets|import/ledger|import/restore|import|restore|export|create|tokens) { + rewrite /(sign-in|dex-demo|dex|wallet/transactions|wallet/portfolio|wallet/assets|import/ledger|import/restore|import|restore|export|create|tokens) /index.html; + } + + location = /keeper.html { + add_header X-Frame-Options ""; } location /trading-view { diff --git a/electron-builder.yml b/electron-builder.yml index 0cf0010723..d2071c23c4 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -1,12 +1,11 @@ productName: "Waves DEX" -appId: "com.wavesplatform.client.lite" +appId: "com.wavesplatform.client" copyright: "Waves Platform" - +afterSign: "./notarize.js" compression: normal npmRebuild: true artifactName: "${productName}[${env.WAVES_CONFIGURATION}]-${version}-${os}-${arch}.${ext}" asar: true - directories: buildResources: electron/ output: "release/${env.WAVES_CONFIGURATION}" @@ -23,8 +22,8 @@ win: mac: hardenedRuntime: true gatekeeperAssess: false - entitlements: "electron/entitlements.mac.plist" - entitlementsInherit: "electron/entitlements.mac.plist" + entitlements: "electron/dex.wavesplatform.client.entitlements.plist" + entitlementsInherit: "electron/dex.wavesplatform.client.entitlements.plist" category: "public.app-category.finance" target: dmg icon: "electron/icons/icon.icns" @@ -48,7 +47,6 @@ deb: # --- Default END nsis: - artifactName: "waves-client[${env.WAVES_CONFIGURATION}]-setup-${version}.${ext}" include: "electron/installer.nsh" installerIcon: "electron/icons/icon.ico" uninstallerIcon: "electron/icons/icon.ico" @@ -58,3 +56,4 @@ nsis: dmg: icon: "electron/icons/icon.icns" background: "electron/icons/macos-installer-bg.tiff" + sign: false diff --git a/electron/Bridge.ts b/electron/Bridge.ts index 5b8c1b9fa3..d873413a76 100644 --- a/electron/Bridge.ts +++ b/electron/Bridge.ts @@ -50,13 +50,16 @@ export class Bridge implements IBridge { const path = app.getPath('downloads'); const options = { defaultPath: join(path, data.fileName) }; - dialog.showSaveDialog(this.main.mainWindow, options, function (filename) { - if (filename) { - return write(filename, data.fileContent).then(resolve, reject); - } else { - return reject(new Error('Cancel')); + return dialog.showSaveDialog(this.main.mainWindow, options).then( + function (saveDialogValue) { + if (saveDialogValue.filePath) { + return write(saveDialogValue.filePath, data.fileContent).then(resolve, reject); + } else { + return reject(new Error('Cancel')); + } } - }); + ); + }); } diff --git a/electron/constansts.ts b/electron/constansts.ts index e45c0a6170..dd6d26c6fc 100644 --- a/electron/constansts.ts +++ b/electron/constansts.ts @@ -1,4 +1,4 @@ -import MenuItemConstructorOptions = Electron.MenuItemConstructorOptions; +import { MenuItemConstructorOptions, MenuItem } from 'electron'; export const META_NAME = 'meta.json'; @@ -51,8 +51,8 @@ export const GET_MENU_LIST = (app, t, hasDevTools) => [ } : null ].filter(Boolean) as MenuItemConstructorOptions[]; -export const CONTEXT_MENU = t => [ - { label: t('menu.cut'), accelerator: 'CmdOrCtrl+X', role: 'cut' }, - { label: t('menu.copy'), accelerator: 'CmdOrCtrl+C', role: 'copy' }, - { label: t('menu.paste'), accelerator: 'CmdOrCtrl+V', role: 'paste' } +export const CONTEXT_MENU = locale => [ + new MenuItem({ label: locale('menu.cut'), accelerator: 'CmdOrCtrl+X', role: 'cut' }), + new MenuItem({ label: locale('menu.copy'), accelerator: 'CmdOrCtrl+C', role: 'copy' }), + new MenuItem({ label: locale('menu.paste'), accelerator: 'CmdOrCtrl+V', role: 'paste' }), ]; diff --git a/electron/dex.wavesplatform.client.entitlements.plist b/electron/dex.wavesplatform.client.entitlements.plist new file mode 100644 index 0000000000..7c267e8b57 --- /dev/null +++ b/electron/dex.wavesplatform.client.entitlements.plist @@ -0,0 +1,20 @@ + + + + + com.apple.security.automation.apple-events + + com.apple.security.cs.debugger + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.allow-dyld-environment-variables + + + \ No newline at end of file diff --git a/electron/entitlements.mac.plist b/electron/entitlements.mac.plist deleted file mode 100644 index d6b93bc0b2..0000000000 --- a/electron/entitlements.mac.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.cs.allow-unsigned-executable-memory - - - diff --git a/electron/main.ts b/electron/main.ts index c4990ff24d..0f3ef65944 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -89,19 +89,17 @@ class Main implements IMain { this.addContextMenu(); } - private makeSingleInstance(): boolean { - const isOpenClient = app.makeSingleInstance((argv) => { - const link = argv.find(hasProtocol) || ''; - - this.openProtocolIn(link); - }); - - if (isOpenClient) { + private makeSingleInstance() { + const gotTheLock = app.requestSingleInstanceLock(); + const argv = process.argv; + const link = argv.find(hasProtocol) || ''; + this.openProtocolIn(link); + + if (!gotTheLock) { app.quit(); } - - return !isOpenClient; - } + return gotTheLock; + } private openProtocolIn(browserLink) { if (!browserLink || !hasProtocol(browserLink)) { @@ -211,10 +209,14 @@ class Main implements IMain { } private createCtxMenu(locale) { - const onContextMenu = (menu: Menu): () => void => () => menu.popup({}); + const onContextMenu = (menu: Menu) => () => { + menu.popup({}); + }; + if (this.ctxMenuList.length > 0) { this.mainWindow.webContents.removeAllListeners('context-menu'); } + const ctxMenuTemplate = CONTEXT_MENU(locale); const ctxMenu = Menu.buildFromTemplate(ctxMenuTemplate); this.ctxMenuList.push(ctxMenu); diff --git a/electron/notarize.ts b/electron/notarize.ts new file mode 100644 index 0000000000..474203bb3d --- /dev/null +++ b/electron/notarize.ts @@ -0,0 +1,45 @@ +const notarize = require ('electron-notarize').notarize; +const fs = require('fs'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); +const access = fs.createWriteStream('./out.log'); +process.stdout.write = process.stderr.write = access.write.bind(access); + +process.on('uncaughtException', function(err) { + console.error((err && err.stack) ? err.stack : err); +}); + +async function notarizeAppInfo() { + const { stdout, stderr } = await exec("\ + { sleep 30 && xcrun altool --notarization-history 0 -u '${appleIdUsername}' -p '${appleIdPassword}' || true ;} && \ + { xcrun altool --notarization-info \$(cat out.log | grep 'checking notarization status' | cut -d':' -f2 | cut -d' ' -f2 | \ + tail -1) -u '${appleIdUsername}' -p '${appleIdPassword}' || true ;} && \ + { xcrun stapler staple -v './release/mainnet/mac/Waves DEX.app' || true ;}"); + console.log(`\${stdout}`); + if (stderr) { + console.error("error: \${stderr}"); + } +} + +async function notarizeApp () { + try { + await notarize({ + appBundleId: 'com.wavesplatform.client', + appPath: 'release/mainnet/mac/Waves DEX.app', + appleId: '${appleIdUsername}', + appleIdPassword: '${appleIdPassword}' + }); + } + catch(err){ + console.log(err); + return true; + } +} + +module.exports = async function sequence(context) { + const {electronPlatformName} = context; + if (electronPlatformName === 'darwin') { + await notarizeApp(); + await notarizeAppInfo(); + } +}; diff --git a/package-lock.json b/package-lock.json index 7560bd56f7..61f53aae77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "7zip-bin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.1.0.tgz", - "integrity": "sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", + "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", "dev": true }, "@babel/code-frame": { @@ -167,6 +167,16 @@ "to-fast-properties": "^2.0.0" } }, + "@develar/schema-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, "@ledgerhq/devices": { "version": "4.70.0", "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-4.70.0.tgz", @@ -390,9 +400,9 @@ "dev": true }, "@types/debug": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.4.tgz", - "integrity": "sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", "dev": true }, "@types/events": { @@ -1127,9 +1137,9 @@ } }, "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, "align-text": { @@ -1302,41 +1312,39 @@ } }, "app-builder-bin": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.6.6.tgz", - "integrity": "sha512-G0Ee6xkbxV+fvM/7xXWIgSDjWAD4E/d/aNbxerq/TVsCyBIau/0VPmrEqBMyZv0NbTwLDW5aF/yHG+0ZEY77kA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz", + "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==", "dev": true }, "app-builder-lib": { - "version": "20.43.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.43.0.tgz", - "integrity": "sha512-8OhRPGbTFsgBn07mcG1x0FApqsLLQkNMrdl2sBPo/haI/E1QqhN4DU5x7nKbbFwnsG2XvqvBBZwnMV3FXgDi9Q==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz", + "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==", "dev": true, "requires": { - "7zip-bin": "~4.1.0", - "app-builder-bin": "2.6.6", + "7zip-bin": "~5.0.3", + "@develar/schema-utils": "~2.1.0", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "10.0.2", - "builder-util-runtime": "8.2.4", + "builder-util": "21.2.0", + "builder-util-runtime": "8.3.0", "chromium-pickle-js": "^0.2.0", "debug": "^4.1.1", - "ejs": "^2.6.1", - "electron-osx-sign": "0.4.11", - "electron-publish": "20.43.0", - "fs-extra-p": "^8.0.2", + "ejs": "^2.6.2", + "electron-publish": "21.2.0", + "fs-extra": "^8.1.0", "hosted-git-info": "^2.7.1", "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.0", + "isbinaryfile": "^4.0.2", "js-yaml": "^3.13.1", "lazy-val": "^1.0.4", "minimatch": "^3.0.4", "normalize-package-data": "^2.5.0", - "plist": "^3.0.1", - "read-config-file": "3.2.2", - "sanitize-filename": "^1.6.1", - "semver": "^6.1.1", - "temp-file": "^3.3.2" + "read-config-file": "5.0.0", + "sanitize-filename": "^1.6.2", + "semver": "^6.3.0", + "temp-file": "^3.3.4" }, "dependencies": { "debug": { @@ -1348,62 +1356,42 @@ "ms": "^2.1.1" } }, - "electron-osx-sign": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz", - "integrity": "sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ==", + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "isbinaryfile": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.1.tgz", - "integrity": "sha512-bvJxbNWm72dy/1+qeBm9F8wUM4siDnlzid7NN5Ib4nQcc0tNIx/YWgEih1ZRHXr8xVbpGk1ccLlA9gOSlyx3gw==", + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "isbinaryfile": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz", + "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "normalize-package-data": { @@ -1419,43 +1407,35 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, - "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "path-parse": "^1.0.6" } }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "truncate-utf8-bytes": "^1.0.0" } }, "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2974,9 +2954,9 @@ }, "dependencies": { "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", "dev": true } } @@ -3470,24 +3450,24 @@ "dev": true }, "builder-util": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-10.0.2.tgz", - "integrity": "sha512-Dt11O/MTdCsaCjAdnkVVcDSSkQEkvPWAs18sNQBc6l6wt5RvzcI4nfgpLxwbUi/DkCpHCltUgIj94TLQXQv1bw==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz", + "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==", "dev": true, "requires": { - "7zip-bin": "~4.1.0", + "7zip-bin": "~5.0.3", "@types/debug": "^4.1.4", - "app-builder-bin": "2.6.6", + "app-builder-bin": "3.4.3", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "^8.2.4", + "builder-util-runtime": "8.3.0", "chalk": "^2.4.2", "debug": "^4.1.1", - "fs-extra-p": "^8.0.2", + "fs-extra": "^8.1.0", "is-ci": "^2.0.0", "js-yaml": "^3.13.1", - "source-map-support": "^0.5.12", + "source-map-support": "^0.5.13", "stat-mode": "^0.3.0", - "temp-file": "^3.3.2" + "temp-file": "^3.3.4" }, "dependencies": { "chalk": { @@ -3510,23 +3490,57 @@ "ms": "^2.1.1" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "builder-util-runtime": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.4.tgz", - "integrity": "sha512-iwRnmFnGs63+p6uJem2N/d9Q0SKj5c0TP8PTesKnWsWvo1saKKM/0yiT137w+3uz+r/Cmf8VH/8nt75uW8jeUw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", + "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", "dev": true, "requires": { - "bluebird-lst": "^1.0.9", "debug": "^4.1.1", - "fs-extra-p": "^8.0.2", "sax": "^1.2.4" }, "dependencies": { @@ -3540,9 +3554,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -3577,38 +3591,41 @@ } }, "cacheable-request": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.0.0.tgz", - "integrity": "sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { "clone-response": "^1.0.2", - "get-stream": "^4.0.0", + "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", - "lowercase-keys": "^1.0.1", - "normalize-url": "^3.1.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", "responselike": "^1.0.2" }, "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { "pump": "^3.0.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5234,19 +5251,64 @@ } }, "dmg-builder": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.6.4.tgz", - "integrity": "sha512-neJXwnFaJ4wisP++Yyi9H0kEUsvxyY7TBBEK2fu8V8i1VoMQKljY/6Dgf2HktLVHzXSWP71TQwKKWSIWI/3aeQ==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz", + "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==", "dev": true, "requires": { - "app-builder-lib": "~20.43.0", + "app-builder-lib": "~21.2.0", "bluebird-lst": "^1.0.9", - "builder-util": "~10.0.2", - "fs-extra-p": "^8.0.2", - "iconv-lite": "^0.4.24", + "builder-util": "~21.2.0", + "fs-extra": "^8.1.0", + "iconv-lite": "^0.5.0", "js-yaml": "^3.13.1", - "parse-color": "^1.0.0", - "sanitize-filename": "^1.6.1" + "sanitize-filename": "^1.6.2" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "iconv-lite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + } } }, "doctrine": { @@ -5300,15 +5362,15 @@ } }, "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", "dev": true }, "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, "duplexer": { @@ -5444,41 +5506,49 @@ "dev": true }, "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", "dev": true }, "electron": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.13.tgz", - "integrity": "sha512-8ouYaLsp0F4sPI7QKgJkkJhrwj1JPSnBwbz6HHA9l6u7WofEt94lV+gHw71KJrDl7UaIkFwlSjyhIjG8lIZqxw==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/electron/-/electron-6.0.12.tgz", + "integrity": "sha512-70ODZa1RP6K0gE9IV9YLCXPSyhLjXksCuYSSPb3MljbfwfHo5uE6X0CGxzm+54YuPdE2e7EPnWZxOOsJYrS5iQ==", "dev": true, "requires": { - "@types/node": "^8.0.24", - "electron-download": "^3.0.1", + "@types/node": "^10.12.18", + "electron-download": "^4.1.0", "extract-zip": "^1.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==", + "dev": true + } } }, "electron-builder": { - "version": "20.43.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.43.0.tgz", - "integrity": "sha512-8trMnW3K2BWtPGQJqCWZ5QMwZajMucmzlTCHrzhufQWuQbaPhanmho6tWFm2ftyuYku3T4TB4kD7UCX/YQDGyg==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.2.0.tgz", + "integrity": "sha512-x8EXrqFbAb2L3N22YlGar3dGh8vwptbB3ovo3OF6K7NTpcsmM2zEoJv7GhFyX73rNzSG2HaWpXwGAtOp2JWiEw==", "dev": true, "requires": { - "app-builder-lib": "20.43.0", + "app-builder-lib": "21.2.0", "bluebird-lst": "^1.0.9", - "builder-util": "10.0.2", - "builder-util-runtime": "8.2.4", + "builder-util": "21.2.0", + "builder-util-runtime": "8.3.0", "chalk": "^2.4.2", - "dmg-builder": "6.6.4", - "fs-extra-p": "^8.0.2", + "dmg-builder": "21.2.0", + "fs-extra": "^8.1.0", "is-ci": "^2.0.0", "lazy-val": "^1.0.4", - "read-config-file": "3.2.2", - "sanitize-filename": "^1.6.1", - "update-notifier": "^3.0.0", - "yargs": "^13.2.4" + "read-config-file": "5.0.0", + "sanitize-filename": "^1.6.2", + "update-notifier": "^3.0.1", + "yargs": "^13.3.0" }, "dependencies": { "ansi-regex": { @@ -5487,12 +5557,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5515,43 +5579,6 @@ "wrap-ansi": "^5.1.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -5561,25 +5588,27 @@ "locate-path": "^3.0.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "is-fullwidth-code-point": { @@ -5588,13 +5617,13 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "graceful-fs": "^4.1.6" } }, "locate-path": { @@ -5607,38 +5636,10 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -5659,22 +5660,21 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -5713,64 +5713,49 @@ "dev": true }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "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": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "yargs-parser": "^13.1.1" } } } }, "electron-download": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", - "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", "dev": true, "requires": { - "debug": "^2.2.0", - "fs-extra": "^0.30.0", - "home-path": "^1.0.1", + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", "minimist": "^1.2.0", - "nugget": "^2.0.0", - "path-exists": "^2.1.0", - "rc": "^1.1.2", - "semver": "^5.3.0", - "sumchecker": "^1.2.0" + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" }, "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "ms": "^2.1.1" } }, "minimist": { @@ -5779,14 +5764,11 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -5952,18 +5934,18 @@ } }, "electron-publish": { - "version": "20.43.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.43.0.tgz", - "integrity": "sha512-+oaTdbMmh1xceKPZWORYyGkNmxIhu7rkE1qEEn0NeG3KHEAePHg9FZGemR4aV3tQmtOwti2Vj+x8snAUxsnHHQ==", + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz", + "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==", "dev": true, "requires": { "bluebird-lst": "^1.0.9", - "builder-util": "~10.0.2", - "builder-util-runtime": "^8.2.4", + "builder-util": "~21.2.0", + "builder-util-runtime": "8.3.0", "chalk": "^2.4.2", - "fs-extra-p": "^8.0.2", + "fs-extra": "^8.1.0", "lazy-val": "^1.0.4", - "mime": "^2.4.3" + "mime": "^2.4.4" }, "dependencies": { "chalk": { @@ -5977,10 +5959,36 @@ "supports-color": "^5.3.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true } } @@ -6117,12 +6125,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", - "dev": true - }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -6905,38 +6907,6 @@ } } }, - "fs-extra-p": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-8.0.2.tgz", - "integrity": "sha512-dpWboLA/OlyuqGQdsTjC2PKNkise3O4ptcMpXoyfeM/VXrthkEape3I+drWLI0JAW46r1D3eb6QBSPkSyXPXzA==", - "dev": true, - "requires": { - "bluebird-lst": "^1.0.9", - "fs-extra": "^8.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -7877,15 +7847,6 @@ "url-parse-lax": "^3.0.0" }, "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -9461,12 +9422,6 @@ "os-tmpdir": "^1.0.1" } }, - "home-path": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", - "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", - "dev": true - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -12542,15 +12497,23 @@ "dev": true }, "package-json": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.3.0.tgz", - "integrity": "sha512-XO7WS3EEXd48vmW633Y97Mh9xuENFiOevI9G+ExfTG/k6xuY9cBd3fxkAoDMSEsNZXasaVJIJ1rD/n7GMf18bA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "requires": { "got": "^9.6.0", - "registry-auth-token": "^3.4.0", + "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", - "semver": "^5.6.0" + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "pako": { @@ -12604,23 +12567,6 @@ "author-regex": "^1.0.0" } }, - "parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", - "dev": true, - "requires": { - "color-convert": "~0.5.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - } - } - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -15257,59 +15203,40 @@ } }, "read-config-file": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.2.tgz", - "integrity": "sha512-PuFpMgZF01VB0ydH1dfitAxCP/fh+qnfbA9cYNIPoxPbz0SMngsrafCtaHDWfER7MwlDz4fmrNBhPkakxxFpTg==", - "dev": true, - "requires": { - "ajv": "^6.9.2", - "ajv-keywords": "^3.4.0", - "bluebird-lst": "^1.0.7", - "dotenv": "^6.2.0", - "dotenv-expand": "^4.2.0", - "fs-extra-p": "^7.0.1", - "js-yaml": "^3.12.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", + "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", + "dev": true, + "requires": { + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^8.1.0", + "js-yaml": "^3.13.1", "json5": "^2.1.0", "lazy-val": "^1.0.4" }, "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, - "fs-extra-p": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz", - "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==", - "dev": true, - "requires": { - "bluebird-lst": "^1.0.7", - "fs-extra": "^7.0.1" - } + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -15567,12 +15494,12 @@ } }, "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", + "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", "dev": true, "requires": { - "rc": "^1.1.6", + "rc": "^1.2.8", "safe-buffer": "^5.0.1" } }, @@ -16898,13 +16825,12 @@ } }, "sumchecker": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", - "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", "dev": true, "requires": { - "debug": "^2.2.0", - "es6-promise": "^4.0.5" + "debug": "^2.2.0" } }, "supports-color": { @@ -17010,36 +16936,31 @@ } }, "temp-file": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.2.tgz", - "integrity": "sha512-FGKccAW0Mux9hC/2bdUIe4bJRv4OyVo4RpVcuplFird1V/YoplIFbnPZjfzbJSf/qNvRZIRB9/4n/RkI0GziuQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", + "integrity": "sha512-qSZ5W5q54iyGnP8cNl49RE0jTJc5CrzNocux5APD5yIxcgonoMuMSbsZfaZy8rTGCYo0Xz6ySVv3adagZ8gffg==", "dev": true, "requires": { "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.6", - "fs-extra-p": "^7.0.0" + "fs-extra": "^8.1.0" }, "dependencies": { "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, - "fs-extra-p": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz", - "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==", - "dev": true, - "requires": { - "bluebird-lst": "^1.0.7", - "fs-extra": "^7.0.1" - } + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -17715,9 +17636,9 @@ "dev": true }, "update-notifier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.0.tgz", - "integrity": "sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", "dev": true, "requires": { "boxen": "^3.0.0", diff --git a/package.json b/package.json index a49a487139..8856b2284e 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "browserify": "16.2.2", "cookie": "0.4.0", "cssnano": "4.1.10", - "electron": "2.0.13", - "electron-builder": "^20.43.0", + "electron": "^6.0.12", + "electron-builder": "^21.2.0", "electron-packager": "12.1.0", "eslint": "4.18.2", "fs-extra": "4.0.2", diff --git a/ts-scripts/meta.json b/ts-scripts/meta.json index 051fb46610..7fd5acff64 100644 --- a/ts-scripts/meta.json +++ b/ts-scripts/meta.json @@ -186,24 +186,27 @@ "license" ], "defaults": { + "homepage": "https://wavesplatform.com", "main": "main.js", "devDependencies": { - "electron-builder": "20.5.1", - "electron": "2.0.5", - "electron-rebuild": "^1.8.2" - }, + "electron": "^6.0.12", + "electron-builder": "^21.2.0", + "electron-osx-sign": "^0.4.14", + "electron-notarize": "^0.1.1", + "electron-rebuild": "^1.8.6" + }, "dependencies": { "@ledgerhq/hw-transport-node-hid": "4.22.0", + "@waves/parse-json-bignumber": "1.0.1", "babel-runtime": "^6.26.0", "i18next": "9.1.0", - "@waves/parse-json-bignumber": "1.0.1", "qrcode-reader": "1.0.3", "ts-utils": "6.0.2" - }, + }, "scripts": { "postinstall": "node_modules/.bin/electron-rebuild --force" } }, "server": "desktop.wavesplatform.com" } -} +} \ No newline at end of file