├── .npmrc ├── example ├── .npmrc ├── build │ ├── icon.ico │ └── icon.icns ├── publisher.json ├── README.md ├── updates.json ├── app │ ├── style.css │ ├── index.html │ ├── main.js │ └── renderer.js └── package.json ├── .gitignore ├── src ├── __specs__ │ └── index.d.test.ts ├── index.js ├── utils │ ├── __specs__ │ │ ├── fixtures │ │ │ └── package.json │ │ ├── file.spec.js │ │ ├── meta.spec.js │ │ └── options.spec.js │ ├── file.js │ ├── Logger.js │ ├── HttpClient.js │ ├── meta.js │ ├── electronApi.js │ └── options.js ├── platform │ ├── index.js │ ├── __specs__ │ │ └── Windows.spec.js │ ├── Platform.js │ ├── Windows.js │ └── Linux.js ├── index.d.ts └── SimpleUpdater.js ├── logo.png ├── .travis.yml ├── e2e ├── appimage │ ├── .eslintrc │ ├── v0.0.2 │ │ ├── publisher.json │ │ ├── package-lock.json │ │ ├── main.js │ │ └── package.json │ ├── v0.0.1 │ │ ├── main.js │ │ ├── package.json │ │ └── package-lock.json │ ├── package.json │ ├── server │ │ ├── package.json │ │ ├── index.js │ │ └── package-lock.json │ └── start └── start ├── tsconfig.json ├── LICENSE ├── .eslintrc ├── package.json └── README.md /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /example/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | dist 3 | node_modules 4 | 5 | -------------------------------------------------------------------------------- /src/__specs__/index.d.test.ts: -------------------------------------------------------------------------------- 1 | import { checkForUpdates } from '../index'; 2 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megahertz/electron-simple-updater/HEAD/logo.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - "8" 5 | - "node" 6 | -------------------------------------------------------------------------------- /example/build/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megahertz/electron-simple-updater/HEAD/example/build/icon.ico -------------------------------------------------------------------------------- /e2e/appimage/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "import/no-unresolved":0, 4 | "no-console": 0 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /example/build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/megahertz/electron-simple-updater/HEAD/example/build/icon.icns -------------------------------------------------------------------------------- /e2e/appimage/v0.0.2/publisher.json: -------------------------------------------------------------------------------- 1 | { 2 | "transport": { 3 | "module": "local", 4 | "remoteUrl": "http://localhost:3003/updates" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /example/publisher.json: -------------------------------------------------------------------------------- 1 | { 2 | "transport": { 3 | "module": "github", 4 | "token": "", 5 | "updatesJsonPath": "example/updates.json" 6 | } 7 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const SimpleUpdater = require('./SimpleUpdater'); 4 | 5 | module.exports = new SimpleUpdater(); 6 | module.exports.default = module.exports; 7 | -------------------------------------------------------------------------------- /src/utils/__specs__/fixtures/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "esu-test", 3 | "version": "0.0.1", 4 | "updater": { 5 | "url": "https://example.com/updates.json" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.1/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const updater = require('electron-simple-updater'); 4 | 5 | updater.init() 6 | .on('update-downloaded', () => updater.quitAndInstall()); 7 | -------------------------------------------------------------------------------- /e2e/start: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | readonly __root="$(cd "$(dirname "$(dirname "$BASH_SOURCE")")"; pwd)" 6 | 7 | cd "${__root}/e2e/appimage" 8 | "${__root}/e2e/appimage/start" $@ 9 | -------------------------------------------------------------------------------- /e2e/appimage/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage", 3 | "version": "1.0.0", 4 | "private": true, 5 | "devDependencies": { 6 | "electron-builder": "^23.3.3", 7 | "electron-simple-publisher": "^2.0.1" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.2/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage", 3 | "version": "0.0.2", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "appimage", 9 | "version": "0.0.2" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["esnext"], 4 | "strict": true, 5 | "noImplicitReturns": true, 6 | "noEmit": true, 7 | "skipLibCheck": true 8 | }, 9 | "include": [ 10 | "./src/__specs__/index.d.test.ts" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /e2e/appimage/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage-server", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "dependencies": { 10 | "body-parser": "*", 11 | "express": "*" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/__specs__/file.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { describe, expect, it } = require('humile'); 4 | const path = require('path'); 5 | const file = require('../file'); 6 | 7 | describe('file', () => { 8 | it('calcSha256Hash', async () => { 9 | const filePath = path.resolve(__dirname, 'fixtures/package.json'); 10 | const hash = await file.calcSha256Hash(filePath); 11 | 12 | expect(hash) 13 | .toBe('dde2795c8ca938731339131371f149c6cef2a2ac989931022d6c842a1654a669'); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/utils/file.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const crypto = require('crypto'); 4 | const fs = require('fs'); 5 | 6 | module.exports = { 7 | calcSha256Hash, 8 | }; 9 | 10 | function calcSha256Hash(filePath) { 11 | const stream = fs.createReadStream(filePath); 12 | const shaSum = crypto.createHash('sha256'); 13 | 14 | return new Promise((resolve, reject) => { 15 | stream 16 | .on('data', data => shaSum.update(data)) 17 | .on('end', () => resolve(shaSum.digest('hex'))) 18 | .on('error', reject); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.2/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { app, BrowserWindow } = require('electron'); 4 | const { request } = require('http'); 5 | 6 | const SHOW_WINDOW = false; 7 | 8 | console.log('e2e: v2 started'); 9 | 10 | request(`http://localhost:3003/finish?pid=${process.pid}`, (res) => { 11 | res.on('data', () => SHOW_WINDOW || app.quit()); 12 | }).end(); 13 | 14 | if (SHOW_WINDOW) { 15 | app.on('ready', () => { 16 | const wnd = new BrowserWindow({ width: 200, height: 150 }); 17 | wnd.loadURL('data:text/html,v0.0.2'); 18 | }); 19 | 20 | app.on('window-all-closed', () => app.quit()); 21 | } 22 | -------------------------------------------------------------------------------- /e2e/appimage/start: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | main() { 6 | local step="${1:-1}" 7 | 8 | [ "${step}" -lt 2 ] && step1 9 | [ "${step}" -lt 3 ] && step2 10 | step3 11 | } 12 | 13 | step1() { 14 | echo "e2e: step1" 15 | npm ci 16 | npm ci --prefix server --production -s 17 | npm ci --prefix v0.0.1 --production -s 18 | npm ci --prefix v0.0.2 --production -s 19 | npm run build --prefix v0.0.2 -s 20 | } 21 | 22 | step2() { 23 | echo "e2e: step2" 24 | npm run build --prefix v0.0.1 -s 25 | } 26 | 27 | step3() { 28 | echo "e2e: step3" 29 | npm start -s --prefix server 30 | } 31 | 32 | main $@ 33 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage", 3 | "version": "0.0.2", 4 | "private": true, 5 | "main": "main.js", 6 | "author": "Alexey Prokhorov", 7 | "description": "electron-simple-updater test project", 8 | "build": { 9 | "appId": "com.github.megahertz.esu.appimage", 10 | "linux": { 11 | "category": "Development" 12 | }, 13 | "electronVersion": "20.1.1" 14 | }, 15 | "updater": { 16 | "url": "http://127.0.0.1:3003/updates/updates.json" 17 | }, 18 | "scripts": { 19 | "build": "npm run dist && npm run publish", 20 | "dist": "../node_modules/.bin/electron-builder --linux AppImage", 21 | "publish": "../node_modules/.bin/publish" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "main.js", 6 | "author": "Alexey Prokhorov", 7 | "description": "electron-simple-updater test project", 8 | "build": { 9 | "appId": "com.github.megahertz.esu.appimage", 10 | "linux": { 11 | "category": "Development" 12 | }, 13 | "electronVersion": "20.1.1" 14 | }, 15 | "updater": { 16 | "url": "http://127.0.0.1:3003/updates/updates.json" 17 | }, 18 | "scripts": { 19 | "build": "npm run dist", 20 | "dist": "../node_modules/.bin/electron-builder --linux AppImage" 21 | }, 22 | "dependencies": { 23 | "electron-simple-updater": "file:../../.." 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/utils/Logger.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const PREFIX = 'electron-simple-updater:'; 4 | 5 | class Logger { 6 | constructor(options) { 7 | /** 8 | * @type {Options} 9 | */ 10 | this.options = options; 11 | 12 | this.error = this.log.bind(this, 'error'); 13 | this.warn = this.log.bind(this, 'warn'); 14 | this.info = this.log.bind(this, 'info'); 15 | this.debug = this.log.bind(this, 'debug'); 16 | } 17 | 18 | log(level, ...args) { 19 | const customLogger = this.options.logger; 20 | if (!customLogger || typeof customLogger[level] !== 'function') { 21 | return; 22 | } 23 | 24 | customLogger[level](PREFIX, ...args); 25 | } 26 | 27 | static createEmpty() { 28 | return new Logger({}); 29 | } 30 | } 31 | 32 | module.exports = Logger; 33 | -------------------------------------------------------------------------------- /src/platform/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Linux = require('./Linux'); 4 | const Platform = require('./Platform'); 5 | const Windows = require('./Windows'); 6 | 7 | module.exports = { 8 | createPlatform, 9 | }; 10 | 11 | /** 12 | * @param {Options} options 13 | * @param {Logger} logger 14 | * @param {Function} emit 15 | * @param {HttpClient} httpClient 16 | * @param {string} platform 17 | * @return {Platform} 18 | */ 19 | function createPlatform( 20 | options, 21 | logger, 22 | emit, 23 | httpClient, 24 | platform = process.platform 25 | ) { 26 | switch (platform) { 27 | case 'darwin': return new Platform(options, logger, emit, httpClient); 28 | case 'win32': return new Windows(options, logger, emit, httpClient); 29 | default: return new Linux(options, logger, emit, httpClient); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Simple Updater Example 2 | 3 | This example shows how to use advanced features of electron-simple-updater 4 | 5 | This example uses 6 | [electron-builder](https://github.com/electron-userland/electron-builder) 7 | for building installer and update package and 8 | [electron-simple-publisher](https://github.com/megahertz/electron-simple-publisher) 9 | to simplify release publishing. 10 | 11 | It can be built and published by the single command: 12 | 13 | npm run release -- -- --transport-token 14 | 15 | where `-- --` allows to pass arguments through npm. 16 | 17 | Also you can save github api token to publisher.json if you use 18 | a private repository. 19 | 20 | If you want to prepare a `updates.json` file manually remember that Squirrel.Mac requires a properly prepared `release.json` file. A release in the property `url` must be zipped .app file. 21 | -------------------------------------------------------------------------------- /src/platform/__specs__/Windows.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { describe, expect, it } = require('humile'); 4 | const Windows = require('../Windows'); 5 | 6 | describe('platform/Windows', () => { 7 | describe('getSquirrelInstallerAction', () => { 8 | it('should detect install action', () => { 9 | const windows = new Windows(null, null, null); 10 | const action = windows.getSquirrelInstallerAction('--squirrel-install'); 11 | expect(action).toBe('squirrel-install'); 12 | }); 13 | 14 | it('should detect uninstall action', () => { 15 | const windows = new Windows(null, null, null); 16 | const action = windows.getSquirrelInstallerAction('--squirrel-uninstall'); 17 | expect(action).toBe('squirrel-uninstall'); 18 | }); 19 | 20 | it('should detect no squirrel action', () => { 21 | const windows = new Windows(null, null, null); 22 | const action = windows.getSquirrelInstallerAction('other args'); 23 | expect(action).toBe(''); 24 | }); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /e2e/appimage/server/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { spawn } = require('child_process'); 4 | const express = require('express'); 5 | const path = require('path'); 6 | 7 | const app = express(); 8 | 9 | app.use('/updates', express.static( 10 | path.resolve(__dirname, '../v0.0.2/dist/publish') 11 | )); 12 | 13 | app.get('/finish', (req, res) => { 14 | console.log('e2e: v2 is going to quit, pid', req.query.pid); 15 | console.log('e2e: Successfully updated, test is finished.'); 16 | res.send('ok'); 17 | process.exit(); 18 | }); 19 | 20 | // eslint-disable-next-line func-names 21 | app.listen(3003, function () { 22 | console.log(`e2e: Listening on port ${this.address().port}.`); 23 | startAppImageV1(); 24 | }); 25 | 26 | function startAppImageV1() { 27 | console.log('e2e: Starting v1 process'); 28 | const v1 = spawn('../v0.0.1/dist/appimage-0.0.1.AppImage', [], { 29 | stdio: 'inherit', 30 | }); 31 | 32 | v1.on('exit', () => console.log('v1 process is killed')); 33 | 34 | console.log('e2e: v1 process is started, pid', v1.pid); 35 | } 36 | -------------------------------------------------------------------------------- /src/platform/Platform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const electronApi = require('../utils/electronApi'); 4 | 5 | class Platform { 6 | /** 7 | * @param {Options} options 8 | * @param {Logger} logger 9 | * @param {Function} emit 10 | * @param {HttpClient} httpClient 11 | */ 12 | constructor(options, logger, emit, httpClient) { 13 | /** 14 | * @type {Function} 15 | */ 16 | this.emit = emit; 17 | 18 | /** 19 | * @type {Options} 20 | */ 21 | this.options = options; 22 | 23 | /** 24 | * @type {Logger} 25 | */ 26 | this.logger = logger; 27 | 28 | /** 29 | * @type {HttpClient} 30 | */ 31 | this.httpClient = httpClient; 32 | } 33 | 34 | init() { 35 | // Empty by default 36 | } 37 | 38 | /** 39 | * @param {SimpleUpdater.Meta} meta 40 | */ 41 | downloadUpdate(meta) { 42 | electronApi.setFeedURL(meta.update); 43 | electronApi.checkForUpdates(); 44 | } 45 | 46 | quitAndInstall() { 47 | electronApi.quitAndInstallUpdates(); 48 | } 49 | } 50 | 51 | module.exports = Platform; 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Alexey Prokhorov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/utils/HttpClient.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const axios = require('axios'); 4 | const fs = require('fs'); 5 | const stream = require('stream'); 6 | const util = require('util'); 7 | 8 | const pipeline = util.promisify(stream.pipeline); 9 | 10 | class HttpClient { 11 | /** 12 | * @param {Options} options 13 | */ 14 | constructor(options) { 15 | this.options = options; 16 | } 17 | 18 | async getJson(url) { 19 | const { data } = await axios.get(url, this.getHttpOptions()); 20 | return data; 21 | } 22 | 23 | async downloadFile(url, savePath) { 24 | const { data: httpRequest } = await axios.get(url, { 25 | ...this.getHttpOptions(), 26 | responseType: 'stream', 27 | }); 28 | return pipeline(httpRequest, fs.createWriteStream(savePath)); 29 | } 30 | 31 | /** 32 | * @private 33 | * @return {object} 34 | */ 35 | getHttpOptions() { 36 | const options = this.options.http || {}; 37 | return { 38 | ...options, 39 | headers: { 40 | 'User-Agent': 'electron-simple-updater 1.0', 41 | ...options.headers, 42 | }, 43 | }; 44 | } 45 | } 46 | 47 | module.exports = HttpClient; 48 | -------------------------------------------------------------------------------- /example/updates.json: -------------------------------------------------------------------------------- 1 | { 2 | "win32-x64-prod": { 3 | "readme": "Second release", 4 | "update": "https://github.com/megahertz/electron-simple-updater/releases/download/win32-x64-prod-v0.0.2", 5 | "install": "https://github.com/megahertz/electron-simple-updater/releases/download/win32-x64-prod-v0.0.2/Simple.Updater.Example.Setup.0.0.2.exe", 6 | "version": "0.0.2" 7 | }, 8 | "darwin-x64-prod": { 9 | "readme": "Second Release", 10 | "update": "https://github.com/megahertz/electron-simple-updater/releases/download/darwin-x64-prod-v0.0.2/release.json", 11 | "install": "https://github.com/megahertz/electron-simple-updater/releases/download/darwin-x64-prod-v0.0.2/Simple.Updater.Example-0.0.2.dmg", 12 | "version": "0.0.2" 13 | }, 14 | "linux-x64-prod": { 15 | "update": "https://github.com/megahertz/electron-simple-updater/releases/download/linux-x64-prod-v0.0.2/simple-updater-example-0.0.2-x86_64.AppImage", 16 | "install": "https://github.com/megahertz/electron-simple-updater/releases/download/linux-x64-prod-v0.0.2/simple-updater-example-0.0.2-x86_64.AppImage", 17 | "version": "0.0.2", 18 | "sha256": "50e30322cdc83c0af182fff773920d6e093eff7d4c22bf19bca5cbdf762ab1fb" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base", 3 | "env": { 4 | "es6": true, 5 | "node": true 6 | }, 7 | "parserOptions": { 8 | "ecmaVersion": 2021, 9 | "sourceType": "script" 10 | }, 11 | "rules": { 12 | "arrow-parens": [2, "as-needed", { "requireForBlockBody": true }], 13 | "comma-dangle": [2, { 14 | "arrays": "always-multiline", 15 | "objects": "always-multiline", 16 | "imports": "always-multiline", 17 | "exports": "always-multiline", 18 | "functions": "never" 19 | }], 20 | "class-methods-use-this": 0, 21 | "consistent-return": 0, 22 | "import/no-extraneous-dependencies": 0, 23 | "max-len": [2, { "code": 80 }], 24 | "no-confusing-arrow": 0, 25 | "no-multi-spaces": [2, { 26 | "exceptions": { 27 | "AssignmentExpression": true, 28 | "AssignmentPattern": true, 29 | "CallExpression": true, 30 | "VariableDeclarator": true 31 | } 32 | }], 33 | "no-param-reassign": 0, 34 | "no-unused-expressions": 0, 35 | "no-use-before-define": 0, 36 | "object-curly-newline": 0, 37 | "prefer-destructuring": 0, 38 | "prefer-promise-reject-errors": 0, 39 | "prefer-template": 0, 40 | "strict": [2, "global"] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/utils/meta.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const semver = require('semver'); 4 | 5 | module.exports = { 6 | getUpdatesMeta, 7 | extractUpdateMeta, 8 | }; 9 | 10 | /** 11 | * Return promise which can return false if there are no updates available 12 | * or object which contains the update information 13 | * @param {HttpClient} httpClient 14 | * @param {string} updatesUrl 15 | * @param {string} build {platform}-${arch} 16 | * @param {string} channel prod, beta, dev and so on 17 | * @param {string} version 0.0.1 18 | * @returns {Promise} 19 | */ 20 | async function getUpdatesMeta(httpClient, updatesUrl, build, channel, version) { 21 | const [platform, arch] = build.split('-'); 22 | 23 | const url = updatesUrl 24 | .replace('{platform}', platform) 25 | .replace('{arch}', arch) 26 | .replace('{channel}', channel); 27 | 28 | const json = await httpClient.getJson(url); 29 | return extractUpdateMeta(json, build, channel, version); 30 | } 31 | 32 | function extractUpdateMeta(updatesMeta, build, channel, version) { 33 | const meta = updatesMeta[`${build}-${channel}`]; 34 | if (!meta || !meta.version || !meta.update) { 35 | return; 36 | } 37 | 38 | if (semver.gt(meta.version, version)) { 39 | return meta; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /example/app/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { height: 100%; } 3 | 4 | body { 5 | display: flex; 6 | flex-direction: column; 7 | overflow: hidden; 8 | } 9 | 10 | label { font-weight: normal; } 11 | 12 | main { 13 | width: 9000px; 14 | padding: 5px; 15 | overflow: hidden; 16 | transition: .3s ease; } 17 | .update-available main { 18 | margin-left: -100vw; 19 | } 20 | .update-downloading main { 21 | pointer-events: none; 22 | opacity: .3; 23 | } 24 | 25 | .container-install, 26 | .container-check { 27 | width: 100vw; 28 | float: left; 29 | transition: .5s ease; 30 | } 31 | 32 | .container-install { 33 | top: 5px; 34 | left: 5px; 35 | } 36 | 37 | .container-check { 38 | position: relative; } 39 | .container-check label { display: block; } 40 | .container-check .box:last-child { padding-left: 1em } 41 | 42 | .box { 43 | display: inline-block; 44 | vertical-align: top; 45 | } 46 | 47 | .log { 48 | display: flex; 49 | flex-direction: column; 50 | flex: 1; } 51 | .log label { padding-left: 5px; } 52 | .log .messages { 53 | flex: 1; 54 | padding: 5px; 55 | overflow: auto; 56 | font-family: Menlo, Monaco, Consolas, "Courier New", monospace; 57 | background: #f9f9f9; 58 | border-top: 1px solid #ddd; 59 | } -------------------------------------------------------------------------------- /src/utils/__specs__/meta.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { describe, expect, it } = require('humile'); 4 | const { extractUpdateMeta } = require('../meta'); 5 | 6 | describe('get-updates-meta lib', () => { 7 | it('should check if there is a new version', () => { 8 | const update = 'http://example.com/update'; 9 | const meta = { 10 | 'win32-x64-prod': { version: '1.0.1', update }, 11 | 'win32-ia32-beta': { version: '1.0.2', update }, 12 | 'nsis-prod': { version: '0.3.2', update }, 13 | 'linux-x64-prod': { version: '1.0.2', update }, 14 | 'darwin-x64-prod': { version: '2.0.0', update }, 15 | }; 16 | 17 | expect(extractUpdateMeta(meta, 'win32-x64', 'prod', '1.0.1')) 18 | .toBe(undefined); 19 | expect(extractUpdateMeta(meta, 'win32-ia32', 'beta', '1.0.1')) 20 | .toBe(meta['win32-ia32-beta']); 21 | expect(extractUpdateMeta(meta, undefined, 'beta', '1.0.1')) 22 | .toBe(undefined); 23 | 24 | expect(extractUpdateMeta(meta, 'darwin-x64', 'prod', '2.0.0')) 25 | .toBe(undefined); 26 | expect(extractUpdateMeta(meta, 'darwin-x64', 'prod', '1.9.0')) 27 | .toBe(meta['darwin-x64-prod']); 28 | 29 | expect(extractUpdateMeta(meta, 'nsis', 'prod', '0.3.0')) 30 | .toBe(meta['nsis-prod']); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /example/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Example of using electron-simple-updater 6 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 | Check for Updates 17 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 |

New version is available.

29 |

Description:

30 | Install 31 |
32 |
33 | 34 |
35 | 36 |
37 |

[info] Starting the application

38 |
39 |
40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-simple-updater", 3 | "version": "2.0.11", 4 | "description": "Simple way to enable update for the electron application", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "humile", 8 | "test:e2e": "./e2e/start", 9 | "test:full": "npm run test && npm run lint && npm run test:e2e", 10 | "lint": "eslint src && tsc --noEmit", 11 | "postversion": "git push && git push --tags", 12 | "preversion": "npm run test:full", 13 | "prepack": "npm run test:full" 14 | }, 15 | "typings": "src/index.d.ts", 16 | "repository": "megahertz/electron-simple-updater", 17 | "files": [ 18 | "src/*", 19 | "!__specs__" 20 | ], 21 | "keywords": [ 22 | "electron", 23 | "atom", 24 | "updater", 25 | "update", 26 | "publish", 27 | "release", 28 | "windows", 29 | "mac", 30 | "osx", 31 | "linux", 32 | "desktop" 33 | ], 34 | "author": "Alexey Prokhorov", 35 | "license": "MIT", 36 | "bugs": "https://github.com/megahertz/electron-simple-updater/issues", 37 | "homepage": "https://github.com/megahertz/electron-simple-updater#readme", 38 | "engines": { 39 | "node": ">=8.0" 40 | }, 41 | "devDependencies": { 42 | "@types/node": "^18.7.14", 43 | "eslint": "^8.23.0", 44 | "eslint-config-airbnb-base": "^15.0.0", 45 | "eslint-plugin-import": "^2.26.0", 46 | "humile": "^0.5.0", 47 | "typescript": "^4.8.2" 48 | }, 49 | "dependencies": { 50 | "axios": "^0.27.2", 51 | "semver": "^7.3.7" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /example/app/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* eslint-disable no-path-concat, import/no-unresolved */ 4 | 5 | const { app, BrowserWindow, ipcMain } = require('electron'); 6 | const updater = require('electron-simple-updater'); 7 | 8 | let mainWindow; 9 | 10 | updater.init({ 11 | checkUpdateOnStart: false, 12 | autoDownload: false, 13 | logger: { 14 | info(...args) { ipcSend('update-log', 'info', ...args); }, 15 | warn(...args) { ipcSend('update-log', 'warn', ...args); }, 16 | }, 17 | }); 18 | 19 | updater 20 | .on('update-available', m => ipcSend('update-available', m)) 21 | .on('update-downloading', () => ipcSend('update-downloading')) 22 | .on('update-downloaded', () => ipcSend('update-downloaded')); 23 | 24 | ipcMain.handle('getBuild', () => updater.buildId); 25 | ipcMain.handle('getVersion', () => updater.version); 26 | ipcMain.handle('checkForUpdates', () => { updater.checkForUpdates(); }); 27 | ipcMain.handle('downloadUpdate', () => { updater.downloadUpdate(); }); 28 | ipcMain.handle('quitAndInstall', () => { updater.quitAndInstall(); }); 29 | ipcMain.handle('setOption', (_, opt, val) => { updater.setOptions(opt, val); }); 30 | 31 | app.on('ready', () => { 32 | mainWindow = new BrowserWindow({ 33 | width: 640, 34 | height: 480, 35 | autoHideMenuBar: true, 36 | webPreferences: { 37 | nodeIntegration: true, 38 | contextIsolation: false, 39 | }, 40 | }); 41 | 42 | mainWindow.loadURL('file://' + __dirname + '/index.html'); 43 | }); 44 | 45 | function ipcSend(event, ...args) { 46 | mainWindow?.webContents.send('updater-event', event, ...args); 47 | } 48 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-updater-example", 3 | "productName": "Simple Updater Example", 4 | "version": "0.0.1", 5 | "description": "Example of using electron-simple-updater", 6 | "main": "app/main.js", 7 | "scripts": { 8 | "postinstall": "install-app-deps", 9 | "start": "electron .", 10 | "dist": "electron-builder", 11 | "publish": "publish", 12 | "release": "npm run dist && npm run publish" 13 | }, 14 | "author": "Alexey Prokhorov", 15 | "license": "MIT", 16 | "private": true, 17 | "build": { 18 | "appId": "megahertz.electron-simple-updater-example", 19 | "files": [ 20 | "!publisher.json", 21 | "!README.md", 22 | "!updates.json" 23 | ], 24 | "linux": { 25 | "category": "Development", 26 | "publish": false, 27 | "target": "AppImage" 28 | }, 29 | "mac": { 30 | "category": "public.app-category.developer-tools" 31 | }, 32 | "win": { 33 | "target": "squirrel" 34 | }, 35 | "squirrelWindows": { 36 | "iconUrl": "https://raw.githubusercontent.com/megahertz/electron-simple-updater/master/example/build/icon.ico" 37 | } 38 | }, 39 | "updater": { 40 | "url": "https://raw.githubusercontent.com/megahertz/electron-simple-updater/master/example/updates.json" 41 | }, 42 | "engines": { 43 | "node": ">=6.0" 44 | }, 45 | "repository": { 46 | "type": "git", 47 | "url": "git+https://github.com/megahertz/electron-simple-updater.git" 48 | }, 49 | "dependencies": { 50 | "electron-simple-updater": "^2.0.11" 51 | }, 52 | "devDependencies": { 53 | "electron": "*", 54 | "electron-builder": "*", 55 | "electron-builder-squirrel-windows": "*", 56 | "electron-simple-publisher": "*", 57 | "eslint": "^8.23.0", 58 | "eslint-config-airbnb-base": "^15.0.0", 59 | "eslint-plugin-import": "^2.26.0", 60 | "typescript": "^4.8.2" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/platform/Windows.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const { spawn } = require('child_process'); 5 | const electronApi = require('../utils/electronApi'); 6 | const Platform = require('./Platform'); 7 | 8 | const SQUIRREL_INSTALL = 'squirrel-install'; 9 | const SQUIRREL_UPDATED = 'squirrel-updated'; 10 | const SQUIRREL_UNINSTALL = 'squirrel-uninstall'; 11 | const SQUIRREL_OBSOLETE = 'squirrel-obsolete'; 12 | 13 | const SQUIRREL_ACTIONS = [ 14 | SQUIRREL_INSTALL, SQUIRREL_UPDATED, SQUIRREL_UNINSTALL, SQUIRREL_OBSOLETE, 15 | ]; 16 | 17 | class Windows extends Platform { 18 | init() { 19 | const squirrelAction = this.getSquirrelInstallerAction(); 20 | if (!squirrelAction) { 21 | return; 22 | } 23 | 24 | const event = { squirrelAction, preventDefault: false }; 25 | this.emit('squirrel-win-installer', event); 26 | 27 | if (!event.preventDefault) { 28 | processSquirrelInstaller(squirrelAction); 29 | process.exit(); 30 | } 31 | } 32 | 33 | /** 34 | * @param {string} argv1 35 | * @return {string} 36 | * @package 37 | */ 38 | getSquirrelInstallerAction(argv1 = process.argv[1]) { 39 | const handledArguments = SQUIRREL_ACTIONS.map(act => `--${act}`); 40 | const actionIndex = handledArguments.indexOf(argv1); 41 | return actionIndex > -1 ? SQUIRREL_ACTIONS[actionIndex] : ''; 42 | } 43 | } 44 | 45 | function processSquirrelInstaller(action) { 46 | const execPath = path.basename(process.execPath); 47 | 48 | switch (action) { 49 | case SQUIRREL_INSTALL: 50 | case SQUIRREL_UPDATED: { 51 | run([`--createShortcut=${execPath}`], electronApi.quit); 52 | return true; 53 | } 54 | case SQUIRREL_UNINSTALL: { 55 | run([`--removeShortcut=${execPath}`], electronApi.quit); 56 | return false; 57 | } 58 | case SQUIRREL_OBSOLETE: { 59 | electronApi.quit(); 60 | return false; 61 | } 62 | default: { 63 | return false; 64 | } 65 | } 66 | } 67 | 68 | function run(args, done) { 69 | const updateExe = path.resolve( 70 | path.dirname(process.execPath), 71 | '../Update.exe' 72 | ); 73 | spawn(updateExe, args, { detached: true }).on('close', done); 74 | } 75 | 76 | module.exports = Windows; 77 | -------------------------------------------------------------------------------- /src/utils/__specs__/options.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { describe, expect, it } = require('humile'); 4 | const path = require('path'); 5 | const Logger = require('../Logger'); 6 | const { getOptions } = require('../options'); 7 | 8 | describe('options', () => { 9 | // before(() => { 10 | // this.originalPlatform = process.platform; 11 | // this.originalArch = process.arch; 12 | // 13 | // Object.defineProperty(process, 'platform', { value: 'win32' }); 14 | // Object.defineProperty(process, 'arch', { value: 'x64' }); 15 | // }); 16 | // 17 | // after(() => { 18 | // Object.defineProperty(process, 'platform', { 19 | // value: this.originalPlatform, 20 | // }); 21 | // Object.defineProperty(process, 'arch', { value: this.originalArch }); 22 | // }); 23 | 24 | describe('should make a build string', () => { 25 | it('on linux', () => { 26 | const process = { platform: 'linux', arch: 'x64' }; 27 | expect(getOptions().makeBuildString(process)).toBe('linux-x64'); 28 | }); 29 | 30 | it('on mac', () => { 31 | const process = { platform: 'darwin', arch: 'x64' }; 32 | expect(getOptions().makeBuildString(process)).toBe('darwin-x64'); 33 | }); 34 | 35 | it('on windows', () => { 36 | const process = { platform: 'win32', arch: 'ia32' }; 37 | expect(getOptions().makeBuildString(process)).toBe('win32-ia32'); 38 | }); 39 | 40 | it('on mas', () => { 41 | const process = { platform: 'darwin', arch: 'x64', mas: true }; 42 | expect(getOptions().makeBuildString(process)).toBe('mas-x64'); 43 | }); 44 | 45 | it('on Windows Store', () => { 46 | const process = { platform: 'win32', arch: 'x64', windowsStore: true }; 47 | expect(getOptions().makeBuildString(process)).toBe('winstore-x64'); 48 | }); 49 | }); 50 | 51 | it('should read options from a package.json', () => { 52 | const options = getOptions(); 53 | 54 | options.initialize( 55 | { appPath: path.resolve(__dirname, 'fixtures') }, 56 | Logger.createEmpty() 57 | ); 58 | 59 | expect(options.url).toBe('https://example.com/updates.json'); 60 | expect(options.version).toBe('0.0.1'); 61 | expect(options.disabled).toBe(false); 62 | }); 63 | 64 | it('should be disabled if no required options are set', () => { 65 | const options = getOptions(); 66 | options.initialize({}, Logger.createEmpty()); 67 | expect(options.disabled).toBe(true); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /example/app/renderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* eslint-env browser */ 4 | /* eslint-disable no-restricted-globals, no-alert */ 5 | 6 | const { ipcRenderer } = require('electron'); 7 | 8 | main(); 9 | 10 | function main() { 11 | ipcRenderer.invoke('getVersion').then(res => setText('version', res)); 12 | ipcRenderer.invoke('getBuild').then(build => setText('build', build)); 13 | 14 | attachUiHandlers(); 15 | attachUpdaterHandlers(); 16 | } 17 | 18 | function attachUiHandlers() { 19 | const btnUpdate = document.getElementById('btn-update'); 20 | const btnInstall = document.getElementById('btn-install'); 21 | const chkAutomatically = document.getElementById('automatically'); 22 | 23 | btnUpdate.addEventListener('click', () => { 24 | ipcRenderer.invoke('checkForUpdates'); 25 | document.body.classList.add('update-downloading'); 26 | }); 27 | 28 | btnInstall.addEventListener('click', () => { 29 | ipcRenderer.invoke('downloadUpdate'); 30 | }); 31 | 32 | chkAutomatically.addEventListener('change', function onChange() { 33 | ipcRenderer.invoke('setOption', 'autoDownload', this.checked); 34 | }); 35 | } 36 | 37 | function attachUpdaterHandlers() { 38 | ipcRenderer.on('updater-event', (_, eventName, ...args) => { 39 | console.log({ eventName, args }); 40 | 41 | switch (eventName) { 42 | case 'update-available': return onUpdateAvailable(args[0]); 43 | case 'update-downloading': return onUpdateDownloading(); 44 | case 'update-downloaded': return onUpdateDownloaded(); 45 | case 'update-log': return log(...args); 46 | default: return null; 47 | } 48 | }); 49 | 50 | function onUpdateAvailable(meta) { 51 | setText('new-version', meta.version); 52 | setText('description', meta.readme); 53 | document.body.className = 'update-available'; 54 | } 55 | 56 | function onUpdateDownloading() { 57 | document.body.classList.add('update-downloading'); 58 | } 59 | 60 | function onUpdateDownloaded() { 61 | if (confirm('The app has been updated. Do you like to restart it now?')) { 62 | ipcRenderer.invoke('quitAndInstall'); 63 | } 64 | } 65 | 66 | function log(level, ...texts) { 67 | const logMessages = document.getElementById('log-messages'); 68 | const p = document.createElement('p'); 69 | p.appendChild(document.createTextNode(`[${level}] ${texts.join(' ')}`)); 70 | logMessages.appendChild(p); 71 | } 72 | } 73 | 74 | function setText(id, text) { 75 | document.getElementById(id).appendChild( 76 | document.createTextNode(text) 77 | ); 78 | } 79 | -------------------------------------------------------------------------------- /src/utils/electronApi.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const Logger = require('./Logger'); 6 | 7 | let electron; 8 | try { 9 | // eslint-disable-next-line global-require,import/no-unresolved 10 | electron = require('electron'); 11 | } catch (e) { 12 | electron = null; 13 | } 14 | 15 | let logger = Logger.createEmpty(); 16 | 17 | module.exports = { 18 | offApp, 19 | onceApp, 20 | checkForUpdates, 21 | getAppName, 22 | getAppVersion, 23 | isPackaged, 24 | onUpdater, 25 | readPackageJson, 26 | setFeedURL, 27 | setLogger, 28 | quit, 29 | quitAndInstallUpdates, 30 | }; 31 | 32 | function offApp(event, listener) { 33 | getApp() && getApp().off(event, listener); 34 | } 35 | 36 | function onceApp(event, listener) { 37 | getApp() && getApp().on(event, listener); 38 | } 39 | 40 | function checkForUpdates() { 41 | getAutoUpdater() && getAutoUpdater().checkForUpdates(); 42 | } 43 | 44 | /** 45 | * @return {Electron.App} 46 | */ 47 | function getApp() { 48 | return getElectronModule('app'); 49 | } 50 | 51 | /** 52 | * @return {string} 53 | */ 54 | function getAppName() { 55 | const app = getApp(); 56 | if (!app) return ''; 57 | 58 | return 'name' in app ? app.name : app.getName(); 59 | } 60 | 61 | function getElectronModule(name) { 62 | if (!electron) { 63 | logger.error('electron is unavailable'); 64 | return null; 65 | } 66 | 67 | if (electron[name]) { 68 | return electron[name]; 69 | } 70 | 71 | if (electron.remote) { 72 | return electron.remote[name]; 73 | } 74 | 75 | logger.error(`electron.${name} module is unavailable`); 76 | 77 | return null; 78 | } 79 | 80 | /** 81 | * @return {string} 82 | */ 83 | function getAppVersion() { 84 | return (getApp() && getApp().getVersion()) || ''; 85 | } 86 | 87 | /** 88 | * @return {Electron.AutoUpdater} 89 | */ 90 | function getAutoUpdater() { 91 | return getElectronModule('autoUpdater'); 92 | } 93 | 94 | function isPackaged() { 95 | const app = getApp(); 96 | if (!app) { 97 | return false; 98 | } 99 | 100 | if (app.isPackaged !== true) { 101 | return false; 102 | } 103 | 104 | if (getAppName().toLowerCase() === 'electron') { 105 | return false; 106 | } 107 | 108 | return true; 109 | } 110 | 111 | function setFeedURL(updateUrl) { 112 | getAutoUpdater() && getAutoUpdater().setFeedURL(updateUrl); 113 | } 114 | 115 | /** 116 | * Set logger instance for electronApi 117 | * @param {Logger} newLogger 118 | */ 119 | function setLogger(newLogger) { 120 | if (newLogger instanceof Logger) { 121 | logger = newLogger; 122 | } 123 | } 124 | 125 | function onUpdater(event, listener) { 126 | getAutoUpdater() && getAutoUpdater().on(event, listener); 127 | } 128 | 129 | function quit() { 130 | const app = getApp(); 131 | if (app) { 132 | app.quit(); 133 | } else { 134 | process.exit(); 135 | } 136 | } 137 | 138 | function quitAndInstallUpdates() { 139 | getAutoUpdater() && getAutoUpdater().quitAndInstall(); 140 | } 141 | 142 | /** 143 | * @param {string} appPath 144 | * @return {{}|any} 145 | */ 146 | function readPackageJson(appPath = undefined) { 147 | try { 148 | const packageFile = path.join( 149 | appPath || getApp().getAppPath(), 150 | 'package.json' 151 | ); 152 | const content = fs.readFileSync(packageFile, 'utf-8'); 153 | return JSON.parse(content); 154 | } catch (e) { 155 | return {}; 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /src/utils/options.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const electonApi = require('./electronApi'); 4 | 5 | module.exports = { 6 | getOptions, 7 | }; 8 | 9 | function getOptions() { 10 | return new Options(); 11 | } 12 | 13 | class Options { 14 | constructor() { 15 | /** 16 | * @type {boolean} 17 | */ 18 | this.autoDownload = true; 19 | 20 | /** 21 | * @type {string} 22 | */ 23 | this.build = this.makeBuildString(process); 24 | 25 | /** 26 | * @type {string} 27 | */ 28 | this.channel = 'prod'; 29 | 30 | /** 31 | * @type {object} 32 | */ 33 | this.http = {}; 34 | 35 | /** 36 | * @type {string} 37 | */ 38 | this.version = ''; 39 | 40 | /** 41 | * @type {string} 42 | */ 43 | this.url = ''; 44 | 45 | /** 46 | * @type {boolean} 47 | */ 48 | this.checkUpdateOnStart = true; 49 | 50 | /** 51 | * @type {boolean} 52 | */ 53 | this.disabled = false; 54 | 55 | /** 56 | * @type {Partial} 57 | */ 58 | this.logger = console; 59 | 60 | /** 61 | * @type {boolean} 62 | */ 63 | this.isInitialized = false; 64 | 65 | /** 66 | * @type {string} 67 | */ 68 | this.appPath = undefined; 69 | } 70 | 71 | setOptions(nameOrOptions, value = undefined) { 72 | if (typeof nameOrOptions === 'object') { 73 | Object.entries(nameOrOptions) 74 | .forEach(([optName, optValue]) => this.setOptions(optName, optValue)); 75 | return; 76 | } 77 | 78 | const name = nameOrOptions; 79 | 80 | if (value === undefined) { 81 | return; 82 | } 83 | 84 | this[name] = value; 85 | } 86 | 87 | /** 88 | * @param {Partial} options 89 | * @param {Logger} logger 90 | * @return {boolean} 91 | */ 92 | initialize(options, logger) { 93 | if (this.isInitialized) { 94 | logger.error('It has been initialized before'); 95 | return false; 96 | } 97 | 98 | this.version = electonApi.getAppVersion(); 99 | this.loadOptionsFromPackage(options.appPath); 100 | 101 | if (typeof options === 'string') { 102 | options = { url: options }; 103 | } 104 | 105 | this.setOptions(options); 106 | 107 | if (!this.validate(logger)) { 108 | this.disabled = true; 109 | return false; 110 | } 111 | 112 | this.isInitialized = true; 113 | 114 | return true; 115 | } 116 | 117 | /** 118 | * @param {string} appPath 119 | * @private 120 | */ 121 | loadOptionsFromPackage(appPath = undefined) { 122 | const packageJson = electonApi.readPackageJson(appPath); 123 | const options = packageJson.updater || {}; 124 | 125 | options.version = packageJson.version; 126 | this.setOptions(options); 127 | } 128 | 129 | /** 130 | * @param {NodeJS.Process} process 131 | * @return {string} 132 | * @package 133 | */ 134 | makeBuildString(process) { 135 | let build = process.platform; 136 | 137 | if (process.mas) { 138 | build = 'mas'; 139 | } else if (process.windowsStore) { 140 | build = 'winstore'; 141 | } 142 | 143 | return `${build}-${process.arch}`; 144 | } 145 | 146 | /** 147 | * @param {Logger} logger 148 | * @return {boolean} 149 | * @private 150 | */ 151 | validate(logger) { 152 | if (!this.url) { 153 | logger.warn( 154 | 'You must set an url parameter in package.json (updater.url) or ' 155 | + 'when calling init({ url })' 156 | ); 157 | return false; 158 | } 159 | 160 | if (!this.version) { 161 | logger.warn('Set version in a package.json or when calling init()'); 162 | return false; 163 | } 164 | 165 | return true; 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /src/index.d.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from 'events'; 2 | 3 | declare namespace SimpleUpdater { 4 | interface Logger { 5 | error(...args: any): void; 6 | warn(...args: any): void; 7 | info(...args: any): void; 8 | debug(...args: any): void; 9 | } 10 | 11 | interface Meta { 12 | sha256?: string; 13 | update: string; 14 | version: string; 15 | } 16 | 17 | interface Options { 18 | /** 19 | * Automatically download an update when it's' found in updates.json 20 | */ 21 | autoDownload: boolean; 22 | 23 | /** 24 | * An application which is built for channel like 'beta' will receive updates 25 | * only from this channel 26 | */ 27 | channel: string; 28 | 29 | /** 30 | * Check for updates immediately when init() is called 31 | */ 32 | checkUpdateOnStart?: boolean; 33 | 34 | /** 35 | * Disable update feature. This option is set to true automatically for 36 | * non packaged application and builds for Mac App Store or Windows Store 37 | */ 38 | disabled?: boolean; 39 | 40 | /** 41 | * http.request options 42 | */ 43 | http?: object; 44 | 45 | /** 46 | * You can pass 47 | * [electron-log]{@link https://github.com/megahertz/electron-log}, 48 | * [winston]{@link https://github.com/winstonjs/winston} or another logger. 49 | * 50 | * Set it to false if you would like to disable a logging feature 51 | */ 52 | logger: Partial | false; 53 | 54 | /** 55 | * Current app version. In most cases, you should not pass this options 56 | * manually, it is read by electron from version at package.json 57 | */ 58 | version: string; 59 | 60 | /** 61 | * The only required parameter. This is a URL updates.json file 62 | */ 63 | url: string; 64 | } 65 | 66 | interface SimpleUpdater extends EventEmitter { 67 | /** 68 | * ${platform}-${arch} 69 | */ 70 | readonly build: string; 71 | 72 | /** 73 | * ${build}-${channel}-${version} 74 | */ 75 | readonly buildId: string; 76 | 77 | /** 78 | * The current updates channel 79 | */ 80 | readonly channel: string; 81 | 82 | /** 83 | * The current app version 84 | */ 85 | readonly version: string; 86 | 87 | /** 88 | * Initialize a package. 89 | * By default it finish the process if run by Squirrel.Windows installer 90 | * @fires SimpleUpdater#error:Event 91 | */ 92 | init(options?: Partial): this; 93 | 94 | /** 95 | * Asks the server whether there is an update. url must be set before 96 | * this call 97 | * @fires SimpleUpdater#error:Event 98 | * @fires SimpleUpdater#checking-for-update:Event 99 | * @fires SimpleUpdater#update-not-available:Event 100 | */ 101 | checkForUpdates(): this; 102 | 103 | /** 104 | * Start downloading update manually. 105 | * You can use this method if autoDownload option is set to false 106 | * @fires SimpleUpdater#update-downloading:Event 107 | * @fires SimpleUpdater#update-downloaded:Event 108 | * @fires SimpleUpdater#error:Event 109 | */ 110 | downloadUpdate(): this; 111 | 112 | /** 113 | * Restarts the app and installs the update after it has been downloaded. 114 | * It should only be called after update-downloaded has been emitted. 115 | */ 116 | quitAndInstall(): void; 117 | 118 | /** 119 | * Set one or a few options 120 | */ 121 | setOptions(options: Options): this; 122 | setOptions(name: keyof Options, value: any): this; 123 | 124 | /** 125 | * Return the current updates.json URL 126 | */ 127 | getFeedURL(): string; 128 | } 129 | } 130 | 131 | // Merge namespace with interface 132 | declare const SimpleUpdater: SimpleUpdater.SimpleUpdater & { 133 | default: SimpleUpdater.SimpleUpdater; 134 | } 135 | 136 | export = SimpleUpdater; 137 | -------------------------------------------------------------------------------- /src/platform/Linux.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { spawn } = require('child_process'); 4 | const fs = require('fs'); 5 | const os = require('os'); 6 | const path = require('path'); 7 | const { calcSha256Hash } = require('../utils/file'); 8 | const electronApi = require('../utils/electronApi'); 9 | const Platform = require('./Platform'); 10 | 11 | class Linux extends Platform { 12 | constructor(options, logger, emit, httpClient) { 13 | super(options, logger, emit, httpClient); 14 | 15 | this.quitAndInstall = this.quitAndInstall.bind(this); 16 | this.lastUpdatePath = null; 17 | } 18 | 19 | /** 20 | * @param {SimpleUpdater.Meta} meta 21 | */ 22 | downloadUpdate(meta) { 23 | this.downloadUpdateFile(meta) 24 | .then(() => { 25 | this.logger.info(`New version ${meta.version} has been downloaded`); 26 | this.emit('update-downloaded', this.meta); 27 | }) 28 | .catch(e => this.emit('error', e)); 29 | } 30 | 31 | /** 32 | * @param {boolean} restartRequired 33 | */ 34 | quitAndInstall(restartRequired = true) { 35 | if (!this.lastUpdatePath) { 36 | return; 37 | } 38 | 39 | electronApi.offApp('will-quit', this.quitAndInstall); 40 | 41 | const updateScript = ` 42 | if [ "\${RESTART_REQUIRED}" = 'true' ]; then 43 | cp -f "\${UPDATE_FILE}" "\${APP_IMAGE}" 44 | (exec "\${APP_IMAGE}") & disown $! 45 | else 46 | (sleep 2 && cp -f "\${UPDATE_FILE}" "\${APP_IMAGE}") & disown $! 47 | fi 48 | kill "\${OLD_PID}" $(ps -h --ppid "\${OLD_PID}" -o pid) 49 | rm "\${UPDATE_FILE}" 50 | `; 51 | 52 | const proc = spawn('/bin/bash', ['-c', updateScript], { 53 | detached: true, 54 | stdio: 'ignore', 55 | env: { 56 | ...process.env, 57 | APP_IMAGE: this.getAppImagePath(), 58 | OLD_PID: process.pid, 59 | RESTART_REQUIRED: String(restartRequired), 60 | UPDATE_FILE: this.lastUpdatePath, 61 | }, 62 | }); 63 | proc.unref(); 64 | 65 | if (restartRequired === true) { 66 | electronApi.quit(); 67 | process.exit(); 68 | } 69 | } 70 | 71 | /** 72 | * @param {SimpleUpdater.Meta} meta 73 | * @package 74 | */ 75 | async downloadUpdateFile(meta) { 76 | this.lastUpdatePath = this.getUpdatePath(meta.version); 77 | 78 | if (!fs.existsSync(this.lastUpdatePath)) { 79 | await this.httpClient.downloadFile(meta.update, this.lastUpdatePath); 80 | await setExecFlag(this.lastUpdatePath); 81 | } 82 | 83 | if (meta.sha256) { 84 | try { 85 | await this.checkHash(meta.sha256, this.lastUpdatePath); 86 | } catch (e) { 87 | await fs.promises.unlink(this.lastUpdatePath); 88 | throw e; 89 | } 90 | } 91 | 92 | electronApi.onceApp('will-quit', this.quitAndInstall); 93 | 94 | return this.lastUpdatePath; 95 | } 96 | 97 | getAppImagePath() { 98 | const appImagePath = process.env.APPIMAGE; 99 | 100 | if (!appImagePath) { 101 | throw new Error('It seems that the app is not in AppImage format'); 102 | } 103 | 104 | return appImagePath; 105 | } 106 | 107 | getUpdatePath(version) { 108 | const fileName = `${electronApi.getAppName()}-${version}.AppImage`; 109 | return path.join(os.tmpdir(), fileName); 110 | } 111 | 112 | async checkHash(hash, filePath) { 113 | const fileHash = await calcSha256Hash(filePath); 114 | if (fileHash !== hash) { 115 | throw new Error( 116 | `Update is corrupted. Expected hash: ${hash}, actual: ${fileHash}` 117 | ); 118 | } 119 | } 120 | } 121 | 122 | async function setExecFlag(filePath) { 123 | return new Promise((resolve, reject) => { 124 | fs.access(filePath, fs.X_OK, (err) => { 125 | if (!err) { 126 | return resolve(filePath); 127 | } 128 | 129 | fs.chmod(filePath, '0755', (e) => { 130 | e ? reject(`Cannot chmod of ${filePath}`) : resolve(filePath); 131 | }); 132 | }); 133 | }); 134 | } 135 | 136 | module.exports = Linux; 137 | -------------------------------------------------------------------------------- /src/SimpleUpdater.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { EventEmitter } = require('events'); 4 | const { createPlatform } = require('./platform'); 5 | const electronApi = require('./utils/electronApi'); 6 | const HttpClient = require('./utils/HttpClient'); 7 | const Logger = require('./utils/Logger'); 8 | const { getUpdatesMeta } = require('./utils/meta'); 9 | const { getOptions } = require('./utils/options'); 10 | 11 | class SimpleUpdater extends EventEmitter { 12 | constructor() { 13 | super(); 14 | 15 | this.init = this.init.bind(this); 16 | this.checkForUpdates = this.checkForUpdates.bind(this); 17 | this.downloadUpdate = this.downloadUpdate.bind(this); 18 | this.quitAndInstall = this.quitAndInstall.bind(this); 19 | this.setOptions = this.setOptions.bind(this); 20 | this.getFeedURL = this.getFeedURL.bind(this); 21 | 22 | /** 23 | * @type {Options} 24 | */ 25 | this.options = getOptions(); 26 | 27 | /** 28 | * @type {Logger} 29 | */ 30 | this.logger = new Logger(this.options); 31 | electronApi.setLogger(this.logger); 32 | 33 | /** 34 | * @type {SimpleUpdater.Meta} 35 | */ 36 | this.meta = { 37 | update: '', 38 | version: '', 39 | }; 40 | 41 | this.httpClient = new HttpClient(this.options); 42 | 43 | this.platform = createPlatform( 44 | this.options, 45 | this.logger, 46 | this.emit.bind(this), 47 | this.httpClient 48 | ); 49 | 50 | electronApi.onUpdater('update-downloaded', () => { 51 | const version = this.meta.version; 52 | this.logger.info(`New version ${version} has been downloaded`); 53 | this.emit('update-downloaded', this.meta); 54 | }); 55 | 56 | this.on('error', this.logger.warn); 57 | electronApi.onUpdater('error', e => this.emit('error', e)); 58 | } 59 | 60 | /** 61 | * Initialize updater module 62 | * @param {Partial | string} options 63 | * @return {this} 64 | */ 65 | init(options = {}) { 66 | if (options.logger) { 67 | this.options.setOptions('logger', options.logger); 68 | } 69 | 70 | if (!electronApi.isPackaged()) { 71 | this.logger.info('Update is disabled because the app is not packaged'); 72 | this.options.disabled = true; 73 | return this; 74 | } 75 | 76 | if (!this.options.initialize(options, this.logger)) { 77 | this.logger.warn('Update is disabled because of wrong configuration'); 78 | } 79 | 80 | this.platform.init(); 81 | 82 | if (this.options.checkUpdateOnStart) { 83 | this.checkForUpdates(); 84 | } 85 | 86 | return this; 87 | } 88 | 89 | /** 90 | * Asks the server whether there is an update. url must be set before 91 | * @return {this} 92 | */ 93 | checkForUpdates() { 94 | const opt = this.options; 95 | 96 | if (opt.disabled) { 97 | this.logger.warn('Update is disabled'); 98 | return this; 99 | } 100 | 101 | if (!opt.url) { 102 | this.emit('error', 'You must set url before calling checkForUpdates()'); 103 | return this; 104 | } 105 | 106 | this.emit('checking-for-update'); 107 | 108 | // noinspection JSUnresolvedFunction,JSValidateTypes 109 | getUpdatesMeta( 110 | this.httpClient, 111 | opt.url, 112 | opt.build, 113 | opt.channel, 114 | opt.version 115 | ) 116 | .then((updateMeta) => { 117 | if (updateMeta) { 118 | this.onFoundUpdate(updateMeta); 119 | return; 120 | } 121 | 122 | this.logger.debug(`Update for ${this.buildId} is not available`); 123 | this.emit('update-not-available'); 124 | }) 125 | .catch(e => this.emit('error', e)); 126 | 127 | return this; 128 | } 129 | 130 | /** 131 | * Start downloading update manually. 132 | * You can use this method if autoDownload option is set to false 133 | * @return {this} 134 | */ 135 | downloadUpdate() { 136 | if (!this.meta.update) { 137 | this.emit('error', 'No metadata for update. Run checkForUpdates first.'); 138 | return this; 139 | } 140 | 141 | this.emit('update-downloading', this.meta); 142 | this.logger.info(`Downloading updates from ${this.meta.update}`); 143 | 144 | this.platform.downloadUpdate(this.meta); 145 | 146 | return this; 147 | } 148 | 149 | /** 150 | * Restarts the app and installs the update after it has been downloaded. 151 | * It should only be called after update-downloaded has been emitted. 152 | * @return {void} 153 | */ 154 | quitAndInstall() { 155 | this.platform.quitAndInstall(); 156 | } 157 | 158 | /** 159 | * Set one or a few options 160 | * @param {string|object} name 161 | * @param {*} value 162 | * @return {this} 163 | */ 164 | setOptions(name, value = null) { 165 | this.options.setOptions(name, value); 166 | return this; 167 | } 168 | 169 | get build() { 170 | if (!this.checkIsInitialized()) return; 171 | return this.options.build; 172 | } 173 | 174 | /** 175 | * Return a build name with a channel and version 176 | * @return {string} 177 | */ 178 | get buildId() { 179 | if (!this.checkIsInitialized()) return ''; 180 | return `${this.build}-${this.channel}-v${this.version}`; 181 | } 182 | 183 | get channel() { 184 | if (!this.checkIsInitialized()) return; 185 | return this.options.channel; 186 | } 187 | 188 | get version() { 189 | if (!this.checkIsInitialized()) return; 190 | return this.options.version; 191 | } 192 | 193 | /** 194 | * Return the current updates.json URL 195 | * @return {string} 196 | */ 197 | getFeedURL() { 198 | if (!this.checkIsInitialized()) return ''; 199 | return this.options.url; 200 | } 201 | 202 | /** 203 | * Called when updates metadata has been downloaded 204 | * @param {*} meta 205 | * @private 206 | */ 207 | onFoundUpdate(meta) { 208 | this.meta = meta; 209 | const opt = this.options; 210 | 211 | this.logger.debug(`Found version ${meta.version} at ${meta.update}`); 212 | this.emit('update-available', meta); 213 | 214 | if (opt.autoDownload) { 215 | this.downloadUpdate(); 216 | } 217 | } 218 | 219 | /** 220 | * @return {boolean} 221 | * @private 222 | */ 223 | checkIsInitialized() { 224 | if (!this.options.isInitialized) { 225 | this.emit('error', new Error('Not initialized')); 226 | return false; 227 | } 228 | 229 | return true; 230 | } 231 | } 232 | 233 | module.exports = SimpleUpdater; 234 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![logo](https://raw.githubusercontent.com/megahertz/electron-simple-updater/master/logo.png) 2 | # electron-simple-updater 3 | [![Build Status](https://travis-ci.org/megahertz/electron-simple-updater.svg?branch=master)](https://travis-ci.org/megahertz/electron-simple-updater) 4 | [![npm version](https://badge.fury.io/js/electron-simple-updater.svg)](https://badge.fury.io/js/electron-simple-updater) 5 | 6 | ## Description 7 | 8 | This module allows to automatically update your application. You only 9 | need to install this module and write two lines of code! To publish 10 | your updates you just need a simple file hosting, it does not require 11 | a dedicated server. 12 | 13 | Supported OS: 14 | - Mac, ([Squirrel.Mac](https://github.com/Squirrel/Squirrel.Mac)) 15 | - Windows ([Squirrel.Windows](https://github.com/Squirrel/Squirrel.Windows)) 16 | - Linux (for [AppImage](http://appimage.org/) format) 17 | 18 | ## Differences between electron-simple-updater and built-in autoUpdater 19 | 20 | * Actually, autoUpdater is used inside. 21 | * Linux support. 22 | * It handles Squirrel.Windows install/update command line arguments. 23 | * It doesn't require a dedicated release server. 24 | * You need only 2 lines of code to make it work. 25 | 26 | ## Installation 27 | 28 | Install with [npm](https://npmjs.org/package/electron-simple-updater): 29 | 30 | npm install --save electron-simple-updater 31 | 32 | ## Usage 33 | 34 | ### Publish a new release 35 | 1. Insert a link to a hosting where you will store updates.json to main.js. 36 | You can find a sample of updates.json in [the example](example) 37 | 38 | ```js 39 | // Just place this code at the entry point of your application: 40 | const updater = require('src/index'); 41 | updater.init('https://raw.githubusercontent.com/megahertz/electron-simple-updater/master/example/updates.json'); 42 | ``` 43 | You can set this link in package.json:updater.url instead of init() argument. 44 | 45 | 2. Build your release using electron-builder or another tool. 46 | Note: Your application must be signed for automatic updates on macOS. 47 | This is a requirement of Squirrel.Mac. 48 | 49 | 3. Upload your release with update.json to a hosting. You can 50 | do it [manually](example/updates.json) or use 51 | [electron-simple-publisher](https://github.com/megahertz/electron-simple-publisher) 52 | to simplify this process. Note: Squirrel.Mac requires a properly prepared 53 | `release.json` file. A release in the property `url` must be zipped .app file. 54 | 55 | 4. That's it! 56 | 57 | Now your application will check for updates on start and download it 58 | automatically if an update is available. After app is restarted a new 59 | version will be loaded. But you can customize it to ask a user if he 60 | would like to install updates. See [the example](example) for details. 61 | 62 | ## API 63 | 64 | ### Options 65 | You can set options when calling init() method or in package.json:updater 66 | section. 67 | 68 | Name | Default | Description 69 | --------------------|-------------------------|------------ 70 | autoDownload | true | Automatically download an update when it's found in updates.json 71 | channel | 'prod' | An application which is built for channel like 'beta' will receive updates only from this channel 72 | checkUpdateOnStart | true | Check for updates immediately when init() is called 73 | disabled | false | Disable update feature. This option is set to true automatically for applications built for Mac App Store or Windows Store 74 | logger | console | You can pass [electron-log](https://github.com/megahertz/electron-log), [winston](https://github.com/winstonjs/winston) or another logger with the following interface: { debug(), info(), warn() }. Set it to false if you would like to disable a logging feature 75 | version | app.getVersion() | Current app version. In most cases, you should not pass this options manually, it is read by electron from version at package.json 76 | url* | undefined | The only required parameter. This is a URL to [updates.json](https://github.com/megahertz/electron-simple-updater/blob/master/example/updates.json) file. You can use templates '{platform}', '{arch}' and '{channel}' in a file name. 77 | 78 | ### Method 79 | 80 | #### init(options) 81 | Initialize a package. By default it finish the process if is run by 82 | Squirrel.Windows installer. 83 | 84 | #### setFeedURL(url) *deprecated* 85 | Sets the url and initialize the electron-simple-updater. Instead of 86 | built-in auto-updater init(), this method receives a URL to updates.json. 87 | 88 | #### getFeedURL() *deprecated* 89 | Return the current updates.json URL. 90 | 91 | #### checkForUpdates() 92 | Asks the server whether there is an update. url must be set before this 93 | call. Instead of built-in auto-updater, this method does not start 94 | downloading if autoDownload options is set to false. 95 | 96 | #### downloadUpdate() 97 | Start downloading update manually. You can use this method if 98 | autoDownload option is set to false 99 | 100 | #### quitAndInstall() 101 | Restarts the app and installs the update after it has been downloaded. 102 | It should only be called after update-downloaded has been emitted. 103 | 104 | #### setOptions(name, value) 105 | Set one or a few options. Pass an object as the name for multiple set. 106 | 107 | ### Properties (read only) 108 | These properties are mapped to options 109 | 110 | * **build** 111 | * **channel** 112 | * **version** 113 | * **buildId** - this string contains a build, a channel and version 114 | 115 | ### Events 116 | **meta** object of some events is a data from updates.json 117 | 118 | #### error(err) 119 | Emitted when there is an error while updating. 120 | 121 | #### checking-for-update 122 | Emitted when start downloading update.json file. 123 | 124 | #### update-available(meta) 125 | Emitted when there is an available update. 126 | 127 | #### update-not-available 128 | Emitted when there is no available update. 129 | 130 | #### update-downloading(meta) 131 | Emitted when star downloading an update. 132 | 133 | #### update-downloaded(meta) 134 | Emitted when an update has been downloaded. 135 | 136 | #### squirrel-win-installer(event) 137 | Emitted when the app is run by Squirrel.Windows when installing. The 138 | SimpleUpdater creates/removes shortcuts and finishes the process by 139 | default. 140 | 141 | * **event.preventDefault** - set to true if you would like to 142 | customize this action 143 | * **event.squirrelAction** - squirrel-install, squirrel-updated, 144 | squirrel-uninstall, squirrel-obsolete 145 | 146 | ## Related 147 | - [electron-builder](https://github.com/electron-userland/electron-builder) - 148 | A complete solution to package and build an Electron app. Also it contains 149 | alternative implementation of update package. 150 | - [electron-simple-publisher](https://github.com/megahertz/electron-simple-publisher) - 151 | Simple way to publish releases for electron-simple-updater 152 | 153 | 154 | ## License 155 | 156 | Licensed under MIT. 157 | 158 | Logo was designed by [prolko](https://www.behance.net/prolko) base on the 159 | original [electron](https://github.com/electron/electron) logo. 160 | -------------------------------------------------------------------------------- /e2e/appimage/server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage-server", 3 | "version": "0.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "appimage-server", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "body-parser": "*", 12 | "express": "*" 13 | } 14 | }, 15 | "node_modules/accepts": { 16 | "version": "1.3.5", 17 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 18 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 19 | "dependencies": { 20 | "mime-types": "~2.1.18", 21 | "negotiator": "0.6.1" 22 | }, 23 | "engines": { 24 | "node": ">= 0.6" 25 | } 26 | }, 27 | "node_modules/array-flatten": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 30 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 31 | }, 32 | "node_modules/body-parser": { 33 | "version": "1.18.3", 34 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 35 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 36 | "dependencies": { 37 | "bytes": "3.0.0", 38 | "content-type": "~1.0.4", 39 | "debug": "2.6.9", 40 | "depd": "~1.1.2", 41 | "http-errors": "~1.6.3", 42 | "iconv-lite": "0.4.23", 43 | "on-finished": "~2.3.0", 44 | "qs": "6.5.2", 45 | "raw-body": "2.3.3", 46 | "type-is": "~1.6.16" 47 | }, 48 | "engines": { 49 | "node": ">= 0.8" 50 | } 51 | }, 52 | "node_modules/bytes": { 53 | "version": "3.0.0", 54 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 55 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 56 | "engines": { 57 | "node": ">= 0.8" 58 | } 59 | }, 60 | "node_modules/content-disposition": { 61 | "version": "0.5.2", 62 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 63 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", 64 | "engines": { 65 | "node": ">= 0.6" 66 | } 67 | }, 68 | "node_modules/content-type": { 69 | "version": "1.0.4", 70 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 71 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 72 | "engines": { 73 | "node": ">= 0.6" 74 | } 75 | }, 76 | "node_modules/cookie": { 77 | "version": "0.3.1", 78 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 79 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", 80 | "engines": { 81 | "node": ">= 0.6" 82 | } 83 | }, 84 | "node_modules/cookie-signature": { 85 | "version": "1.0.6", 86 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 87 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 88 | }, 89 | "node_modules/debug": { 90 | "version": "2.6.9", 91 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 92 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 93 | "dependencies": { 94 | "ms": "2.0.0" 95 | } 96 | }, 97 | "node_modules/depd": { 98 | "version": "1.1.2", 99 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 100 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 101 | "engines": { 102 | "node": ">= 0.6" 103 | } 104 | }, 105 | "node_modules/destroy": { 106 | "version": "1.0.4", 107 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 108 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 109 | }, 110 | "node_modules/ee-first": { 111 | "version": "1.1.1", 112 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 113 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 114 | }, 115 | "node_modules/encodeurl": { 116 | "version": "1.0.2", 117 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 118 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 119 | "engines": { 120 | "node": ">= 0.8" 121 | } 122 | }, 123 | "node_modules/escape-html": { 124 | "version": "1.0.3", 125 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 126 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 127 | }, 128 | "node_modules/etag": { 129 | "version": "1.8.1", 130 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 131 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 132 | "engines": { 133 | "node": ">= 0.6" 134 | } 135 | }, 136 | "node_modules/express": { 137 | "version": "4.16.4", 138 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 139 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 140 | "dependencies": { 141 | "accepts": "~1.3.5", 142 | "array-flatten": "1.1.1", 143 | "body-parser": "1.18.3", 144 | "content-disposition": "0.5.2", 145 | "content-type": "~1.0.4", 146 | "cookie": "0.3.1", 147 | "cookie-signature": "1.0.6", 148 | "debug": "2.6.9", 149 | "depd": "~1.1.2", 150 | "encodeurl": "~1.0.2", 151 | "escape-html": "~1.0.3", 152 | "etag": "~1.8.1", 153 | "finalhandler": "1.1.1", 154 | "fresh": "0.5.2", 155 | "merge-descriptors": "1.0.1", 156 | "methods": "~1.1.2", 157 | "on-finished": "~2.3.0", 158 | "parseurl": "~1.3.2", 159 | "path-to-regexp": "0.1.7", 160 | "proxy-addr": "~2.0.4", 161 | "qs": "6.5.2", 162 | "range-parser": "~1.2.0", 163 | "safe-buffer": "5.1.2", 164 | "send": "0.16.2", 165 | "serve-static": "1.13.2", 166 | "setprototypeof": "1.1.0", 167 | "statuses": "~1.4.0", 168 | "type-is": "~1.6.16", 169 | "utils-merge": "1.0.1", 170 | "vary": "~1.1.2" 171 | }, 172 | "engines": { 173 | "node": ">= 0.10.0" 174 | } 175 | }, 176 | "node_modules/finalhandler": { 177 | "version": "1.1.1", 178 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 179 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 180 | "dependencies": { 181 | "debug": "2.6.9", 182 | "encodeurl": "~1.0.2", 183 | "escape-html": "~1.0.3", 184 | "on-finished": "~2.3.0", 185 | "parseurl": "~1.3.2", 186 | "statuses": "~1.4.0", 187 | "unpipe": "~1.0.0" 188 | }, 189 | "engines": { 190 | "node": ">= 0.8" 191 | } 192 | }, 193 | "node_modules/forwarded": { 194 | "version": "0.1.2", 195 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 196 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 197 | "engines": { 198 | "node": ">= 0.6" 199 | } 200 | }, 201 | "node_modules/fresh": { 202 | "version": "0.5.2", 203 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 204 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 205 | "engines": { 206 | "node": ">= 0.6" 207 | } 208 | }, 209 | "node_modules/http-errors": { 210 | "version": "1.6.3", 211 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 212 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 213 | "dependencies": { 214 | "depd": "~1.1.2", 215 | "inherits": "2.0.3", 216 | "setprototypeof": "1.1.0", 217 | "statuses": ">= 1.4.0 < 2" 218 | }, 219 | "engines": { 220 | "node": ">= 0.6" 221 | } 222 | }, 223 | "node_modules/iconv-lite": { 224 | "version": "0.4.23", 225 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 226 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 227 | "dependencies": { 228 | "safer-buffer": ">= 2.1.2 < 3" 229 | }, 230 | "engines": { 231 | "node": ">=0.10.0" 232 | } 233 | }, 234 | "node_modules/inherits": { 235 | "version": "2.0.3", 236 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 237 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 238 | }, 239 | "node_modules/ipaddr.js": { 240 | "version": "1.8.0", 241 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 242 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", 243 | "engines": { 244 | "node": ">= 0.10" 245 | } 246 | }, 247 | "node_modules/media-typer": { 248 | "version": "0.3.0", 249 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 250 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 251 | "engines": { 252 | "node": ">= 0.6" 253 | } 254 | }, 255 | "node_modules/merge-descriptors": { 256 | "version": "1.0.1", 257 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 258 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 259 | }, 260 | "node_modules/methods": { 261 | "version": "1.1.2", 262 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 263 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 264 | "engines": { 265 | "node": ">= 0.6" 266 | } 267 | }, 268 | "node_modules/mime": { 269 | "version": "1.4.1", 270 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 271 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 272 | "bin": { 273 | "mime": "cli.js" 274 | } 275 | }, 276 | "node_modules/mime-db": { 277 | "version": "1.37.0", 278 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 279 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 280 | "engines": { 281 | "node": ">= 0.6" 282 | } 283 | }, 284 | "node_modules/mime-types": { 285 | "version": "2.1.21", 286 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 287 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 288 | "dependencies": { 289 | "mime-db": "~1.37.0" 290 | }, 291 | "engines": { 292 | "node": ">= 0.6" 293 | } 294 | }, 295 | "node_modules/ms": { 296 | "version": "2.0.0", 297 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 298 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 299 | }, 300 | "node_modules/negotiator": { 301 | "version": "0.6.1", 302 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 303 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", 304 | "engines": { 305 | "node": ">= 0.6" 306 | } 307 | }, 308 | "node_modules/on-finished": { 309 | "version": "2.3.0", 310 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 311 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 312 | "dependencies": { 313 | "ee-first": "1.1.1" 314 | }, 315 | "engines": { 316 | "node": ">= 0.8" 317 | } 318 | }, 319 | "node_modules/parseurl": { 320 | "version": "1.3.2", 321 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 322 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 323 | "engines": { 324 | "node": ">= 0.8" 325 | } 326 | }, 327 | "node_modules/path-to-regexp": { 328 | "version": "0.1.7", 329 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 330 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 331 | }, 332 | "node_modules/proxy-addr": { 333 | "version": "2.0.4", 334 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 335 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 336 | "dependencies": { 337 | "forwarded": "~0.1.2", 338 | "ipaddr.js": "1.8.0" 339 | }, 340 | "engines": { 341 | "node": ">= 0.10" 342 | } 343 | }, 344 | "node_modules/qs": { 345 | "version": "6.5.2", 346 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 347 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 348 | "engines": { 349 | "node": ">=0.6" 350 | } 351 | }, 352 | "node_modules/range-parser": { 353 | "version": "1.2.0", 354 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 355 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 356 | "engines": { 357 | "node": ">= 0.6" 358 | } 359 | }, 360 | "node_modules/raw-body": { 361 | "version": "2.3.3", 362 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 363 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 364 | "dependencies": { 365 | "bytes": "3.0.0", 366 | "http-errors": "1.6.3", 367 | "iconv-lite": "0.4.23", 368 | "unpipe": "1.0.0" 369 | }, 370 | "engines": { 371 | "node": ">= 0.8" 372 | } 373 | }, 374 | "node_modules/safe-buffer": { 375 | "version": "5.1.2", 376 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 377 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 378 | }, 379 | "node_modules/safer-buffer": { 380 | "version": "2.1.2", 381 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 382 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 383 | }, 384 | "node_modules/send": { 385 | "version": "0.16.2", 386 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 387 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 388 | "dependencies": { 389 | "debug": "2.6.9", 390 | "depd": "~1.1.2", 391 | "destroy": "~1.0.4", 392 | "encodeurl": "~1.0.2", 393 | "escape-html": "~1.0.3", 394 | "etag": "~1.8.1", 395 | "fresh": "0.5.2", 396 | "http-errors": "~1.6.2", 397 | "mime": "1.4.1", 398 | "ms": "2.0.0", 399 | "on-finished": "~2.3.0", 400 | "range-parser": "~1.2.0", 401 | "statuses": "~1.4.0" 402 | }, 403 | "engines": { 404 | "node": ">= 0.8.0" 405 | } 406 | }, 407 | "node_modules/serve-static": { 408 | "version": "1.13.2", 409 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 410 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 411 | "dependencies": { 412 | "encodeurl": "~1.0.2", 413 | "escape-html": "~1.0.3", 414 | "parseurl": "~1.3.2", 415 | "send": "0.16.2" 416 | }, 417 | "engines": { 418 | "node": ">= 0.8.0" 419 | } 420 | }, 421 | "node_modules/setprototypeof": { 422 | "version": "1.1.0", 423 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 424 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 425 | }, 426 | "node_modules/statuses": { 427 | "version": "1.4.0", 428 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 429 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 430 | "engines": { 431 | "node": ">= 0.6" 432 | } 433 | }, 434 | "node_modules/type-is": { 435 | "version": "1.6.16", 436 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 437 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 438 | "dependencies": { 439 | "media-typer": "0.3.0", 440 | "mime-types": "~2.1.18" 441 | }, 442 | "engines": { 443 | "node": ">= 0.6" 444 | } 445 | }, 446 | "node_modules/unpipe": { 447 | "version": "1.0.0", 448 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 449 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 450 | "engines": { 451 | "node": ">= 0.8" 452 | } 453 | }, 454 | "node_modules/utils-merge": { 455 | "version": "1.0.1", 456 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 457 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 458 | "engines": { 459 | "node": ">= 0.4.0" 460 | } 461 | }, 462 | "node_modules/vary": { 463 | "version": "1.1.2", 464 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 465 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 466 | "engines": { 467 | "node": ">= 0.8" 468 | } 469 | } 470 | }, 471 | "dependencies": { 472 | "accepts": { 473 | "version": "1.3.5", 474 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 475 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 476 | "requires": { 477 | "mime-types": "~2.1.18", 478 | "negotiator": "0.6.1" 479 | } 480 | }, 481 | "array-flatten": { 482 | "version": "1.1.1", 483 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 484 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 485 | }, 486 | "body-parser": { 487 | "version": "1.18.3", 488 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 489 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 490 | "requires": { 491 | "bytes": "3.0.0", 492 | "content-type": "~1.0.4", 493 | "debug": "2.6.9", 494 | "depd": "~1.1.2", 495 | "http-errors": "~1.6.3", 496 | "iconv-lite": "0.4.23", 497 | "on-finished": "~2.3.0", 498 | "qs": "6.5.2", 499 | "raw-body": "2.3.3", 500 | "type-is": "~1.6.16" 501 | } 502 | }, 503 | "bytes": { 504 | "version": "3.0.0", 505 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 506 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 507 | }, 508 | "content-disposition": { 509 | "version": "0.5.2", 510 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 511 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 512 | }, 513 | "content-type": { 514 | "version": "1.0.4", 515 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 516 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 517 | }, 518 | "cookie": { 519 | "version": "0.3.1", 520 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 521 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 522 | }, 523 | "cookie-signature": { 524 | "version": "1.0.6", 525 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 526 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 527 | }, 528 | "debug": { 529 | "version": "2.6.9", 530 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 531 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 532 | "requires": { 533 | "ms": "2.0.0" 534 | } 535 | }, 536 | "depd": { 537 | "version": "1.1.2", 538 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 539 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 540 | }, 541 | "destroy": { 542 | "version": "1.0.4", 543 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 544 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 545 | }, 546 | "ee-first": { 547 | "version": "1.1.1", 548 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 549 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 550 | }, 551 | "encodeurl": { 552 | "version": "1.0.2", 553 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 554 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 555 | }, 556 | "escape-html": { 557 | "version": "1.0.3", 558 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 559 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 560 | }, 561 | "etag": { 562 | "version": "1.8.1", 563 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 564 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 565 | }, 566 | "express": { 567 | "version": "4.16.4", 568 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 569 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 570 | "requires": { 571 | "accepts": "~1.3.5", 572 | "array-flatten": "1.1.1", 573 | "body-parser": "1.18.3", 574 | "content-disposition": "0.5.2", 575 | "content-type": "~1.0.4", 576 | "cookie": "0.3.1", 577 | "cookie-signature": "1.0.6", 578 | "debug": "2.6.9", 579 | "depd": "~1.1.2", 580 | "encodeurl": "~1.0.2", 581 | "escape-html": "~1.0.3", 582 | "etag": "~1.8.1", 583 | "finalhandler": "1.1.1", 584 | "fresh": "0.5.2", 585 | "merge-descriptors": "1.0.1", 586 | "methods": "~1.1.2", 587 | "on-finished": "~2.3.0", 588 | "parseurl": "~1.3.2", 589 | "path-to-regexp": "0.1.7", 590 | "proxy-addr": "~2.0.4", 591 | "qs": "6.5.2", 592 | "range-parser": "~1.2.0", 593 | "safe-buffer": "5.1.2", 594 | "send": "0.16.2", 595 | "serve-static": "1.13.2", 596 | "setprototypeof": "1.1.0", 597 | "statuses": "~1.4.0", 598 | "type-is": "~1.6.16", 599 | "utils-merge": "1.0.1", 600 | "vary": "~1.1.2" 601 | } 602 | }, 603 | "finalhandler": { 604 | "version": "1.1.1", 605 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 606 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 607 | "requires": { 608 | "debug": "2.6.9", 609 | "encodeurl": "~1.0.2", 610 | "escape-html": "~1.0.3", 611 | "on-finished": "~2.3.0", 612 | "parseurl": "~1.3.2", 613 | "statuses": "~1.4.0", 614 | "unpipe": "~1.0.0" 615 | } 616 | }, 617 | "forwarded": { 618 | "version": "0.1.2", 619 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 620 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 621 | }, 622 | "fresh": { 623 | "version": "0.5.2", 624 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 625 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 626 | }, 627 | "http-errors": { 628 | "version": "1.6.3", 629 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 630 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 631 | "requires": { 632 | "depd": "~1.1.2", 633 | "inherits": "2.0.3", 634 | "setprototypeof": "1.1.0", 635 | "statuses": ">= 1.4.0 < 2" 636 | } 637 | }, 638 | "iconv-lite": { 639 | "version": "0.4.23", 640 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 641 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 642 | "requires": { 643 | "safer-buffer": ">= 2.1.2 < 3" 644 | } 645 | }, 646 | "inherits": { 647 | "version": "2.0.3", 648 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 649 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 650 | }, 651 | "ipaddr.js": { 652 | "version": "1.8.0", 653 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 654 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 655 | }, 656 | "media-typer": { 657 | "version": "0.3.0", 658 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 659 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 660 | }, 661 | "merge-descriptors": { 662 | "version": "1.0.1", 663 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 664 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 665 | }, 666 | "methods": { 667 | "version": "1.1.2", 668 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 669 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 670 | }, 671 | "mime": { 672 | "version": "1.4.1", 673 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 674 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 675 | }, 676 | "mime-db": { 677 | "version": "1.37.0", 678 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 679 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 680 | }, 681 | "mime-types": { 682 | "version": "2.1.21", 683 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 684 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 685 | "requires": { 686 | "mime-db": "~1.37.0" 687 | } 688 | }, 689 | "ms": { 690 | "version": "2.0.0", 691 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 692 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 693 | }, 694 | "negotiator": { 695 | "version": "0.6.1", 696 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 697 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 698 | }, 699 | "on-finished": { 700 | "version": "2.3.0", 701 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 702 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 703 | "requires": { 704 | "ee-first": "1.1.1" 705 | } 706 | }, 707 | "parseurl": { 708 | "version": "1.3.2", 709 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 710 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 711 | }, 712 | "path-to-regexp": { 713 | "version": "0.1.7", 714 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 715 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 716 | }, 717 | "proxy-addr": { 718 | "version": "2.0.4", 719 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 720 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 721 | "requires": { 722 | "forwarded": "~0.1.2", 723 | "ipaddr.js": "1.8.0" 724 | } 725 | }, 726 | "qs": { 727 | "version": "6.5.2", 728 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 729 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 730 | }, 731 | "range-parser": { 732 | "version": "1.2.0", 733 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 734 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 735 | }, 736 | "raw-body": { 737 | "version": "2.3.3", 738 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 739 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 740 | "requires": { 741 | "bytes": "3.0.0", 742 | "http-errors": "1.6.3", 743 | "iconv-lite": "0.4.23", 744 | "unpipe": "1.0.0" 745 | } 746 | }, 747 | "safe-buffer": { 748 | "version": "5.1.2", 749 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 750 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 751 | }, 752 | "safer-buffer": { 753 | "version": "2.1.2", 754 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 755 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 756 | }, 757 | "send": { 758 | "version": "0.16.2", 759 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 760 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 761 | "requires": { 762 | "debug": "2.6.9", 763 | "depd": "~1.1.2", 764 | "destroy": "~1.0.4", 765 | "encodeurl": "~1.0.2", 766 | "escape-html": "~1.0.3", 767 | "etag": "~1.8.1", 768 | "fresh": "0.5.2", 769 | "http-errors": "~1.6.2", 770 | "mime": "1.4.1", 771 | "ms": "2.0.0", 772 | "on-finished": "~2.3.0", 773 | "range-parser": "~1.2.0", 774 | "statuses": "~1.4.0" 775 | } 776 | }, 777 | "serve-static": { 778 | "version": "1.13.2", 779 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 780 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 781 | "requires": { 782 | "encodeurl": "~1.0.2", 783 | "escape-html": "~1.0.3", 784 | "parseurl": "~1.3.2", 785 | "send": "0.16.2" 786 | } 787 | }, 788 | "setprototypeof": { 789 | "version": "1.1.0", 790 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 791 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 792 | }, 793 | "statuses": { 794 | "version": "1.4.0", 795 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 796 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 797 | }, 798 | "type-is": { 799 | "version": "1.6.16", 800 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 801 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 802 | "requires": { 803 | "media-typer": "0.3.0", 804 | "mime-types": "~2.1.18" 805 | } 806 | }, 807 | "unpipe": { 808 | "version": "1.0.0", 809 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 810 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 811 | }, 812 | "utils-merge": { 813 | "version": "1.0.1", 814 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 815 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 816 | }, 817 | "vary": { 818 | "version": "1.1.2", 819 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 820 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 821 | } 822 | } 823 | } 824 | -------------------------------------------------------------------------------- /e2e/appimage/v0.0.1/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appimage", 3 | "version": "0.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "appimage", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "electron-simple-updater": "file:../../.." 12 | } 13 | }, 14 | "../../..": { 15 | "version": "2.0.11", 16 | "license": "MIT", 17 | "dependencies": { 18 | "axios": "^0.27.2", 19 | "semver": "^7.3.7" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^18.7.14", 23 | "eslint": "^8.23.0", 24 | "eslint-config-airbnb-base": "^15.0.0", 25 | "eslint-plugin-import": "^2.26.0", 26 | "humile": "^0.5.0", 27 | "typescript": "^4.8.2" 28 | }, 29 | "engines": { 30 | "node": ">=8.0" 31 | } 32 | }, 33 | "../../../node_modules/@eslint/eslintrc": { 34 | "version": "1.3.1", 35 | "dev": true, 36 | "license": "MIT", 37 | "dependencies": { 38 | "ajv": "^6.12.4", 39 | "debug": "^4.3.2", 40 | "espree": "^9.4.0", 41 | "globals": "^13.15.0", 42 | "ignore": "^5.2.0", 43 | "import-fresh": "^3.2.1", 44 | "js-yaml": "^4.1.0", 45 | "minimatch": "^3.1.2", 46 | "strip-json-comments": "^3.1.1" 47 | }, 48 | "engines": { 49 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 50 | }, 51 | "funding": { 52 | "url": "https://opencollective.com/eslint" 53 | } 54 | }, 55 | "../../../node_modules/@humanwhocodes/config-array": { 56 | "version": "0.10.4", 57 | "dev": true, 58 | "license": "Apache-2.0", 59 | "dependencies": { 60 | "@humanwhocodes/object-schema": "^1.2.1", 61 | "debug": "^4.1.1", 62 | "minimatch": "^3.0.4" 63 | }, 64 | "engines": { 65 | "node": ">=10.10.0" 66 | } 67 | }, 68 | "../../../node_modules/@humanwhocodes/gitignore-to-minimatch": { 69 | "version": "1.0.2", 70 | "dev": true, 71 | "license": "Apache-2.0", 72 | "funding": { 73 | "type": "github", 74 | "url": "https://github.com/sponsors/nzakas" 75 | } 76 | }, 77 | "../../../node_modules/@humanwhocodes/module-importer": { 78 | "version": "1.0.1", 79 | "dev": true, 80 | "license": "Apache-2.0", 81 | "engines": { 82 | "node": ">=12.22" 83 | }, 84 | "funding": { 85 | "type": "github", 86 | "url": "https://github.com/sponsors/nzakas" 87 | } 88 | }, 89 | "../../../node_modules/@humanwhocodes/object-schema": { 90 | "version": "1.2.1", 91 | "dev": true, 92 | "license": "BSD-3-Clause" 93 | }, 94 | "../../../node_modules/@nodelib/fs.scandir": { 95 | "version": "2.1.5", 96 | "dev": true, 97 | "license": "MIT", 98 | "dependencies": { 99 | "@nodelib/fs.stat": "2.0.5", 100 | "run-parallel": "^1.1.9" 101 | }, 102 | "engines": { 103 | "node": ">= 8" 104 | } 105 | }, 106 | "../../../node_modules/@nodelib/fs.stat": { 107 | "version": "2.0.5", 108 | "dev": true, 109 | "license": "MIT", 110 | "engines": { 111 | "node": ">= 8" 112 | } 113 | }, 114 | "../../../node_modules/@nodelib/fs.walk": { 115 | "version": "1.2.8", 116 | "dev": true, 117 | "license": "MIT", 118 | "dependencies": { 119 | "@nodelib/fs.scandir": "2.1.5", 120 | "fastq": "^1.6.0" 121 | }, 122 | "engines": { 123 | "node": ">= 8" 124 | } 125 | }, 126 | "../../../node_modules/@types/jasmine": { 127 | "version": "4.3.0", 128 | "dev": true, 129 | "license": "MIT" 130 | }, 131 | "../../../node_modules/@types/json5": { 132 | "version": "0.0.29", 133 | "dev": true, 134 | "license": "MIT" 135 | }, 136 | "../../../node_modules/@types/node": { 137 | "version": "18.7.14", 138 | "dev": true, 139 | "license": "MIT" 140 | }, 141 | "../../../node_modules/acorn": { 142 | "version": "8.8.0", 143 | "dev": true, 144 | "license": "MIT", 145 | "bin": { 146 | "acorn": "bin/acorn" 147 | }, 148 | "engines": { 149 | "node": ">=0.4.0" 150 | } 151 | }, 152 | "../../../node_modules/acorn-jsx": { 153 | "version": "5.3.2", 154 | "dev": true, 155 | "license": "MIT", 156 | "peerDependencies": { 157 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 158 | } 159 | }, 160 | "../../../node_modules/ajv": { 161 | "version": "6.12.6", 162 | "dev": true, 163 | "license": "MIT", 164 | "dependencies": { 165 | "fast-deep-equal": "^3.1.1", 166 | "fast-json-stable-stringify": "^2.0.0", 167 | "json-schema-traverse": "^0.4.1", 168 | "uri-js": "^4.2.2" 169 | }, 170 | "funding": { 171 | "type": "github", 172 | "url": "https://github.com/sponsors/epoberezkin" 173 | } 174 | }, 175 | "../../../node_modules/ansi-regex": { 176 | "version": "5.0.1", 177 | "dev": true, 178 | "license": "MIT", 179 | "engines": { 180 | "node": ">=8" 181 | } 182 | }, 183 | "../../../node_modules/ansi-styles": { 184 | "version": "4.3.0", 185 | "dev": true, 186 | "license": "MIT", 187 | "dependencies": { 188 | "color-convert": "^2.0.1" 189 | }, 190 | "engines": { 191 | "node": ">=8" 192 | }, 193 | "funding": { 194 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 195 | } 196 | }, 197 | "../../../node_modules/argparse": { 198 | "version": "2.0.1", 199 | "dev": true, 200 | "license": "Python-2.0" 201 | }, 202 | "../../../node_modules/array-includes": { 203 | "version": "3.1.5", 204 | "dev": true, 205 | "license": "MIT", 206 | "dependencies": { 207 | "call-bind": "^1.0.2", 208 | "define-properties": "^1.1.4", 209 | "es-abstract": "^1.19.5", 210 | "get-intrinsic": "^1.1.1", 211 | "is-string": "^1.0.7" 212 | }, 213 | "engines": { 214 | "node": ">= 0.4" 215 | }, 216 | "funding": { 217 | "url": "https://github.com/sponsors/ljharb" 218 | } 219 | }, 220 | "../../../node_modules/array-union": { 221 | "version": "2.1.0", 222 | "dev": true, 223 | "license": "MIT", 224 | "engines": { 225 | "node": ">=8" 226 | } 227 | }, 228 | "../../../node_modules/array.prototype.flat": { 229 | "version": "1.3.0", 230 | "dev": true, 231 | "license": "MIT", 232 | "dependencies": { 233 | "call-bind": "^1.0.2", 234 | "define-properties": "^1.1.3", 235 | "es-abstract": "^1.19.2", 236 | "es-shim-unscopables": "^1.0.0" 237 | }, 238 | "engines": { 239 | "node": ">= 0.4" 240 | }, 241 | "funding": { 242 | "url": "https://github.com/sponsors/ljharb" 243 | } 244 | }, 245 | "../../../node_modules/asynckit": { 246 | "version": "0.4.0", 247 | "license": "MIT" 248 | }, 249 | "../../../node_modules/axios": { 250 | "version": "0.27.2", 251 | "license": "MIT", 252 | "dependencies": { 253 | "follow-redirects": "^1.14.9", 254 | "form-data": "^4.0.0" 255 | } 256 | }, 257 | "../../../node_modules/balanced-match": { 258 | "version": "1.0.2", 259 | "dev": true, 260 | "license": "MIT" 261 | }, 262 | "../../../node_modules/blueimp-md5": { 263 | "version": "2.19.0", 264 | "dev": true, 265 | "license": "MIT" 266 | }, 267 | "../../../node_modules/brace-expansion": { 268 | "version": "1.1.11", 269 | "dev": true, 270 | "license": "MIT", 271 | "dependencies": { 272 | "balanced-match": "^1.0.0", 273 | "concat-map": "0.0.1" 274 | } 275 | }, 276 | "../../../node_modules/braces": { 277 | "version": "3.0.2", 278 | "dev": true, 279 | "license": "MIT", 280 | "dependencies": { 281 | "fill-range": "^7.0.1" 282 | }, 283 | "engines": { 284 | "node": ">=8" 285 | } 286 | }, 287 | "../../../node_modules/call-bind": { 288 | "version": "1.0.2", 289 | "dev": true, 290 | "license": "MIT", 291 | "dependencies": { 292 | "function-bind": "^1.1.1", 293 | "get-intrinsic": "^1.0.2" 294 | }, 295 | "funding": { 296 | "url": "https://github.com/sponsors/ljharb" 297 | } 298 | }, 299 | "../../../node_modules/callsites": { 300 | "version": "3.1.0", 301 | "dev": true, 302 | "license": "MIT", 303 | "engines": { 304 | "node": ">=6" 305 | } 306 | }, 307 | "../../../node_modules/chalk": { 308 | "version": "4.1.2", 309 | "dev": true, 310 | "license": "MIT", 311 | "dependencies": { 312 | "ansi-styles": "^4.1.0", 313 | "supports-color": "^7.1.0" 314 | }, 315 | "engines": { 316 | "node": ">=10" 317 | }, 318 | "funding": { 319 | "url": "https://github.com/chalk/chalk?sponsor=1" 320 | } 321 | }, 322 | "../../../node_modules/color-convert": { 323 | "version": "2.0.1", 324 | "dev": true, 325 | "license": "MIT", 326 | "dependencies": { 327 | "color-name": "~1.1.4" 328 | }, 329 | "engines": { 330 | "node": ">=7.0.0" 331 | } 332 | }, 333 | "../../../node_modules/color-name": { 334 | "version": "1.1.4", 335 | "dev": true, 336 | "license": "MIT" 337 | }, 338 | "../../../node_modules/combined-stream": { 339 | "version": "1.0.8", 340 | "license": "MIT", 341 | "dependencies": { 342 | "delayed-stream": "~1.0.0" 343 | }, 344 | "engines": { 345 | "node": ">= 0.8" 346 | } 347 | }, 348 | "../../../node_modules/concat-map": { 349 | "version": "0.0.1", 350 | "dev": true, 351 | "license": "MIT" 352 | }, 353 | "../../../node_modules/concordance": { 354 | "version": "5.0.4", 355 | "dev": true, 356 | "license": "ISC", 357 | "dependencies": { 358 | "date-time": "^3.1.0", 359 | "esutils": "^2.0.3", 360 | "fast-diff": "^1.2.0", 361 | "js-string-escape": "^1.0.1", 362 | "lodash": "^4.17.15", 363 | "md5-hex": "^3.0.1", 364 | "semver": "^7.3.2", 365 | "well-known-symbols": "^2.0.0" 366 | }, 367 | "engines": { 368 | "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" 369 | } 370 | }, 371 | "../../../node_modules/confusing-browser-globals": { 372 | "version": "1.0.11", 373 | "dev": true, 374 | "license": "MIT" 375 | }, 376 | "../../../node_modules/cross-spawn": { 377 | "version": "7.0.3", 378 | "dev": true, 379 | "license": "MIT", 380 | "dependencies": { 381 | "path-key": "^3.1.0", 382 | "shebang-command": "^2.0.0", 383 | "which": "^2.0.1" 384 | }, 385 | "engines": { 386 | "node": ">= 8" 387 | } 388 | }, 389 | "../../../node_modules/date-time": { 390 | "version": "3.1.0", 391 | "dev": true, 392 | "license": "MIT", 393 | "dependencies": { 394 | "time-zone": "^1.0.0" 395 | }, 396 | "engines": { 397 | "node": ">=6" 398 | } 399 | }, 400 | "../../../node_modules/debug": { 401 | "version": "4.3.4", 402 | "dev": true, 403 | "license": "MIT", 404 | "dependencies": { 405 | "ms": "2.1.2" 406 | }, 407 | "engines": { 408 | "node": ">=6.0" 409 | }, 410 | "peerDependenciesMeta": { 411 | "supports-color": { 412 | "optional": true 413 | } 414 | } 415 | }, 416 | "../../../node_modules/deep-is": { 417 | "version": "0.1.4", 418 | "dev": true, 419 | "license": "MIT" 420 | }, 421 | "../../../node_modules/define-properties": { 422 | "version": "1.1.4", 423 | "dev": true, 424 | "license": "MIT", 425 | "dependencies": { 426 | "has-property-descriptors": "^1.0.0", 427 | "object-keys": "^1.1.1" 428 | }, 429 | "engines": { 430 | "node": ">= 0.4" 431 | }, 432 | "funding": { 433 | "url": "https://github.com/sponsors/ljharb" 434 | } 435 | }, 436 | "../../../node_modules/delayed-stream": { 437 | "version": "1.0.0", 438 | "license": "MIT", 439 | "engines": { 440 | "node": ">=0.4.0" 441 | } 442 | }, 443 | "../../../node_modules/dir-glob": { 444 | "version": "3.0.1", 445 | "dev": true, 446 | "license": "MIT", 447 | "dependencies": { 448 | "path-type": "^4.0.0" 449 | }, 450 | "engines": { 451 | "node": ">=8" 452 | } 453 | }, 454 | "../../../node_modules/doctrine": { 455 | "version": "3.0.0", 456 | "dev": true, 457 | "license": "Apache-2.0", 458 | "dependencies": { 459 | "esutils": "^2.0.2" 460 | }, 461 | "engines": { 462 | "node": ">=6.0.0" 463 | } 464 | }, 465 | "../../../node_modules/es-abstract": { 466 | "version": "1.20.1", 467 | "dev": true, 468 | "license": "MIT", 469 | "dependencies": { 470 | "call-bind": "^1.0.2", 471 | "es-to-primitive": "^1.2.1", 472 | "function-bind": "^1.1.1", 473 | "function.prototype.name": "^1.1.5", 474 | "get-intrinsic": "^1.1.1", 475 | "get-symbol-description": "^1.0.0", 476 | "has": "^1.0.3", 477 | "has-property-descriptors": "^1.0.0", 478 | "has-symbols": "^1.0.3", 479 | "internal-slot": "^1.0.3", 480 | "is-callable": "^1.2.4", 481 | "is-negative-zero": "^2.0.2", 482 | "is-regex": "^1.1.4", 483 | "is-shared-array-buffer": "^1.0.2", 484 | "is-string": "^1.0.7", 485 | "is-weakref": "^1.0.2", 486 | "object-inspect": "^1.12.0", 487 | "object-keys": "^1.1.1", 488 | "object.assign": "^4.1.2", 489 | "regexp.prototype.flags": "^1.4.3", 490 | "string.prototype.trimend": "^1.0.5", 491 | "string.prototype.trimstart": "^1.0.5", 492 | "unbox-primitive": "^1.0.2" 493 | }, 494 | "engines": { 495 | "node": ">= 0.4" 496 | }, 497 | "funding": { 498 | "url": "https://github.com/sponsors/ljharb" 499 | } 500 | }, 501 | "../../../node_modules/es-shim-unscopables": { 502 | "version": "1.0.0", 503 | "dev": true, 504 | "license": "MIT", 505 | "dependencies": { 506 | "has": "^1.0.3" 507 | } 508 | }, 509 | "../../../node_modules/es-to-primitive": { 510 | "version": "1.2.1", 511 | "dev": true, 512 | "license": "MIT", 513 | "dependencies": { 514 | "is-callable": "^1.1.4", 515 | "is-date-object": "^1.0.1", 516 | "is-symbol": "^1.0.2" 517 | }, 518 | "engines": { 519 | "node": ">= 0.4" 520 | }, 521 | "funding": { 522 | "url": "https://github.com/sponsors/ljharb" 523 | } 524 | }, 525 | "../../../node_modules/escape-string-regexp": { 526 | "version": "4.0.0", 527 | "dev": true, 528 | "license": "MIT", 529 | "engines": { 530 | "node": ">=10" 531 | }, 532 | "funding": { 533 | "url": "https://github.com/sponsors/sindresorhus" 534 | } 535 | }, 536 | "../../../node_modules/eslint": { 537 | "version": "8.23.0", 538 | "dev": true, 539 | "license": "MIT", 540 | "dependencies": { 541 | "@eslint/eslintrc": "^1.3.1", 542 | "@humanwhocodes/config-array": "^0.10.4", 543 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 544 | "@humanwhocodes/module-importer": "^1.0.1", 545 | "ajv": "^6.10.0", 546 | "chalk": "^4.0.0", 547 | "cross-spawn": "^7.0.2", 548 | "debug": "^4.3.2", 549 | "doctrine": "^3.0.0", 550 | "escape-string-regexp": "^4.0.0", 551 | "eslint-scope": "^7.1.1", 552 | "eslint-utils": "^3.0.0", 553 | "eslint-visitor-keys": "^3.3.0", 554 | "espree": "^9.4.0", 555 | "esquery": "^1.4.0", 556 | "esutils": "^2.0.2", 557 | "fast-deep-equal": "^3.1.3", 558 | "file-entry-cache": "^6.0.1", 559 | "find-up": "^5.0.0", 560 | "functional-red-black-tree": "^1.0.1", 561 | "glob-parent": "^6.0.1", 562 | "globals": "^13.15.0", 563 | "globby": "^11.1.0", 564 | "grapheme-splitter": "^1.0.4", 565 | "ignore": "^5.2.0", 566 | "import-fresh": "^3.0.0", 567 | "imurmurhash": "^0.1.4", 568 | "is-glob": "^4.0.0", 569 | "js-yaml": "^4.1.0", 570 | "json-stable-stringify-without-jsonify": "^1.0.1", 571 | "levn": "^0.4.1", 572 | "lodash.merge": "^4.6.2", 573 | "minimatch": "^3.1.2", 574 | "natural-compare": "^1.4.0", 575 | "optionator": "^0.9.1", 576 | "regexpp": "^3.2.0", 577 | "strip-ansi": "^6.0.1", 578 | "strip-json-comments": "^3.1.0", 579 | "text-table": "^0.2.0" 580 | }, 581 | "bin": { 582 | "eslint": "bin/eslint.js" 583 | }, 584 | "engines": { 585 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 586 | }, 587 | "funding": { 588 | "url": "https://opencollective.com/eslint" 589 | } 590 | }, 591 | "../../../node_modules/eslint-config-airbnb-base": { 592 | "version": "15.0.0", 593 | "dev": true, 594 | "license": "MIT", 595 | "dependencies": { 596 | "confusing-browser-globals": "^1.0.10", 597 | "object.assign": "^4.1.2", 598 | "object.entries": "^1.1.5", 599 | "semver": "^6.3.0" 600 | }, 601 | "engines": { 602 | "node": "^10.12.0 || >=12.0.0" 603 | }, 604 | "peerDependencies": { 605 | "eslint": "^7.32.0 || ^8.2.0", 606 | "eslint-plugin-import": "^2.25.2" 607 | } 608 | }, 609 | "../../../node_modules/eslint-config-airbnb-base/node_modules/semver": { 610 | "version": "6.3.0", 611 | "dev": true, 612 | "license": "ISC", 613 | "bin": { 614 | "semver": "bin/semver.js" 615 | } 616 | }, 617 | "../../../node_modules/eslint-import-resolver-node": { 618 | "version": "0.3.6", 619 | "dev": true, 620 | "license": "MIT", 621 | "dependencies": { 622 | "debug": "^3.2.7", 623 | "resolve": "^1.20.0" 624 | } 625 | }, 626 | "../../../node_modules/eslint-import-resolver-node/node_modules/debug": { 627 | "version": "3.2.7", 628 | "dev": true, 629 | "license": "MIT", 630 | "dependencies": { 631 | "ms": "^2.1.1" 632 | } 633 | }, 634 | "../../../node_modules/eslint-module-utils": { 635 | "version": "2.7.4", 636 | "dev": true, 637 | "license": "MIT", 638 | "dependencies": { 639 | "debug": "^3.2.7" 640 | }, 641 | "engines": { 642 | "node": ">=4" 643 | }, 644 | "peerDependenciesMeta": { 645 | "eslint": { 646 | "optional": true 647 | } 648 | } 649 | }, 650 | "../../../node_modules/eslint-module-utils/node_modules/debug": { 651 | "version": "3.2.7", 652 | "dev": true, 653 | "license": "MIT", 654 | "dependencies": { 655 | "ms": "^2.1.1" 656 | } 657 | }, 658 | "../../../node_modules/eslint-plugin-import": { 659 | "version": "2.26.0", 660 | "dev": true, 661 | "license": "MIT", 662 | "dependencies": { 663 | "array-includes": "^3.1.4", 664 | "array.prototype.flat": "^1.2.5", 665 | "debug": "^2.6.9", 666 | "doctrine": "^2.1.0", 667 | "eslint-import-resolver-node": "^0.3.6", 668 | "eslint-module-utils": "^2.7.3", 669 | "has": "^1.0.3", 670 | "is-core-module": "^2.8.1", 671 | "is-glob": "^4.0.3", 672 | "minimatch": "^3.1.2", 673 | "object.values": "^1.1.5", 674 | "resolve": "^1.22.0", 675 | "tsconfig-paths": "^3.14.1" 676 | }, 677 | "engines": { 678 | "node": ">=4" 679 | }, 680 | "peerDependencies": { 681 | "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" 682 | } 683 | }, 684 | "../../../node_modules/eslint-plugin-import/node_modules/debug": { 685 | "version": "2.6.9", 686 | "dev": true, 687 | "license": "MIT", 688 | "dependencies": { 689 | "ms": "2.0.0" 690 | } 691 | }, 692 | "../../../node_modules/eslint-plugin-import/node_modules/doctrine": { 693 | "version": "2.1.0", 694 | "dev": true, 695 | "license": "Apache-2.0", 696 | "dependencies": { 697 | "esutils": "^2.0.2" 698 | }, 699 | "engines": { 700 | "node": ">=0.10.0" 701 | } 702 | }, 703 | "../../../node_modules/eslint-plugin-import/node_modules/ms": { 704 | "version": "2.0.0", 705 | "dev": true, 706 | "license": "MIT" 707 | }, 708 | "../../../node_modules/eslint-scope": { 709 | "version": "7.1.1", 710 | "dev": true, 711 | "license": "BSD-2-Clause", 712 | "dependencies": { 713 | "esrecurse": "^4.3.0", 714 | "estraverse": "^5.2.0" 715 | }, 716 | "engines": { 717 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 718 | } 719 | }, 720 | "../../../node_modules/eslint-utils": { 721 | "version": "3.0.0", 722 | "dev": true, 723 | "license": "MIT", 724 | "dependencies": { 725 | "eslint-visitor-keys": "^2.0.0" 726 | }, 727 | "engines": { 728 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 729 | }, 730 | "funding": { 731 | "url": "https://github.com/sponsors/mysticatea" 732 | }, 733 | "peerDependencies": { 734 | "eslint": ">=5" 735 | } 736 | }, 737 | "../../../node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 738 | "version": "2.1.0", 739 | "dev": true, 740 | "license": "Apache-2.0", 741 | "engines": { 742 | "node": ">=10" 743 | } 744 | }, 745 | "../../../node_modules/eslint-visitor-keys": { 746 | "version": "3.3.0", 747 | "dev": true, 748 | "license": "Apache-2.0", 749 | "engines": { 750 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 751 | } 752 | }, 753 | "../../../node_modules/espree": { 754 | "version": "9.4.0", 755 | "dev": true, 756 | "license": "BSD-2-Clause", 757 | "dependencies": { 758 | "acorn": "^8.8.0", 759 | "acorn-jsx": "^5.3.2", 760 | "eslint-visitor-keys": "^3.3.0" 761 | }, 762 | "engines": { 763 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 764 | }, 765 | "funding": { 766 | "url": "https://opencollective.com/eslint" 767 | } 768 | }, 769 | "../../../node_modules/esquery": { 770 | "version": "1.4.0", 771 | "dev": true, 772 | "license": "BSD-3-Clause", 773 | "dependencies": { 774 | "estraverse": "^5.1.0" 775 | }, 776 | "engines": { 777 | "node": ">=0.10" 778 | } 779 | }, 780 | "../../../node_modules/esrecurse": { 781 | "version": "4.3.0", 782 | "dev": true, 783 | "license": "BSD-2-Clause", 784 | "dependencies": { 785 | "estraverse": "^5.2.0" 786 | }, 787 | "engines": { 788 | "node": ">=4.0" 789 | } 790 | }, 791 | "../../../node_modules/estraverse": { 792 | "version": "5.3.0", 793 | "dev": true, 794 | "license": "BSD-2-Clause", 795 | "engines": { 796 | "node": ">=4.0" 797 | } 798 | }, 799 | "../../../node_modules/esutils": { 800 | "version": "2.0.3", 801 | "dev": true, 802 | "license": "BSD-2-Clause", 803 | "engines": { 804 | "node": ">=0.10.0" 805 | } 806 | }, 807 | "../../../node_modules/fast-deep-equal": { 808 | "version": "3.1.3", 809 | "dev": true, 810 | "license": "MIT" 811 | }, 812 | "../../../node_modules/fast-diff": { 813 | "version": "1.2.0", 814 | "dev": true, 815 | "license": "Apache-2.0" 816 | }, 817 | "../../../node_modules/fast-glob": { 818 | "version": "3.2.11", 819 | "dev": true, 820 | "license": "MIT", 821 | "dependencies": { 822 | "@nodelib/fs.stat": "^2.0.2", 823 | "@nodelib/fs.walk": "^1.2.3", 824 | "glob-parent": "^5.1.2", 825 | "merge2": "^1.3.0", 826 | "micromatch": "^4.0.4" 827 | }, 828 | "engines": { 829 | "node": ">=8.6.0" 830 | } 831 | }, 832 | "../../../node_modules/fast-glob/node_modules/glob-parent": { 833 | "version": "5.1.2", 834 | "dev": true, 835 | "license": "ISC", 836 | "dependencies": { 837 | "is-glob": "^4.0.1" 838 | }, 839 | "engines": { 840 | "node": ">= 6" 841 | } 842 | }, 843 | "../../../node_modules/fast-json-stable-stringify": { 844 | "version": "2.1.0", 845 | "dev": true, 846 | "license": "MIT" 847 | }, 848 | "../../../node_modules/fast-levenshtein": { 849 | "version": "2.0.6", 850 | "dev": true, 851 | "license": "MIT" 852 | }, 853 | "../../../node_modules/fastq": { 854 | "version": "1.13.0", 855 | "dev": true, 856 | "license": "ISC", 857 | "dependencies": { 858 | "reusify": "^1.0.4" 859 | } 860 | }, 861 | "../../../node_modules/file-entry-cache": { 862 | "version": "6.0.1", 863 | "dev": true, 864 | "license": "MIT", 865 | "dependencies": { 866 | "flat-cache": "^3.0.4" 867 | }, 868 | "engines": { 869 | "node": "^10.12.0 || >=12.0.0" 870 | } 871 | }, 872 | "../../../node_modules/fill-range": { 873 | "version": "7.0.1", 874 | "dev": true, 875 | "license": "MIT", 876 | "dependencies": { 877 | "to-regex-range": "^5.0.1" 878 | }, 879 | "engines": { 880 | "node": ">=8" 881 | } 882 | }, 883 | "../../../node_modules/find-up": { 884 | "version": "5.0.0", 885 | "dev": true, 886 | "license": "MIT", 887 | "dependencies": { 888 | "locate-path": "^6.0.0", 889 | "path-exists": "^4.0.0" 890 | }, 891 | "engines": { 892 | "node": ">=10" 893 | }, 894 | "funding": { 895 | "url": "https://github.com/sponsors/sindresorhus" 896 | } 897 | }, 898 | "../../../node_modules/flat-cache": { 899 | "version": "3.0.4", 900 | "dev": true, 901 | "license": "MIT", 902 | "dependencies": { 903 | "flatted": "^3.1.0", 904 | "rimraf": "^3.0.2" 905 | }, 906 | "engines": { 907 | "node": "^10.12.0 || >=12.0.0" 908 | } 909 | }, 910 | "../../../node_modules/flatted": { 911 | "version": "3.2.7", 912 | "dev": true, 913 | "license": "ISC" 914 | }, 915 | "../../../node_modules/follow-redirects": { 916 | "version": "1.15.1", 917 | "funding": [ 918 | { 919 | "type": "individual", 920 | "url": "https://github.com/sponsors/RubenVerborgh" 921 | } 922 | ], 923 | "license": "MIT", 924 | "engines": { 925 | "node": ">=4.0" 926 | }, 927 | "peerDependenciesMeta": { 928 | "debug": { 929 | "optional": true 930 | } 931 | } 932 | }, 933 | "../../../node_modules/form-data": { 934 | "version": "4.0.0", 935 | "license": "MIT", 936 | "dependencies": { 937 | "asynckit": "^0.4.0", 938 | "combined-stream": "^1.0.8", 939 | "mime-types": "^2.1.12" 940 | }, 941 | "engines": { 942 | "node": ">= 6" 943 | } 944 | }, 945 | "../../../node_modules/fs.realpath": { 946 | "version": "1.0.0", 947 | "dev": true, 948 | "license": "ISC" 949 | }, 950 | "../../../node_modules/function-bind": { 951 | "version": "1.1.1", 952 | "dev": true, 953 | "license": "MIT" 954 | }, 955 | "../../../node_modules/function.prototype.name": { 956 | "version": "1.1.5", 957 | "dev": true, 958 | "license": "MIT", 959 | "dependencies": { 960 | "call-bind": "^1.0.2", 961 | "define-properties": "^1.1.3", 962 | "es-abstract": "^1.19.0", 963 | "functions-have-names": "^1.2.2" 964 | }, 965 | "engines": { 966 | "node": ">= 0.4" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/sponsors/ljharb" 970 | } 971 | }, 972 | "../../../node_modules/functional-red-black-tree": { 973 | "version": "1.0.1", 974 | "dev": true, 975 | "license": "MIT" 976 | }, 977 | "../../../node_modules/functions-have-names": { 978 | "version": "1.2.3", 979 | "dev": true, 980 | "license": "MIT", 981 | "funding": { 982 | "url": "https://github.com/sponsors/ljharb" 983 | } 984 | }, 985 | "../../../node_modules/get-intrinsic": { 986 | "version": "1.1.2", 987 | "dev": true, 988 | "license": "MIT", 989 | "dependencies": { 990 | "function-bind": "^1.1.1", 991 | "has": "^1.0.3", 992 | "has-symbols": "^1.0.3" 993 | }, 994 | "funding": { 995 | "url": "https://github.com/sponsors/ljharb" 996 | } 997 | }, 998 | "../../../node_modules/get-symbol-description": { 999 | "version": "1.0.0", 1000 | "dev": true, 1001 | "license": "MIT", 1002 | "dependencies": { 1003 | "call-bind": "^1.0.2", 1004 | "get-intrinsic": "^1.1.1" 1005 | }, 1006 | "engines": { 1007 | "node": ">= 0.4" 1008 | }, 1009 | "funding": { 1010 | "url": "https://github.com/sponsors/ljharb" 1011 | } 1012 | }, 1013 | "../../../node_modules/glob": { 1014 | "version": "8.0.3", 1015 | "dev": true, 1016 | "license": "ISC", 1017 | "dependencies": { 1018 | "fs.realpath": "^1.0.0", 1019 | "inflight": "^1.0.4", 1020 | "inherits": "2", 1021 | "minimatch": "^5.0.1", 1022 | "once": "^1.3.0" 1023 | }, 1024 | "engines": { 1025 | "node": ">=12" 1026 | }, 1027 | "funding": { 1028 | "url": "https://github.com/sponsors/isaacs" 1029 | } 1030 | }, 1031 | "../../../node_modules/glob-parent": { 1032 | "version": "6.0.2", 1033 | "dev": true, 1034 | "license": "ISC", 1035 | "dependencies": { 1036 | "is-glob": "^4.0.3" 1037 | }, 1038 | "engines": { 1039 | "node": ">=10.13.0" 1040 | } 1041 | }, 1042 | "../../../node_modules/glob/node_modules/brace-expansion": { 1043 | "version": "2.0.1", 1044 | "dev": true, 1045 | "license": "MIT", 1046 | "dependencies": { 1047 | "balanced-match": "^1.0.0" 1048 | } 1049 | }, 1050 | "../../../node_modules/glob/node_modules/minimatch": { 1051 | "version": "5.1.0", 1052 | "dev": true, 1053 | "license": "ISC", 1054 | "dependencies": { 1055 | "brace-expansion": "^2.0.1" 1056 | }, 1057 | "engines": { 1058 | "node": ">=10" 1059 | } 1060 | }, 1061 | "../../../node_modules/globals": { 1062 | "version": "13.17.0", 1063 | "dev": true, 1064 | "license": "MIT", 1065 | "dependencies": { 1066 | "type-fest": "^0.20.2" 1067 | }, 1068 | "engines": { 1069 | "node": ">=8" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/sindresorhus" 1073 | } 1074 | }, 1075 | "../../../node_modules/globby": { 1076 | "version": "11.1.0", 1077 | "dev": true, 1078 | "license": "MIT", 1079 | "dependencies": { 1080 | "array-union": "^2.1.0", 1081 | "dir-glob": "^3.0.1", 1082 | "fast-glob": "^3.2.9", 1083 | "ignore": "^5.2.0", 1084 | "merge2": "^1.4.1", 1085 | "slash": "^3.0.0" 1086 | }, 1087 | "engines": { 1088 | "node": ">=10" 1089 | }, 1090 | "funding": { 1091 | "url": "https://github.com/sponsors/sindresorhus" 1092 | } 1093 | }, 1094 | "../../../node_modules/grapheme-splitter": { 1095 | "version": "1.0.4", 1096 | "dev": true, 1097 | "license": "MIT" 1098 | }, 1099 | "../../../node_modules/has": { 1100 | "version": "1.0.3", 1101 | "dev": true, 1102 | "license": "MIT", 1103 | "dependencies": { 1104 | "function-bind": "^1.1.1" 1105 | }, 1106 | "engines": { 1107 | "node": ">= 0.4.0" 1108 | } 1109 | }, 1110 | "../../../node_modules/has-bigints": { 1111 | "version": "1.0.2", 1112 | "dev": true, 1113 | "license": "MIT", 1114 | "funding": { 1115 | "url": "https://github.com/sponsors/ljharb" 1116 | } 1117 | }, 1118 | "../../../node_modules/has-flag": { 1119 | "version": "4.0.0", 1120 | "dev": true, 1121 | "license": "MIT", 1122 | "engines": { 1123 | "node": ">=8" 1124 | } 1125 | }, 1126 | "../../../node_modules/has-property-descriptors": { 1127 | "version": "1.0.0", 1128 | "dev": true, 1129 | "license": "MIT", 1130 | "dependencies": { 1131 | "get-intrinsic": "^1.1.1" 1132 | }, 1133 | "funding": { 1134 | "url": "https://github.com/sponsors/ljharb" 1135 | } 1136 | }, 1137 | "../../../node_modules/has-symbols": { 1138 | "version": "1.0.3", 1139 | "dev": true, 1140 | "license": "MIT", 1141 | "engines": { 1142 | "node": ">= 0.4" 1143 | }, 1144 | "funding": { 1145 | "url": "https://github.com/sponsors/ljharb" 1146 | } 1147 | }, 1148 | "../../../node_modules/has-tostringtag": { 1149 | "version": "1.0.0", 1150 | "dev": true, 1151 | "license": "MIT", 1152 | "dependencies": { 1153 | "has-symbols": "^1.0.2" 1154 | }, 1155 | "engines": { 1156 | "node": ">= 0.4" 1157 | }, 1158 | "funding": { 1159 | "url": "https://github.com/sponsors/ljharb" 1160 | } 1161 | }, 1162 | "../../../node_modules/humile": { 1163 | "version": "0.5.0", 1164 | "dev": true, 1165 | "license": "MIT", 1166 | "dependencies": { 1167 | "@types/jasmine": "^4.0.3", 1168 | "concordance": "^5.0.4", 1169 | "glob": "^8.0.3", 1170 | "jasmine-core": "^4.2.0", 1171 | "package-options": "^0.1.4" 1172 | }, 1173 | "bin": { 1174 | "humile": "src/index.js" 1175 | }, 1176 | "engines": { 1177 | "node": ">=10" 1178 | } 1179 | }, 1180 | "../../../node_modules/ignore": { 1181 | "version": "5.2.0", 1182 | "dev": true, 1183 | "license": "MIT", 1184 | "engines": { 1185 | "node": ">= 4" 1186 | } 1187 | }, 1188 | "../../../node_modules/import-fresh": { 1189 | "version": "3.3.0", 1190 | "dev": true, 1191 | "license": "MIT", 1192 | "dependencies": { 1193 | "parent-module": "^1.0.0", 1194 | "resolve-from": "^4.0.0" 1195 | }, 1196 | "engines": { 1197 | "node": ">=6" 1198 | }, 1199 | "funding": { 1200 | "url": "https://github.com/sponsors/sindresorhus" 1201 | } 1202 | }, 1203 | "../../../node_modules/imurmurhash": { 1204 | "version": "0.1.4", 1205 | "dev": true, 1206 | "license": "MIT", 1207 | "engines": { 1208 | "node": ">=0.8.19" 1209 | } 1210 | }, 1211 | "../../../node_modules/inflight": { 1212 | "version": "1.0.6", 1213 | "dev": true, 1214 | "license": "ISC", 1215 | "dependencies": { 1216 | "once": "^1.3.0", 1217 | "wrappy": "1" 1218 | } 1219 | }, 1220 | "../../../node_modules/inherits": { 1221 | "version": "2.0.4", 1222 | "dev": true, 1223 | "license": "ISC" 1224 | }, 1225 | "../../../node_modules/internal-slot": { 1226 | "version": "1.0.3", 1227 | "dev": true, 1228 | "license": "MIT", 1229 | "dependencies": { 1230 | "get-intrinsic": "^1.1.0", 1231 | "has": "^1.0.3", 1232 | "side-channel": "^1.0.4" 1233 | }, 1234 | "engines": { 1235 | "node": ">= 0.4" 1236 | } 1237 | }, 1238 | "../../../node_modules/is-bigint": { 1239 | "version": "1.0.4", 1240 | "dev": true, 1241 | "license": "MIT", 1242 | "dependencies": { 1243 | "has-bigints": "^1.0.1" 1244 | }, 1245 | "funding": { 1246 | "url": "https://github.com/sponsors/ljharb" 1247 | } 1248 | }, 1249 | "../../../node_modules/is-boolean-object": { 1250 | "version": "1.1.2", 1251 | "dev": true, 1252 | "license": "MIT", 1253 | "dependencies": { 1254 | "call-bind": "^1.0.2", 1255 | "has-tostringtag": "^1.0.0" 1256 | }, 1257 | "engines": { 1258 | "node": ">= 0.4" 1259 | }, 1260 | "funding": { 1261 | "url": "https://github.com/sponsors/ljharb" 1262 | } 1263 | }, 1264 | "../../../node_modules/is-callable": { 1265 | "version": "1.2.4", 1266 | "dev": true, 1267 | "license": "MIT", 1268 | "engines": { 1269 | "node": ">= 0.4" 1270 | }, 1271 | "funding": { 1272 | "url": "https://github.com/sponsors/ljharb" 1273 | } 1274 | }, 1275 | "../../../node_modules/is-core-module": { 1276 | "version": "2.10.0", 1277 | "dev": true, 1278 | "license": "MIT", 1279 | "dependencies": { 1280 | "has": "^1.0.3" 1281 | }, 1282 | "funding": { 1283 | "url": "https://github.com/sponsors/ljharb" 1284 | } 1285 | }, 1286 | "../../../node_modules/is-date-object": { 1287 | "version": "1.0.5", 1288 | "dev": true, 1289 | "license": "MIT", 1290 | "dependencies": { 1291 | "has-tostringtag": "^1.0.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">= 0.4" 1295 | }, 1296 | "funding": { 1297 | "url": "https://github.com/sponsors/ljharb" 1298 | } 1299 | }, 1300 | "../../../node_modules/is-extglob": { 1301 | "version": "2.1.1", 1302 | "dev": true, 1303 | "license": "MIT", 1304 | "engines": { 1305 | "node": ">=0.10.0" 1306 | } 1307 | }, 1308 | "../../../node_modules/is-glob": { 1309 | "version": "4.0.3", 1310 | "dev": true, 1311 | "license": "MIT", 1312 | "dependencies": { 1313 | "is-extglob": "^2.1.1" 1314 | }, 1315 | "engines": { 1316 | "node": ">=0.10.0" 1317 | } 1318 | }, 1319 | "../../../node_modules/is-negative-zero": { 1320 | "version": "2.0.2", 1321 | "dev": true, 1322 | "license": "MIT", 1323 | "engines": { 1324 | "node": ">= 0.4" 1325 | }, 1326 | "funding": { 1327 | "url": "https://github.com/sponsors/ljharb" 1328 | } 1329 | }, 1330 | "../../../node_modules/is-number": { 1331 | "version": "7.0.0", 1332 | "dev": true, 1333 | "license": "MIT", 1334 | "engines": { 1335 | "node": ">=0.12.0" 1336 | } 1337 | }, 1338 | "../../../node_modules/is-number-object": { 1339 | "version": "1.0.7", 1340 | "dev": true, 1341 | "license": "MIT", 1342 | "dependencies": { 1343 | "has-tostringtag": "^1.0.0" 1344 | }, 1345 | "engines": { 1346 | "node": ">= 0.4" 1347 | }, 1348 | "funding": { 1349 | "url": "https://github.com/sponsors/ljharb" 1350 | } 1351 | }, 1352 | "../../../node_modules/is-regex": { 1353 | "version": "1.1.4", 1354 | "dev": true, 1355 | "license": "MIT", 1356 | "dependencies": { 1357 | "call-bind": "^1.0.2", 1358 | "has-tostringtag": "^1.0.0" 1359 | }, 1360 | "engines": { 1361 | "node": ">= 0.4" 1362 | }, 1363 | "funding": { 1364 | "url": "https://github.com/sponsors/ljharb" 1365 | } 1366 | }, 1367 | "../../../node_modules/is-shared-array-buffer": { 1368 | "version": "1.0.2", 1369 | "dev": true, 1370 | "license": "MIT", 1371 | "dependencies": { 1372 | "call-bind": "^1.0.2" 1373 | }, 1374 | "funding": { 1375 | "url": "https://github.com/sponsors/ljharb" 1376 | } 1377 | }, 1378 | "../../../node_modules/is-string": { 1379 | "version": "1.0.7", 1380 | "dev": true, 1381 | "license": "MIT", 1382 | "dependencies": { 1383 | "has-tostringtag": "^1.0.0" 1384 | }, 1385 | "engines": { 1386 | "node": ">= 0.4" 1387 | }, 1388 | "funding": { 1389 | "url": "https://github.com/sponsors/ljharb" 1390 | } 1391 | }, 1392 | "../../../node_modules/is-symbol": { 1393 | "version": "1.0.4", 1394 | "dev": true, 1395 | "license": "MIT", 1396 | "dependencies": { 1397 | "has-symbols": "^1.0.2" 1398 | }, 1399 | "engines": { 1400 | "node": ">= 0.4" 1401 | }, 1402 | "funding": { 1403 | "url": "https://github.com/sponsors/ljharb" 1404 | } 1405 | }, 1406 | "../../../node_modules/is-weakref": { 1407 | "version": "1.0.2", 1408 | "dev": true, 1409 | "license": "MIT", 1410 | "dependencies": { 1411 | "call-bind": "^1.0.2" 1412 | }, 1413 | "funding": { 1414 | "url": "https://github.com/sponsors/ljharb" 1415 | } 1416 | }, 1417 | "../../../node_modules/isexe": { 1418 | "version": "2.0.0", 1419 | "dev": true, 1420 | "license": "ISC" 1421 | }, 1422 | "../../../node_modules/jasmine-core": { 1423 | "version": "4.3.0", 1424 | "dev": true, 1425 | "license": "MIT" 1426 | }, 1427 | "../../../node_modules/js-string-escape": { 1428 | "version": "1.0.1", 1429 | "dev": true, 1430 | "license": "MIT", 1431 | "engines": { 1432 | "node": ">= 0.8" 1433 | } 1434 | }, 1435 | "../../../node_modules/js-yaml": { 1436 | "version": "4.1.0", 1437 | "dev": true, 1438 | "license": "MIT", 1439 | "dependencies": { 1440 | "argparse": "^2.0.1" 1441 | }, 1442 | "bin": { 1443 | "js-yaml": "bin/js-yaml.js" 1444 | } 1445 | }, 1446 | "../../../node_modules/json-schema-traverse": { 1447 | "version": "0.4.1", 1448 | "dev": true, 1449 | "license": "MIT" 1450 | }, 1451 | "../../../node_modules/json-stable-stringify-without-jsonify": { 1452 | "version": "1.0.1", 1453 | "dev": true, 1454 | "license": "MIT" 1455 | }, 1456 | "../../../node_modules/json5": { 1457 | "version": "1.0.1", 1458 | "dev": true, 1459 | "license": "MIT", 1460 | "dependencies": { 1461 | "minimist": "^1.2.0" 1462 | }, 1463 | "bin": { 1464 | "json5": "lib/cli.js" 1465 | } 1466 | }, 1467 | "../../../node_modules/levn": { 1468 | "version": "0.4.1", 1469 | "dev": true, 1470 | "license": "MIT", 1471 | "dependencies": { 1472 | "prelude-ls": "^1.2.1", 1473 | "type-check": "~0.4.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">= 0.8.0" 1477 | } 1478 | }, 1479 | "../../../node_modules/locate-path": { 1480 | "version": "6.0.0", 1481 | "dev": true, 1482 | "license": "MIT", 1483 | "dependencies": { 1484 | "p-locate": "^5.0.0" 1485 | }, 1486 | "engines": { 1487 | "node": ">=10" 1488 | }, 1489 | "funding": { 1490 | "url": "https://github.com/sponsors/sindresorhus" 1491 | } 1492 | }, 1493 | "../../../node_modules/lodash": { 1494 | "version": "4.17.21", 1495 | "dev": true, 1496 | "license": "MIT" 1497 | }, 1498 | "../../../node_modules/lodash.merge": { 1499 | "version": "4.6.2", 1500 | "dev": true, 1501 | "license": "MIT" 1502 | }, 1503 | "../../../node_modules/lru-cache": { 1504 | "version": "6.0.0", 1505 | "license": "ISC", 1506 | "dependencies": { 1507 | "yallist": "^4.0.0" 1508 | }, 1509 | "engines": { 1510 | "node": ">=10" 1511 | } 1512 | }, 1513 | "../../../node_modules/md5-hex": { 1514 | "version": "3.0.1", 1515 | "dev": true, 1516 | "license": "MIT", 1517 | "dependencies": { 1518 | "blueimp-md5": "^2.10.0" 1519 | }, 1520 | "engines": { 1521 | "node": ">=8" 1522 | } 1523 | }, 1524 | "../../../node_modules/merge2": { 1525 | "version": "1.4.1", 1526 | "dev": true, 1527 | "license": "MIT", 1528 | "engines": { 1529 | "node": ">= 8" 1530 | } 1531 | }, 1532 | "../../../node_modules/micromatch": { 1533 | "version": "4.0.5", 1534 | "dev": true, 1535 | "license": "MIT", 1536 | "dependencies": { 1537 | "braces": "^3.0.2", 1538 | "picomatch": "^2.3.1" 1539 | }, 1540 | "engines": { 1541 | "node": ">=8.6" 1542 | } 1543 | }, 1544 | "../../../node_modules/mime-db": { 1545 | "version": "1.52.0", 1546 | "license": "MIT", 1547 | "engines": { 1548 | "node": ">= 0.6" 1549 | } 1550 | }, 1551 | "../../../node_modules/mime-types": { 1552 | "version": "2.1.35", 1553 | "license": "MIT", 1554 | "dependencies": { 1555 | "mime-db": "1.52.0" 1556 | }, 1557 | "engines": { 1558 | "node": ">= 0.6" 1559 | } 1560 | }, 1561 | "../../../node_modules/minimatch": { 1562 | "version": "3.1.2", 1563 | "dev": true, 1564 | "license": "ISC", 1565 | "dependencies": { 1566 | "brace-expansion": "^1.1.7" 1567 | }, 1568 | "engines": { 1569 | "node": "*" 1570 | } 1571 | }, 1572 | "../../../node_modules/minimist": { 1573 | "version": "1.2.6", 1574 | "dev": true, 1575 | "license": "MIT" 1576 | }, 1577 | "../../../node_modules/ms": { 1578 | "version": "2.1.2", 1579 | "dev": true, 1580 | "license": "MIT" 1581 | }, 1582 | "../../../node_modules/natural-compare": { 1583 | "version": "1.4.0", 1584 | "dev": true, 1585 | "license": "MIT" 1586 | }, 1587 | "../../../node_modules/object-inspect": { 1588 | "version": "1.12.2", 1589 | "dev": true, 1590 | "license": "MIT", 1591 | "funding": { 1592 | "url": "https://github.com/sponsors/ljharb" 1593 | } 1594 | }, 1595 | "../../../node_modules/object-keys": { 1596 | "version": "1.1.1", 1597 | "dev": true, 1598 | "license": "MIT", 1599 | "engines": { 1600 | "node": ">= 0.4" 1601 | } 1602 | }, 1603 | "../../../node_modules/object.assign": { 1604 | "version": "4.1.4", 1605 | "dev": true, 1606 | "license": "MIT", 1607 | "dependencies": { 1608 | "call-bind": "^1.0.2", 1609 | "define-properties": "^1.1.4", 1610 | "has-symbols": "^1.0.3", 1611 | "object-keys": "^1.1.1" 1612 | }, 1613 | "engines": { 1614 | "node": ">= 0.4" 1615 | }, 1616 | "funding": { 1617 | "url": "https://github.com/sponsors/ljharb" 1618 | } 1619 | }, 1620 | "../../../node_modules/object.entries": { 1621 | "version": "1.1.5", 1622 | "dev": true, 1623 | "license": "MIT", 1624 | "dependencies": { 1625 | "call-bind": "^1.0.2", 1626 | "define-properties": "^1.1.3", 1627 | "es-abstract": "^1.19.1" 1628 | }, 1629 | "engines": { 1630 | "node": ">= 0.4" 1631 | } 1632 | }, 1633 | "../../../node_modules/object.values": { 1634 | "version": "1.1.5", 1635 | "dev": true, 1636 | "license": "MIT", 1637 | "dependencies": { 1638 | "call-bind": "^1.0.2", 1639 | "define-properties": "^1.1.3", 1640 | "es-abstract": "^1.19.1" 1641 | }, 1642 | "engines": { 1643 | "node": ">= 0.4" 1644 | }, 1645 | "funding": { 1646 | "url": "https://github.com/sponsors/ljharb" 1647 | } 1648 | }, 1649 | "../../../node_modules/once": { 1650 | "version": "1.4.0", 1651 | "dev": true, 1652 | "license": "ISC", 1653 | "dependencies": { 1654 | "wrappy": "1" 1655 | } 1656 | }, 1657 | "../../../node_modules/optionator": { 1658 | "version": "0.9.1", 1659 | "dev": true, 1660 | "license": "MIT", 1661 | "dependencies": { 1662 | "deep-is": "^0.1.3", 1663 | "fast-levenshtein": "^2.0.6", 1664 | "levn": "^0.4.1", 1665 | "prelude-ls": "^1.2.1", 1666 | "type-check": "^0.4.0", 1667 | "word-wrap": "^1.2.3" 1668 | }, 1669 | "engines": { 1670 | "node": ">= 0.8.0" 1671 | } 1672 | }, 1673 | "../../../node_modules/p-limit": { 1674 | "version": "3.1.0", 1675 | "dev": true, 1676 | "license": "MIT", 1677 | "dependencies": { 1678 | "yocto-queue": "^0.1.0" 1679 | }, 1680 | "engines": { 1681 | "node": ">=10" 1682 | }, 1683 | "funding": { 1684 | "url": "https://github.com/sponsors/sindresorhus" 1685 | } 1686 | }, 1687 | "../../../node_modules/p-locate": { 1688 | "version": "5.0.0", 1689 | "dev": true, 1690 | "license": "MIT", 1691 | "dependencies": { 1692 | "p-limit": "^3.0.2" 1693 | }, 1694 | "engines": { 1695 | "node": ">=10" 1696 | }, 1697 | "funding": { 1698 | "url": "https://github.com/sponsors/sindresorhus" 1699 | } 1700 | }, 1701 | "../../../node_modules/package-options": { 1702 | "version": "0.1.4", 1703 | "dev": true, 1704 | "license": "MIT", 1705 | "engines": { 1706 | "node": ">=8" 1707 | } 1708 | }, 1709 | "../../../node_modules/parent-module": { 1710 | "version": "1.0.1", 1711 | "dev": true, 1712 | "license": "MIT", 1713 | "dependencies": { 1714 | "callsites": "^3.0.0" 1715 | }, 1716 | "engines": { 1717 | "node": ">=6" 1718 | } 1719 | }, 1720 | "../../../node_modules/path-exists": { 1721 | "version": "4.0.0", 1722 | "dev": true, 1723 | "license": "MIT", 1724 | "engines": { 1725 | "node": ">=8" 1726 | } 1727 | }, 1728 | "../../../node_modules/path-is-absolute": { 1729 | "version": "1.0.1", 1730 | "dev": true, 1731 | "license": "MIT", 1732 | "engines": { 1733 | "node": ">=0.10.0" 1734 | } 1735 | }, 1736 | "../../../node_modules/path-key": { 1737 | "version": "3.1.1", 1738 | "dev": true, 1739 | "license": "MIT", 1740 | "engines": { 1741 | "node": ">=8" 1742 | } 1743 | }, 1744 | "../../../node_modules/path-parse": { 1745 | "version": "1.0.7", 1746 | "dev": true, 1747 | "license": "MIT" 1748 | }, 1749 | "../../../node_modules/path-type": { 1750 | "version": "4.0.0", 1751 | "dev": true, 1752 | "license": "MIT", 1753 | "engines": { 1754 | "node": ">=8" 1755 | } 1756 | }, 1757 | "../../../node_modules/picomatch": { 1758 | "version": "2.3.1", 1759 | "dev": true, 1760 | "license": "MIT", 1761 | "engines": { 1762 | "node": ">=8.6" 1763 | }, 1764 | "funding": { 1765 | "url": "https://github.com/sponsors/jonschlinkert" 1766 | } 1767 | }, 1768 | "../../../node_modules/prelude-ls": { 1769 | "version": "1.2.1", 1770 | "dev": true, 1771 | "license": "MIT", 1772 | "engines": { 1773 | "node": ">= 0.8.0" 1774 | } 1775 | }, 1776 | "../../../node_modules/punycode": { 1777 | "version": "2.1.1", 1778 | "dev": true, 1779 | "license": "MIT", 1780 | "engines": { 1781 | "node": ">=6" 1782 | } 1783 | }, 1784 | "../../../node_modules/queue-microtask": { 1785 | "version": "1.2.3", 1786 | "dev": true, 1787 | "funding": [ 1788 | { 1789 | "type": "github", 1790 | "url": "https://github.com/sponsors/feross" 1791 | }, 1792 | { 1793 | "type": "patreon", 1794 | "url": "https://www.patreon.com/feross" 1795 | }, 1796 | { 1797 | "type": "consulting", 1798 | "url": "https://feross.org/support" 1799 | } 1800 | ], 1801 | "license": "MIT" 1802 | }, 1803 | "../../../node_modules/regexp.prototype.flags": { 1804 | "version": "1.4.3", 1805 | "dev": true, 1806 | "license": "MIT", 1807 | "dependencies": { 1808 | "call-bind": "^1.0.2", 1809 | "define-properties": "^1.1.3", 1810 | "functions-have-names": "^1.2.2" 1811 | }, 1812 | "engines": { 1813 | "node": ">= 0.4" 1814 | }, 1815 | "funding": { 1816 | "url": "https://github.com/sponsors/ljharb" 1817 | } 1818 | }, 1819 | "../../../node_modules/regexpp": { 1820 | "version": "3.2.0", 1821 | "dev": true, 1822 | "license": "MIT", 1823 | "engines": { 1824 | "node": ">=8" 1825 | }, 1826 | "funding": { 1827 | "url": "https://github.com/sponsors/mysticatea" 1828 | } 1829 | }, 1830 | "../../../node_modules/resolve": { 1831 | "version": "1.22.1", 1832 | "dev": true, 1833 | "license": "MIT", 1834 | "dependencies": { 1835 | "is-core-module": "^2.9.0", 1836 | "path-parse": "^1.0.7", 1837 | "supports-preserve-symlinks-flag": "^1.0.0" 1838 | }, 1839 | "bin": { 1840 | "resolve": "bin/resolve" 1841 | }, 1842 | "funding": { 1843 | "url": "https://github.com/sponsors/ljharb" 1844 | } 1845 | }, 1846 | "../../../node_modules/resolve-from": { 1847 | "version": "4.0.0", 1848 | "dev": true, 1849 | "license": "MIT", 1850 | "engines": { 1851 | "node": ">=4" 1852 | } 1853 | }, 1854 | "../../../node_modules/reusify": { 1855 | "version": "1.0.4", 1856 | "dev": true, 1857 | "license": "MIT", 1858 | "engines": { 1859 | "iojs": ">=1.0.0", 1860 | "node": ">=0.10.0" 1861 | } 1862 | }, 1863 | "../../../node_modules/rimraf": { 1864 | "version": "3.0.2", 1865 | "dev": true, 1866 | "license": "ISC", 1867 | "dependencies": { 1868 | "glob": "^7.1.3" 1869 | }, 1870 | "bin": { 1871 | "rimraf": "bin.js" 1872 | }, 1873 | "funding": { 1874 | "url": "https://github.com/sponsors/isaacs" 1875 | } 1876 | }, 1877 | "../../../node_modules/rimraf/node_modules/glob": { 1878 | "version": "7.2.3", 1879 | "dev": true, 1880 | "license": "ISC", 1881 | "dependencies": { 1882 | "fs.realpath": "^1.0.0", 1883 | "inflight": "^1.0.4", 1884 | "inherits": "2", 1885 | "minimatch": "^3.1.1", 1886 | "once": "^1.3.0", 1887 | "path-is-absolute": "^1.0.0" 1888 | }, 1889 | "engines": { 1890 | "node": "*" 1891 | }, 1892 | "funding": { 1893 | "url": "https://github.com/sponsors/isaacs" 1894 | } 1895 | }, 1896 | "../../../node_modules/run-parallel": { 1897 | "version": "1.2.0", 1898 | "dev": true, 1899 | "funding": [ 1900 | { 1901 | "type": "github", 1902 | "url": "https://github.com/sponsors/feross" 1903 | }, 1904 | { 1905 | "type": "patreon", 1906 | "url": "https://www.patreon.com/feross" 1907 | }, 1908 | { 1909 | "type": "consulting", 1910 | "url": "https://feross.org/support" 1911 | } 1912 | ], 1913 | "license": "MIT", 1914 | "dependencies": { 1915 | "queue-microtask": "^1.2.2" 1916 | } 1917 | }, 1918 | "../../../node_modules/semver": { 1919 | "version": "7.3.7", 1920 | "license": "ISC", 1921 | "dependencies": { 1922 | "lru-cache": "^6.0.0" 1923 | }, 1924 | "bin": { 1925 | "semver": "bin/semver.js" 1926 | }, 1927 | "engines": { 1928 | "node": ">=10" 1929 | } 1930 | }, 1931 | "../../../node_modules/shebang-command": { 1932 | "version": "2.0.0", 1933 | "dev": true, 1934 | "license": "MIT", 1935 | "dependencies": { 1936 | "shebang-regex": "^3.0.0" 1937 | }, 1938 | "engines": { 1939 | "node": ">=8" 1940 | } 1941 | }, 1942 | "../../../node_modules/shebang-regex": { 1943 | "version": "3.0.0", 1944 | "dev": true, 1945 | "license": "MIT", 1946 | "engines": { 1947 | "node": ">=8" 1948 | } 1949 | }, 1950 | "../../../node_modules/side-channel": { 1951 | "version": "1.0.4", 1952 | "dev": true, 1953 | "license": "MIT", 1954 | "dependencies": { 1955 | "call-bind": "^1.0.0", 1956 | "get-intrinsic": "^1.0.2", 1957 | "object-inspect": "^1.9.0" 1958 | }, 1959 | "funding": { 1960 | "url": "https://github.com/sponsors/ljharb" 1961 | } 1962 | }, 1963 | "../../../node_modules/slash": { 1964 | "version": "3.0.0", 1965 | "dev": true, 1966 | "license": "MIT", 1967 | "engines": { 1968 | "node": ">=8" 1969 | } 1970 | }, 1971 | "../../../node_modules/string.prototype.trimend": { 1972 | "version": "1.0.5", 1973 | "dev": true, 1974 | "license": "MIT", 1975 | "dependencies": { 1976 | "call-bind": "^1.0.2", 1977 | "define-properties": "^1.1.4", 1978 | "es-abstract": "^1.19.5" 1979 | }, 1980 | "funding": { 1981 | "url": "https://github.com/sponsors/ljharb" 1982 | } 1983 | }, 1984 | "../../../node_modules/string.prototype.trimstart": { 1985 | "version": "1.0.5", 1986 | "dev": true, 1987 | "license": "MIT", 1988 | "dependencies": { 1989 | "call-bind": "^1.0.2", 1990 | "define-properties": "^1.1.4", 1991 | "es-abstract": "^1.19.5" 1992 | }, 1993 | "funding": { 1994 | "url": "https://github.com/sponsors/ljharb" 1995 | } 1996 | }, 1997 | "../../../node_modules/strip-ansi": { 1998 | "version": "6.0.1", 1999 | "dev": true, 2000 | "license": "MIT", 2001 | "dependencies": { 2002 | "ansi-regex": "^5.0.1" 2003 | }, 2004 | "engines": { 2005 | "node": ">=8" 2006 | } 2007 | }, 2008 | "../../../node_modules/strip-bom": { 2009 | "version": "3.0.0", 2010 | "dev": true, 2011 | "license": "MIT", 2012 | "engines": { 2013 | "node": ">=4" 2014 | } 2015 | }, 2016 | "../../../node_modules/strip-json-comments": { 2017 | "version": "3.1.1", 2018 | "dev": true, 2019 | "license": "MIT", 2020 | "engines": { 2021 | "node": ">=8" 2022 | }, 2023 | "funding": { 2024 | "url": "https://github.com/sponsors/sindresorhus" 2025 | } 2026 | }, 2027 | "../../../node_modules/supports-color": { 2028 | "version": "7.2.0", 2029 | "dev": true, 2030 | "license": "MIT", 2031 | "dependencies": { 2032 | "has-flag": "^4.0.0" 2033 | }, 2034 | "engines": { 2035 | "node": ">=8" 2036 | } 2037 | }, 2038 | "../../../node_modules/supports-preserve-symlinks-flag": { 2039 | "version": "1.0.0", 2040 | "dev": true, 2041 | "license": "MIT", 2042 | "engines": { 2043 | "node": ">= 0.4" 2044 | }, 2045 | "funding": { 2046 | "url": "https://github.com/sponsors/ljharb" 2047 | } 2048 | }, 2049 | "../../../node_modules/text-table": { 2050 | "version": "0.2.0", 2051 | "dev": true, 2052 | "license": "MIT" 2053 | }, 2054 | "../../../node_modules/time-zone": { 2055 | "version": "1.0.0", 2056 | "dev": true, 2057 | "license": "MIT", 2058 | "engines": { 2059 | "node": ">=4" 2060 | } 2061 | }, 2062 | "../../../node_modules/to-regex-range": { 2063 | "version": "5.0.1", 2064 | "dev": true, 2065 | "license": "MIT", 2066 | "dependencies": { 2067 | "is-number": "^7.0.0" 2068 | }, 2069 | "engines": { 2070 | "node": ">=8.0" 2071 | } 2072 | }, 2073 | "../../../node_modules/tsconfig-paths": { 2074 | "version": "3.14.1", 2075 | "dev": true, 2076 | "license": "MIT", 2077 | "dependencies": { 2078 | "@types/json5": "^0.0.29", 2079 | "json5": "^1.0.1", 2080 | "minimist": "^1.2.6", 2081 | "strip-bom": "^3.0.0" 2082 | } 2083 | }, 2084 | "../../../node_modules/type-check": { 2085 | "version": "0.4.0", 2086 | "dev": true, 2087 | "license": "MIT", 2088 | "dependencies": { 2089 | "prelude-ls": "^1.2.1" 2090 | }, 2091 | "engines": { 2092 | "node": ">= 0.8.0" 2093 | } 2094 | }, 2095 | "../../../node_modules/type-fest": { 2096 | "version": "0.20.2", 2097 | "dev": true, 2098 | "license": "(MIT OR CC0-1.0)", 2099 | "engines": { 2100 | "node": ">=10" 2101 | }, 2102 | "funding": { 2103 | "url": "https://github.com/sponsors/sindresorhus" 2104 | } 2105 | }, 2106 | "../../../node_modules/typescript": { 2107 | "version": "4.8.2", 2108 | "dev": true, 2109 | "license": "Apache-2.0", 2110 | "bin": { 2111 | "tsc": "bin/tsc", 2112 | "tsserver": "bin/tsserver" 2113 | }, 2114 | "engines": { 2115 | "node": ">=4.2.0" 2116 | } 2117 | }, 2118 | "../../../node_modules/unbox-primitive": { 2119 | "version": "1.0.2", 2120 | "dev": true, 2121 | "license": "MIT", 2122 | "dependencies": { 2123 | "call-bind": "^1.0.2", 2124 | "has-bigints": "^1.0.2", 2125 | "has-symbols": "^1.0.3", 2126 | "which-boxed-primitive": "^1.0.2" 2127 | }, 2128 | "funding": { 2129 | "url": "https://github.com/sponsors/ljharb" 2130 | } 2131 | }, 2132 | "../../../node_modules/uri-js": { 2133 | "version": "4.4.1", 2134 | "dev": true, 2135 | "license": "BSD-2-Clause", 2136 | "dependencies": { 2137 | "punycode": "^2.1.0" 2138 | } 2139 | }, 2140 | "../../../node_modules/well-known-symbols": { 2141 | "version": "2.0.0", 2142 | "dev": true, 2143 | "license": "ISC", 2144 | "engines": { 2145 | "node": ">=6" 2146 | } 2147 | }, 2148 | "../../../node_modules/which": { 2149 | "version": "2.0.2", 2150 | "dev": true, 2151 | "license": "ISC", 2152 | "dependencies": { 2153 | "isexe": "^2.0.0" 2154 | }, 2155 | "bin": { 2156 | "node-which": "bin/node-which" 2157 | }, 2158 | "engines": { 2159 | "node": ">= 8" 2160 | } 2161 | }, 2162 | "../../../node_modules/which-boxed-primitive": { 2163 | "version": "1.0.2", 2164 | "dev": true, 2165 | "license": "MIT", 2166 | "dependencies": { 2167 | "is-bigint": "^1.0.1", 2168 | "is-boolean-object": "^1.1.0", 2169 | "is-number-object": "^1.0.4", 2170 | "is-string": "^1.0.5", 2171 | "is-symbol": "^1.0.3" 2172 | }, 2173 | "funding": { 2174 | "url": "https://github.com/sponsors/ljharb" 2175 | } 2176 | }, 2177 | "../../../node_modules/word-wrap": { 2178 | "version": "1.2.3", 2179 | "dev": true, 2180 | "license": "MIT", 2181 | "engines": { 2182 | "node": ">=0.10.0" 2183 | } 2184 | }, 2185 | "../../../node_modules/wrappy": { 2186 | "version": "1.0.2", 2187 | "dev": true, 2188 | "license": "ISC" 2189 | }, 2190 | "../../../node_modules/yallist": { 2191 | "version": "4.0.0", 2192 | "license": "ISC" 2193 | }, 2194 | "../../../node_modules/yocto-queue": { 2195 | "version": "0.1.0", 2196 | "dev": true, 2197 | "license": "MIT", 2198 | "engines": { 2199 | "node": ">=10" 2200 | }, 2201 | "funding": { 2202 | "url": "https://github.com/sponsors/sindresorhus" 2203 | } 2204 | }, 2205 | "node_modules/electron-simple-updater": { 2206 | "resolved": "../../..", 2207 | "link": true 2208 | } 2209 | }, 2210 | "dependencies": { 2211 | "electron-simple-updater": { 2212 | "version": "file:../../..", 2213 | "requires": { 2214 | "@types/node": "^18.7.14", 2215 | "axios": "^0.27.2", 2216 | "eslint": "^8.23.0", 2217 | "eslint-config-airbnb-base": "^15.0.0", 2218 | "eslint-plugin-import": "^2.26.0", 2219 | "humile": "^0.5.0", 2220 | "semver": "^7.3.7", 2221 | "typescript": "^4.8.2" 2222 | }, 2223 | "dependencies": { 2224 | "@eslint/eslintrc": { 2225 | "version": "1.3.1", 2226 | "dev": true, 2227 | "requires": { 2228 | "ajv": "^6.12.4", 2229 | "debug": "^4.3.2", 2230 | "espree": "^9.4.0", 2231 | "globals": "^13.15.0", 2232 | "ignore": "^5.2.0", 2233 | "import-fresh": "^3.2.1", 2234 | "js-yaml": "^4.1.0", 2235 | "minimatch": "^3.1.2", 2236 | "strip-json-comments": "^3.1.1" 2237 | } 2238 | }, 2239 | "@humanwhocodes/config-array": { 2240 | "version": "0.10.4", 2241 | "dev": true, 2242 | "requires": { 2243 | "@humanwhocodes/object-schema": "^1.2.1", 2244 | "debug": "^4.1.1", 2245 | "minimatch": "^3.0.4" 2246 | } 2247 | }, 2248 | "@humanwhocodes/gitignore-to-minimatch": { 2249 | "version": "1.0.2", 2250 | "dev": true 2251 | }, 2252 | "@humanwhocodes/module-importer": { 2253 | "version": "1.0.1", 2254 | "dev": true 2255 | }, 2256 | "@humanwhocodes/object-schema": { 2257 | "version": "1.2.1", 2258 | "dev": true 2259 | }, 2260 | "@nodelib/fs.scandir": { 2261 | "version": "2.1.5", 2262 | "dev": true, 2263 | "requires": { 2264 | "@nodelib/fs.stat": "2.0.5", 2265 | "run-parallel": "^1.1.9" 2266 | } 2267 | }, 2268 | "@nodelib/fs.stat": { 2269 | "version": "2.0.5", 2270 | "dev": true 2271 | }, 2272 | "@nodelib/fs.walk": { 2273 | "version": "1.2.8", 2274 | "dev": true, 2275 | "requires": { 2276 | "@nodelib/fs.scandir": "2.1.5", 2277 | "fastq": "^1.6.0" 2278 | } 2279 | }, 2280 | "@types/jasmine": { 2281 | "version": "4.3.0", 2282 | "dev": true 2283 | }, 2284 | "@types/json5": { 2285 | "version": "0.0.29", 2286 | "dev": true 2287 | }, 2288 | "@types/node": { 2289 | "version": "18.7.14", 2290 | "dev": true 2291 | }, 2292 | "acorn": { 2293 | "version": "8.8.0", 2294 | "dev": true 2295 | }, 2296 | "acorn-jsx": { 2297 | "version": "5.3.2", 2298 | "dev": true, 2299 | "requires": {} 2300 | }, 2301 | "ajv": { 2302 | "version": "6.12.6", 2303 | "dev": true, 2304 | "requires": { 2305 | "fast-deep-equal": "^3.1.1", 2306 | "fast-json-stable-stringify": "^2.0.0", 2307 | "json-schema-traverse": "^0.4.1", 2308 | "uri-js": "^4.2.2" 2309 | } 2310 | }, 2311 | "ansi-regex": { 2312 | "version": "5.0.1", 2313 | "dev": true 2314 | }, 2315 | "ansi-styles": { 2316 | "version": "4.3.0", 2317 | "dev": true, 2318 | "requires": { 2319 | "color-convert": "^2.0.1" 2320 | } 2321 | }, 2322 | "argparse": { 2323 | "version": "2.0.1", 2324 | "dev": true 2325 | }, 2326 | "array-includes": { 2327 | "version": "3.1.5", 2328 | "dev": true, 2329 | "requires": { 2330 | "call-bind": "^1.0.2", 2331 | "define-properties": "^1.1.4", 2332 | "es-abstract": "^1.19.5", 2333 | "get-intrinsic": "^1.1.1", 2334 | "is-string": "^1.0.7" 2335 | } 2336 | }, 2337 | "array-union": { 2338 | "version": "2.1.0", 2339 | "dev": true 2340 | }, 2341 | "array.prototype.flat": { 2342 | "version": "1.3.0", 2343 | "dev": true, 2344 | "requires": { 2345 | "call-bind": "^1.0.2", 2346 | "define-properties": "^1.1.3", 2347 | "es-abstract": "^1.19.2", 2348 | "es-shim-unscopables": "^1.0.0" 2349 | } 2350 | }, 2351 | "asynckit": { 2352 | "version": "0.4.0" 2353 | }, 2354 | "axios": { 2355 | "version": "0.27.2", 2356 | "requires": { 2357 | "follow-redirects": "^1.14.9", 2358 | "form-data": "^4.0.0" 2359 | } 2360 | }, 2361 | "balanced-match": { 2362 | "version": "1.0.2", 2363 | "dev": true 2364 | }, 2365 | "blueimp-md5": { 2366 | "version": "2.19.0", 2367 | "dev": true 2368 | }, 2369 | "brace-expansion": { 2370 | "version": "1.1.11", 2371 | "dev": true, 2372 | "requires": { 2373 | "balanced-match": "^1.0.0", 2374 | "concat-map": "0.0.1" 2375 | } 2376 | }, 2377 | "braces": { 2378 | "version": "3.0.2", 2379 | "dev": true, 2380 | "requires": { 2381 | "fill-range": "^7.0.1" 2382 | } 2383 | }, 2384 | "call-bind": { 2385 | "version": "1.0.2", 2386 | "dev": true, 2387 | "requires": { 2388 | "function-bind": "^1.1.1", 2389 | "get-intrinsic": "^1.0.2" 2390 | } 2391 | }, 2392 | "callsites": { 2393 | "version": "3.1.0", 2394 | "dev": true 2395 | }, 2396 | "chalk": { 2397 | "version": "4.1.2", 2398 | "dev": true, 2399 | "requires": { 2400 | "ansi-styles": "^4.1.0", 2401 | "supports-color": "^7.1.0" 2402 | } 2403 | }, 2404 | "color-convert": { 2405 | "version": "2.0.1", 2406 | "dev": true, 2407 | "requires": { 2408 | "color-name": "~1.1.4" 2409 | } 2410 | }, 2411 | "color-name": { 2412 | "version": "1.1.4", 2413 | "dev": true 2414 | }, 2415 | "combined-stream": { 2416 | "version": "1.0.8", 2417 | "requires": { 2418 | "delayed-stream": "~1.0.0" 2419 | } 2420 | }, 2421 | "concat-map": { 2422 | "version": "0.0.1", 2423 | "dev": true 2424 | }, 2425 | "concordance": { 2426 | "version": "5.0.4", 2427 | "dev": true, 2428 | "requires": { 2429 | "date-time": "^3.1.0", 2430 | "esutils": "^2.0.3", 2431 | "fast-diff": "^1.2.0", 2432 | "js-string-escape": "^1.0.1", 2433 | "lodash": "^4.17.15", 2434 | "md5-hex": "^3.0.1", 2435 | "semver": "^7.3.2", 2436 | "well-known-symbols": "^2.0.0" 2437 | } 2438 | }, 2439 | "confusing-browser-globals": { 2440 | "version": "1.0.11", 2441 | "dev": true 2442 | }, 2443 | "cross-spawn": { 2444 | "version": "7.0.3", 2445 | "dev": true, 2446 | "requires": { 2447 | "path-key": "^3.1.0", 2448 | "shebang-command": "^2.0.0", 2449 | "which": "^2.0.1" 2450 | } 2451 | }, 2452 | "date-time": { 2453 | "version": "3.1.0", 2454 | "dev": true, 2455 | "requires": { 2456 | "time-zone": "^1.0.0" 2457 | } 2458 | }, 2459 | "debug": { 2460 | "version": "4.3.4", 2461 | "dev": true, 2462 | "requires": { 2463 | "ms": "2.1.2" 2464 | } 2465 | }, 2466 | "deep-is": { 2467 | "version": "0.1.4", 2468 | "dev": true 2469 | }, 2470 | "define-properties": { 2471 | "version": "1.1.4", 2472 | "dev": true, 2473 | "requires": { 2474 | "has-property-descriptors": "^1.0.0", 2475 | "object-keys": "^1.1.1" 2476 | } 2477 | }, 2478 | "delayed-stream": { 2479 | "version": "1.0.0" 2480 | }, 2481 | "dir-glob": { 2482 | "version": "3.0.1", 2483 | "dev": true, 2484 | "requires": { 2485 | "path-type": "^4.0.0" 2486 | } 2487 | }, 2488 | "doctrine": { 2489 | "version": "3.0.0", 2490 | "dev": true, 2491 | "requires": { 2492 | "esutils": "^2.0.2" 2493 | } 2494 | }, 2495 | "es-abstract": { 2496 | "version": "1.20.1", 2497 | "dev": true, 2498 | "requires": { 2499 | "call-bind": "^1.0.2", 2500 | "es-to-primitive": "^1.2.1", 2501 | "function-bind": "^1.1.1", 2502 | "function.prototype.name": "^1.1.5", 2503 | "get-intrinsic": "^1.1.1", 2504 | "get-symbol-description": "^1.0.0", 2505 | "has": "^1.0.3", 2506 | "has-property-descriptors": "^1.0.0", 2507 | "has-symbols": "^1.0.3", 2508 | "internal-slot": "^1.0.3", 2509 | "is-callable": "^1.2.4", 2510 | "is-negative-zero": "^2.0.2", 2511 | "is-regex": "^1.1.4", 2512 | "is-shared-array-buffer": "^1.0.2", 2513 | "is-string": "^1.0.7", 2514 | "is-weakref": "^1.0.2", 2515 | "object-inspect": "^1.12.0", 2516 | "object-keys": "^1.1.1", 2517 | "object.assign": "^4.1.2", 2518 | "regexp.prototype.flags": "^1.4.3", 2519 | "string.prototype.trimend": "^1.0.5", 2520 | "string.prototype.trimstart": "^1.0.5", 2521 | "unbox-primitive": "^1.0.2" 2522 | } 2523 | }, 2524 | "es-shim-unscopables": { 2525 | "version": "1.0.0", 2526 | "dev": true, 2527 | "requires": { 2528 | "has": "^1.0.3" 2529 | } 2530 | }, 2531 | "es-to-primitive": { 2532 | "version": "1.2.1", 2533 | "dev": true, 2534 | "requires": { 2535 | "is-callable": "^1.1.4", 2536 | "is-date-object": "^1.0.1", 2537 | "is-symbol": "^1.0.2" 2538 | } 2539 | }, 2540 | "escape-string-regexp": { 2541 | "version": "4.0.0", 2542 | "dev": true 2543 | }, 2544 | "eslint": { 2545 | "version": "8.23.0", 2546 | "dev": true, 2547 | "requires": { 2548 | "@eslint/eslintrc": "^1.3.1", 2549 | "@humanwhocodes/config-array": "^0.10.4", 2550 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 2551 | "@humanwhocodes/module-importer": "^1.0.1", 2552 | "ajv": "^6.10.0", 2553 | "chalk": "^4.0.0", 2554 | "cross-spawn": "^7.0.2", 2555 | "debug": "^4.3.2", 2556 | "doctrine": "^3.0.0", 2557 | "escape-string-regexp": "^4.0.0", 2558 | "eslint-scope": "^7.1.1", 2559 | "eslint-utils": "^3.0.0", 2560 | "eslint-visitor-keys": "^3.3.0", 2561 | "espree": "^9.4.0", 2562 | "esquery": "^1.4.0", 2563 | "esutils": "^2.0.2", 2564 | "fast-deep-equal": "^3.1.3", 2565 | "file-entry-cache": "^6.0.1", 2566 | "find-up": "^5.0.0", 2567 | "functional-red-black-tree": "^1.0.1", 2568 | "glob-parent": "^6.0.1", 2569 | "globals": "^13.15.0", 2570 | "globby": "^11.1.0", 2571 | "grapheme-splitter": "^1.0.4", 2572 | "ignore": "^5.2.0", 2573 | "import-fresh": "^3.0.0", 2574 | "imurmurhash": "^0.1.4", 2575 | "is-glob": "^4.0.0", 2576 | "js-yaml": "^4.1.0", 2577 | "json-stable-stringify-without-jsonify": "^1.0.1", 2578 | "levn": "^0.4.1", 2579 | "lodash.merge": "^4.6.2", 2580 | "minimatch": "^3.1.2", 2581 | "natural-compare": "^1.4.0", 2582 | "optionator": "^0.9.1", 2583 | "regexpp": "^3.2.0", 2584 | "strip-ansi": "^6.0.1", 2585 | "strip-json-comments": "^3.1.0", 2586 | "text-table": "^0.2.0" 2587 | } 2588 | }, 2589 | "eslint-config-airbnb-base": { 2590 | "version": "15.0.0", 2591 | "dev": true, 2592 | "requires": { 2593 | "confusing-browser-globals": "^1.0.10", 2594 | "object.assign": "^4.1.2", 2595 | "object.entries": "^1.1.5", 2596 | "semver": "^6.3.0" 2597 | }, 2598 | "dependencies": { 2599 | "semver": { 2600 | "version": "6.3.0", 2601 | "dev": true 2602 | } 2603 | } 2604 | }, 2605 | "eslint-import-resolver-node": { 2606 | "version": "0.3.6", 2607 | "dev": true, 2608 | "requires": { 2609 | "debug": "^3.2.7", 2610 | "resolve": "^1.20.0" 2611 | }, 2612 | "dependencies": { 2613 | "debug": { 2614 | "version": "3.2.7", 2615 | "dev": true, 2616 | "requires": { 2617 | "ms": "^2.1.1" 2618 | } 2619 | } 2620 | } 2621 | }, 2622 | "eslint-module-utils": { 2623 | "version": "2.7.4", 2624 | "dev": true, 2625 | "requires": { 2626 | "debug": "^3.2.7" 2627 | }, 2628 | "dependencies": { 2629 | "debug": { 2630 | "version": "3.2.7", 2631 | "dev": true, 2632 | "requires": { 2633 | "ms": "^2.1.1" 2634 | } 2635 | } 2636 | } 2637 | }, 2638 | "eslint-plugin-import": { 2639 | "version": "2.26.0", 2640 | "dev": true, 2641 | "requires": { 2642 | "array-includes": "^3.1.4", 2643 | "array.prototype.flat": "^1.2.5", 2644 | "debug": "^2.6.9", 2645 | "doctrine": "^2.1.0", 2646 | "eslint-import-resolver-node": "^0.3.6", 2647 | "eslint-module-utils": "^2.7.3", 2648 | "has": "^1.0.3", 2649 | "is-core-module": "^2.8.1", 2650 | "is-glob": "^4.0.3", 2651 | "minimatch": "^3.1.2", 2652 | "object.values": "^1.1.5", 2653 | "resolve": "^1.22.0", 2654 | "tsconfig-paths": "^3.14.1" 2655 | }, 2656 | "dependencies": { 2657 | "debug": { 2658 | "version": "2.6.9", 2659 | "dev": true, 2660 | "requires": { 2661 | "ms": "2.0.0" 2662 | } 2663 | }, 2664 | "doctrine": { 2665 | "version": "2.1.0", 2666 | "dev": true, 2667 | "requires": { 2668 | "esutils": "^2.0.2" 2669 | } 2670 | }, 2671 | "ms": { 2672 | "version": "2.0.0", 2673 | "dev": true 2674 | } 2675 | } 2676 | }, 2677 | "eslint-scope": { 2678 | "version": "7.1.1", 2679 | "dev": true, 2680 | "requires": { 2681 | "esrecurse": "^4.3.0", 2682 | "estraverse": "^5.2.0" 2683 | } 2684 | }, 2685 | "eslint-utils": { 2686 | "version": "3.0.0", 2687 | "dev": true, 2688 | "requires": { 2689 | "eslint-visitor-keys": "^2.0.0" 2690 | }, 2691 | "dependencies": { 2692 | "eslint-visitor-keys": { 2693 | "version": "2.1.0", 2694 | "dev": true 2695 | } 2696 | } 2697 | }, 2698 | "eslint-visitor-keys": { 2699 | "version": "3.3.0", 2700 | "dev": true 2701 | }, 2702 | "espree": { 2703 | "version": "9.4.0", 2704 | "dev": true, 2705 | "requires": { 2706 | "acorn": "^8.8.0", 2707 | "acorn-jsx": "^5.3.2", 2708 | "eslint-visitor-keys": "^3.3.0" 2709 | } 2710 | }, 2711 | "esquery": { 2712 | "version": "1.4.0", 2713 | "dev": true, 2714 | "requires": { 2715 | "estraverse": "^5.1.0" 2716 | } 2717 | }, 2718 | "esrecurse": { 2719 | "version": "4.3.0", 2720 | "dev": true, 2721 | "requires": { 2722 | "estraverse": "^5.2.0" 2723 | } 2724 | }, 2725 | "estraverse": { 2726 | "version": "5.3.0", 2727 | "dev": true 2728 | }, 2729 | "esutils": { 2730 | "version": "2.0.3", 2731 | "dev": true 2732 | }, 2733 | "fast-deep-equal": { 2734 | "version": "3.1.3", 2735 | "dev": true 2736 | }, 2737 | "fast-diff": { 2738 | "version": "1.2.0", 2739 | "dev": true 2740 | }, 2741 | "fast-glob": { 2742 | "version": "3.2.11", 2743 | "dev": true, 2744 | "requires": { 2745 | "@nodelib/fs.stat": "^2.0.2", 2746 | "@nodelib/fs.walk": "^1.2.3", 2747 | "glob-parent": "^5.1.2", 2748 | "merge2": "^1.3.0", 2749 | "micromatch": "^4.0.4" 2750 | }, 2751 | "dependencies": { 2752 | "glob-parent": { 2753 | "version": "5.1.2", 2754 | "dev": true, 2755 | "requires": { 2756 | "is-glob": "^4.0.1" 2757 | } 2758 | } 2759 | } 2760 | }, 2761 | "fast-json-stable-stringify": { 2762 | "version": "2.1.0", 2763 | "dev": true 2764 | }, 2765 | "fast-levenshtein": { 2766 | "version": "2.0.6", 2767 | "dev": true 2768 | }, 2769 | "fastq": { 2770 | "version": "1.13.0", 2771 | "dev": true, 2772 | "requires": { 2773 | "reusify": "^1.0.4" 2774 | } 2775 | }, 2776 | "file-entry-cache": { 2777 | "version": "6.0.1", 2778 | "dev": true, 2779 | "requires": { 2780 | "flat-cache": "^3.0.4" 2781 | } 2782 | }, 2783 | "fill-range": { 2784 | "version": "7.0.1", 2785 | "dev": true, 2786 | "requires": { 2787 | "to-regex-range": "^5.0.1" 2788 | } 2789 | }, 2790 | "find-up": { 2791 | "version": "5.0.0", 2792 | "dev": true, 2793 | "requires": { 2794 | "locate-path": "^6.0.0", 2795 | "path-exists": "^4.0.0" 2796 | } 2797 | }, 2798 | "flat-cache": { 2799 | "version": "3.0.4", 2800 | "dev": true, 2801 | "requires": { 2802 | "flatted": "^3.1.0", 2803 | "rimraf": "^3.0.2" 2804 | } 2805 | }, 2806 | "flatted": { 2807 | "version": "3.2.7", 2808 | "dev": true 2809 | }, 2810 | "follow-redirects": { 2811 | "version": "1.15.1" 2812 | }, 2813 | "form-data": { 2814 | "version": "4.0.0", 2815 | "requires": { 2816 | "asynckit": "^0.4.0", 2817 | "combined-stream": "^1.0.8", 2818 | "mime-types": "^2.1.12" 2819 | } 2820 | }, 2821 | "fs.realpath": { 2822 | "version": "1.0.0", 2823 | "dev": true 2824 | }, 2825 | "function-bind": { 2826 | "version": "1.1.1", 2827 | "dev": true 2828 | }, 2829 | "function.prototype.name": { 2830 | "version": "1.1.5", 2831 | "dev": true, 2832 | "requires": { 2833 | "call-bind": "^1.0.2", 2834 | "define-properties": "^1.1.3", 2835 | "es-abstract": "^1.19.0", 2836 | "functions-have-names": "^1.2.2" 2837 | } 2838 | }, 2839 | "functional-red-black-tree": { 2840 | "version": "1.0.1", 2841 | "dev": true 2842 | }, 2843 | "functions-have-names": { 2844 | "version": "1.2.3", 2845 | "dev": true 2846 | }, 2847 | "get-intrinsic": { 2848 | "version": "1.1.2", 2849 | "dev": true, 2850 | "requires": { 2851 | "function-bind": "^1.1.1", 2852 | "has": "^1.0.3", 2853 | "has-symbols": "^1.0.3" 2854 | } 2855 | }, 2856 | "get-symbol-description": { 2857 | "version": "1.0.0", 2858 | "dev": true, 2859 | "requires": { 2860 | "call-bind": "^1.0.2", 2861 | "get-intrinsic": "^1.1.1" 2862 | } 2863 | }, 2864 | "glob": { 2865 | "version": "8.0.3", 2866 | "dev": true, 2867 | "requires": { 2868 | "fs.realpath": "^1.0.0", 2869 | "inflight": "^1.0.4", 2870 | "inherits": "2", 2871 | "minimatch": "^5.0.1", 2872 | "once": "^1.3.0" 2873 | }, 2874 | "dependencies": { 2875 | "brace-expansion": { 2876 | "version": "2.0.1", 2877 | "dev": true, 2878 | "requires": { 2879 | "balanced-match": "^1.0.0" 2880 | } 2881 | }, 2882 | "minimatch": { 2883 | "version": "5.1.0", 2884 | "dev": true, 2885 | "requires": { 2886 | "brace-expansion": "^2.0.1" 2887 | } 2888 | } 2889 | } 2890 | }, 2891 | "glob-parent": { 2892 | "version": "6.0.2", 2893 | "dev": true, 2894 | "requires": { 2895 | "is-glob": "^4.0.3" 2896 | } 2897 | }, 2898 | "globals": { 2899 | "version": "13.17.0", 2900 | "dev": true, 2901 | "requires": { 2902 | "type-fest": "^0.20.2" 2903 | } 2904 | }, 2905 | "globby": { 2906 | "version": "11.1.0", 2907 | "dev": true, 2908 | "requires": { 2909 | "array-union": "^2.1.0", 2910 | "dir-glob": "^3.0.1", 2911 | "fast-glob": "^3.2.9", 2912 | "ignore": "^5.2.0", 2913 | "merge2": "^1.4.1", 2914 | "slash": "^3.0.0" 2915 | } 2916 | }, 2917 | "grapheme-splitter": { 2918 | "version": "1.0.4", 2919 | "dev": true 2920 | }, 2921 | "has": { 2922 | "version": "1.0.3", 2923 | "dev": true, 2924 | "requires": { 2925 | "function-bind": "^1.1.1" 2926 | } 2927 | }, 2928 | "has-bigints": { 2929 | "version": "1.0.2", 2930 | "dev": true 2931 | }, 2932 | "has-flag": { 2933 | "version": "4.0.0", 2934 | "dev": true 2935 | }, 2936 | "has-property-descriptors": { 2937 | "version": "1.0.0", 2938 | "dev": true, 2939 | "requires": { 2940 | "get-intrinsic": "^1.1.1" 2941 | } 2942 | }, 2943 | "has-symbols": { 2944 | "version": "1.0.3", 2945 | "dev": true 2946 | }, 2947 | "has-tostringtag": { 2948 | "version": "1.0.0", 2949 | "dev": true, 2950 | "requires": { 2951 | "has-symbols": "^1.0.2" 2952 | } 2953 | }, 2954 | "humile": { 2955 | "version": "0.5.0", 2956 | "dev": true, 2957 | "requires": { 2958 | "@types/jasmine": "^4.0.3", 2959 | "concordance": "^5.0.4", 2960 | "glob": "^8.0.3", 2961 | "jasmine-core": "^4.2.0", 2962 | "package-options": "^0.1.4" 2963 | } 2964 | }, 2965 | "ignore": { 2966 | "version": "5.2.0", 2967 | "dev": true 2968 | }, 2969 | "import-fresh": { 2970 | "version": "3.3.0", 2971 | "dev": true, 2972 | "requires": { 2973 | "parent-module": "^1.0.0", 2974 | "resolve-from": "^4.0.0" 2975 | } 2976 | }, 2977 | "imurmurhash": { 2978 | "version": "0.1.4", 2979 | "dev": true 2980 | }, 2981 | "inflight": { 2982 | "version": "1.0.6", 2983 | "dev": true, 2984 | "requires": { 2985 | "once": "^1.3.0", 2986 | "wrappy": "1" 2987 | } 2988 | }, 2989 | "inherits": { 2990 | "version": "2.0.4", 2991 | "dev": true 2992 | }, 2993 | "internal-slot": { 2994 | "version": "1.0.3", 2995 | "dev": true, 2996 | "requires": { 2997 | "get-intrinsic": "^1.1.0", 2998 | "has": "^1.0.3", 2999 | "side-channel": "^1.0.4" 3000 | } 3001 | }, 3002 | "is-bigint": { 3003 | "version": "1.0.4", 3004 | "dev": true, 3005 | "requires": { 3006 | "has-bigints": "^1.0.1" 3007 | } 3008 | }, 3009 | "is-boolean-object": { 3010 | "version": "1.1.2", 3011 | "dev": true, 3012 | "requires": { 3013 | "call-bind": "^1.0.2", 3014 | "has-tostringtag": "^1.0.0" 3015 | } 3016 | }, 3017 | "is-callable": { 3018 | "version": "1.2.4", 3019 | "dev": true 3020 | }, 3021 | "is-core-module": { 3022 | "version": "2.10.0", 3023 | "dev": true, 3024 | "requires": { 3025 | "has": "^1.0.3" 3026 | } 3027 | }, 3028 | "is-date-object": { 3029 | "version": "1.0.5", 3030 | "dev": true, 3031 | "requires": { 3032 | "has-tostringtag": "^1.0.0" 3033 | } 3034 | }, 3035 | "is-extglob": { 3036 | "version": "2.1.1", 3037 | "dev": true 3038 | }, 3039 | "is-glob": { 3040 | "version": "4.0.3", 3041 | "dev": true, 3042 | "requires": { 3043 | "is-extglob": "^2.1.1" 3044 | } 3045 | }, 3046 | "is-negative-zero": { 3047 | "version": "2.0.2", 3048 | "dev": true 3049 | }, 3050 | "is-number": { 3051 | "version": "7.0.0", 3052 | "dev": true 3053 | }, 3054 | "is-number-object": { 3055 | "version": "1.0.7", 3056 | "dev": true, 3057 | "requires": { 3058 | "has-tostringtag": "^1.0.0" 3059 | } 3060 | }, 3061 | "is-regex": { 3062 | "version": "1.1.4", 3063 | "dev": true, 3064 | "requires": { 3065 | "call-bind": "^1.0.2", 3066 | "has-tostringtag": "^1.0.0" 3067 | } 3068 | }, 3069 | "is-shared-array-buffer": { 3070 | "version": "1.0.2", 3071 | "dev": true, 3072 | "requires": { 3073 | "call-bind": "^1.0.2" 3074 | } 3075 | }, 3076 | "is-string": { 3077 | "version": "1.0.7", 3078 | "dev": true, 3079 | "requires": { 3080 | "has-tostringtag": "^1.0.0" 3081 | } 3082 | }, 3083 | "is-symbol": { 3084 | "version": "1.0.4", 3085 | "dev": true, 3086 | "requires": { 3087 | "has-symbols": "^1.0.2" 3088 | } 3089 | }, 3090 | "is-weakref": { 3091 | "version": "1.0.2", 3092 | "dev": true, 3093 | "requires": { 3094 | "call-bind": "^1.0.2" 3095 | } 3096 | }, 3097 | "isexe": { 3098 | "version": "2.0.0", 3099 | "dev": true 3100 | }, 3101 | "jasmine-core": { 3102 | "version": "4.3.0", 3103 | "dev": true 3104 | }, 3105 | "js-string-escape": { 3106 | "version": "1.0.1", 3107 | "dev": true 3108 | }, 3109 | "js-yaml": { 3110 | "version": "4.1.0", 3111 | "dev": true, 3112 | "requires": { 3113 | "argparse": "^2.0.1" 3114 | } 3115 | }, 3116 | "json-schema-traverse": { 3117 | "version": "0.4.1", 3118 | "dev": true 3119 | }, 3120 | "json-stable-stringify-without-jsonify": { 3121 | "version": "1.0.1", 3122 | "dev": true 3123 | }, 3124 | "json5": { 3125 | "version": "1.0.1", 3126 | "dev": true, 3127 | "requires": { 3128 | "minimist": "^1.2.0" 3129 | } 3130 | }, 3131 | "levn": { 3132 | "version": "0.4.1", 3133 | "dev": true, 3134 | "requires": { 3135 | "prelude-ls": "^1.2.1", 3136 | "type-check": "~0.4.0" 3137 | } 3138 | }, 3139 | "locate-path": { 3140 | "version": "6.0.0", 3141 | "dev": true, 3142 | "requires": { 3143 | "p-locate": "^5.0.0" 3144 | } 3145 | }, 3146 | "lodash": { 3147 | "version": "4.17.21", 3148 | "dev": true 3149 | }, 3150 | "lodash.merge": { 3151 | "version": "4.6.2", 3152 | "dev": true 3153 | }, 3154 | "lru-cache": { 3155 | "version": "6.0.0", 3156 | "requires": { 3157 | "yallist": "^4.0.0" 3158 | } 3159 | }, 3160 | "md5-hex": { 3161 | "version": "3.0.1", 3162 | "dev": true, 3163 | "requires": { 3164 | "blueimp-md5": "^2.10.0" 3165 | } 3166 | }, 3167 | "merge2": { 3168 | "version": "1.4.1", 3169 | "dev": true 3170 | }, 3171 | "micromatch": { 3172 | "version": "4.0.5", 3173 | "dev": true, 3174 | "requires": { 3175 | "braces": "^3.0.2", 3176 | "picomatch": "^2.3.1" 3177 | } 3178 | }, 3179 | "mime-db": { 3180 | "version": "1.52.0" 3181 | }, 3182 | "mime-types": { 3183 | "version": "2.1.35", 3184 | "requires": { 3185 | "mime-db": "1.52.0" 3186 | } 3187 | }, 3188 | "minimatch": { 3189 | "version": "3.1.2", 3190 | "dev": true, 3191 | "requires": { 3192 | "brace-expansion": "^1.1.7" 3193 | } 3194 | }, 3195 | "minimist": { 3196 | "version": "1.2.6", 3197 | "dev": true 3198 | }, 3199 | "ms": { 3200 | "version": "2.1.2", 3201 | "dev": true 3202 | }, 3203 | "natural-compare": { 3204 | "version": "1.4.0", 3205 | "dev": true 3206 | }, 3207 | "object-inspect": { 3208 | "version": "1.12.2", 3209 | "dev": true 3210 | }, 3211 | "object-keys": { 3212 | "version": "1.1.1", 3213 | "dev": true 3214 | }, 3215 | "object.assign": { 3216 | "version": "4.1.4", 3217 | "dev": true, 3218 | "requires": { 3219 | "call-bind": "^1.0.2", 3220 | "define-properties": "^1.1.4", 3221 | "has-symbols": "^1.0.3", 3222 | "object-keys": "^1.1.1" 3223 | } 3224 | }, 3225 | "object.entries": { 3226 | "version": "1.1.5", 3227 | "dev": true, 3228 | "requires": { 3229 | "call-bind": "^1.0.2", 3230 | "define-properties": "^1.1.3", 3231 | "es-abstract": "^1.19.1" 3232 | } 3233 | }, 3234 | "object.values": { 3235 | "version": "1.1.5", 3236 | "dev": true, 3237 | "requires": { 3238 | "call-bind": "^1.0.2", 3239 | "define-properties": "^1.1.3", 3240 | "es-abstract": "^1.19.1" 3241 | } 3242 | }, 3243 | "once": { 3244 | "version": "1.4.0", 3245 | "dev": true, 3246 | "requires": { 3247 | "wrappy": "1" 3248 | } 3249 | }, 3250 | "optionator": { 3251 | "version": "0.9.1", 3252 | "dev": true, 3253 | "requires": { 3254 | "deep-is": "^0.1.3", 3255 | "fast-levenshtein": "^2.0.6", 3256 | "levn": "^0.4.1", 3257 | "prelude-ls": "^1.2.1", 3258 | "type-check": "^0.4.0", 3259 | "word-wrap": "^1.2.3" 3260 | } 3261 | }, 3262 | "p-limit": { 3263 | "version": "3.1.0", 3264 | "dev": true, 3265 | "requires": { 3266 | "yocto-queue": "^0.1.0" 3267 | } 3268 | }, 3269 | "p-locate": { 3270 | "version": "5.0.0", 3271 | "dev": true, 3272 | "requires": { 3273 | "p-limit": "^3.0.2" 3274 | } 3275 | }, 3276 | "package-options": { 3277 | "version": "0.1.4", 3278 | "dev": true 3279 | }, 3280 | "parent-module": { 3281 | "version": "1.0.1", 3282 | "dev": true, 3283 | "requires": { 3284 | "callsites": "^3.0.0" 3285 | } 3286 | }, 3287 | "path-exists": { 3288 | "version": "4.0.0", 3289 | "dev": true 3290 | }, 3291 | "path-is-absolute": { 3292 | "version": "1.0.1", 3293 | "dev": true 3294 | }, 3295 | "path-key": { 3296 | "version": "3.1.1", 3297 | "dev": true 3298 | }, 3299 | "path-parse": { 3300 | "version": "1.0.7", 3301 | "dev": true 3302 | }, 3303 | "path-type": { 3304 | "version": "4.0.0", 3305 | "dev": true 3306 | }, 3307 | "picomatch": { 3308 | "version": "2.3.1", 3309 | "dev": true 3310 | }, 3311 | "prelude-ls": { 3312 | "version": "1.2.1", 3313 | "dev": true 3314 | }, 3315 | "punycode": { 3316 | "version": "2.1.1", 3317 | "dev": true 3318 | }, 3319 | "queue-microtask": { 3320 | "version": "1.2.3", 3321 | "dev": true 3322 | }, 3323 | "regexp.prototype.flags": { 3324 | "version": "1.4.3", 3325 | "dev": true, 3326 | "requires": { 3327 | "call-bind": "^1.0.2", 3328 | "define-properties": "^1.1.3", 3329 | "functions-have-names": "^1.2.2" 3330 | } 3331 | }, 3332 | "regexpp": { 3333 | "version": "3.2.0", 3334 | "dev": true 3335 | }, 3336 | "resolve": { 3337 | "version": "1.22.1", 3338 | "dev": true, 3339 | "requires": { 3340 | "is-core-module": "^2.9.0", 3341 | "path-parse": "^1.0.7", 3342 | "supports-preserve-symlinks-flag": "^1.0.0" 3343 | } 3344 | }, 3345 | "resolve-from": { 3346 | "version": "4.0.0", 3347 | "dev": true 3348 | }, 3349 | "reusify": { 3350 | "version": "1.0.4", 3351 | "dev": true 3352 | }, 3353 | "rimraf": { 3354 | "version": "3.0.2", 3355 | "dev": true, 3356 | "requires": { 3357 | "glob": "^7.1.3" 3358 | }, 3359 | "dependencies": { 3360 | "glob": { 3361 | "version": "7.2.3", 3362 | "dev": true, 3363 | "requires": { 3364 | "fs.realpath": "^1.0.0", 3365 | "inflight": "^1.0.4", 3366 | "inherits": "2", 3367 | "minimatch": "^3.1.1", 3368 | "once": "^1.3.0", 3369 | "path-is-absolute": "^1.0.0" 3370 | } 3371 | } 3372 | } 3373 | }, 3374 | "run-parallel": { 3375 | "version": "1.2.0", 3376 | "dev": true, 3377 | "requires": { 3378 | "queue-microtask": "^1.2.2" 3379 | } 3380 | }, 3381 | "semver": { 3382 | "version": "7.3.7", 3383 | "requires": { 3384 | "lru-cache": "^6.0.0" 3385 | } 3386 | }, 3387 | "shebang-command": { 3388 | "version": "2.0.0", 3389 | "dev": true, 3390 | "requires": { 3391 | "shebang-regex": "^3.0.0" 3392 | } 3393 | }, 3394 | "shebang-regex": { 3395 | "version": "3.0.0", 3396 | "dev": true 3397 | }, 3398 | "side-channel": { 3399 | "version": "1.0.4", 3400 | "dev": true, 3401 | "requires": { 3402 | "call-bind": "^1.0.0", 3403 | "get-intrinsic": "^1.0.2", 3404 | "object-inspect": "^1.9.0" 3405 | } 3406 | }, 3407 | "slash": { 3408 | "version": "3.0.0", 3409 | "dev": true 3410 | }, 3411 | "string.prototype.trimend": { 3412 | "version": "1.0.5", 3413 | "dev": true, 3414 | "requires": { 3415 | "call-bind": "^1.0.2", 3416 | "define-properties": "^1.1.4", 3417 | "es-abstract": "^1.19.5" 3418 | } 3419 | }, 3420 | "string.prototype.trimstart": { 3421 | "version": "1.0.5", 3422 | "dev": true, 3423 | "requires": { 3424 | "call-bind": "^1.0.2", 3425 | "define-properties": "^1.1.4", 3426 | "es-abstract": "^1.19.5" 3427 | } 3428 | }, 3429 | "strip-ansi": { 3430 | "version": "6.0.1", 3431 | "dev": true, 3432 | "requires": { 3433 | "ansi-regex": "^5.0.1" 3434 | } 3435 | }, 3436 | "strip-bom": { 3437 | "version": "3.0.0", 3438 | "dev": true 3439 | }, 3440 | "strip-json-comments": { 3441 | "version": "3.1.1", 3442 | "dev": true 3443 | }, 3444 | "supports-color": { 3445 | "version": "7.2.0", 3446 | "dev": true, 3447 | "requires": { 3448 | "has-flag": "^4.0.0" 3449 | } 3450 | }, 3451 | "supports-preserve-symlinks-flag": { 3452 | "version": "1.0.0", 3453 | "dev": true 3454 | }, 3455 | "text-table": { 3456 | "version": "0.2.0", 3457 | "dev": true 3458 | }, 3459 | "time-zone": { 3460 | "version": "1.0.0", 3461 | "dev": true 3462 | }, 3463 | "to-regex-range": { 3464 | "version": "5.0.1", 3465 | "dev": true, 3466 | "requires": { 3467 | "is-number": "^7.0.0" 3468 | } 3469 | }, 3470 | "tsconfig-paths": { 3471 | "version": "3.14.1", 3472 | "dev": true, 3473 | "requires": { 3474 | "@types/json5": "^0.0.29", 3475 | "json5": "^1.0.1", 3476 | "minimist": "^1.2.6", 3477 | "strip-bom": "^3.0.0" 3478 | } 3479 | }, 3480 | "type-check": { 3481 | "version": "0.4.0", 3482 | "dev": true, 3483 | "requires": { 3484 | "prelude-ls": "^1.2.1" 3485 | } 3486 | }, 3487 | "type-fest": { 3488 | "version": "0.20.2", 3489 | "dev": true 3490 | }, 3491 | "typescript": { 3492 | "version": "4.8.2", 3493 | "dev": true 3494 | }, 3495 | "unbox-primitive": { 3496 | "version": "1.0.2", 3497 | "dev": true, 3498 | "requires": { 3499 | "call-bind": "^1.0.2", 3500 | "has-bigints": "^1.0.2", 3501 | "has-symbols": "^1.0.3", 3502 | "which-boxed-primitive": "^1.0.2" 3503 | } 3504 | }, 3505 | "uri-js": { 3506 | "version": "4.4.1", 3507 | "dev": true, 3508 | "requires": { 3509 | "punycode": "^2.1.0" 3510 | } 3511 | }, 3512 | "well-known-symbols": { 3513 | "version": "2.0.0", 3514 | "dev": true 3515 | }, 3516 | "which": { 3517 | "version": "2.0.2", 3518 | "dev": true, 3519 | "requires": { 3520 | "isexe": "^2.0.0" 3521 | } 3522 | }, 3523 | "which-boxed-primitive": { 3524 | "version": "1.0.2", 3525 | "dev": true, 3526 | "requires": { 3527 | "is-bigint": "^1.0.1", 3528 | "is-boolean-object": "^1.1.0", 3529 | "is-number-object": "^1.0.4", 3530 | "is-string": "^1.0.5", 3531 | "is-symbol": "^1.0.3" 3532 | } 3533 | }, 3534 | "word-wrap": { 3535 | "version": "1.2.3", 3536 | "dev": true 3537 | }, 3538 | "wrappy": { 3539 | "version": "1.0.2", 3540 | "dev": true 3541 | }, 3542 | "yallist": { 3543 | "version": "4.0.0" 3544 | }, 3545 | "yocto-queue": { 3546 | "version": "0.1.0", 3547 | "dev": true 3548 | } 3549 | } 3550 | } 3551 | } 3552 | } 3553 | --------------------------------------------------------------------------------