diff --git a/.eslintrc.json b/.eslintrc.json index 8f88750..d095492 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,21 +1,18 @@ { - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "standard" - ], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018 - }, - "rules": { - "camelcase": "off", - "no-template-curly-in-string": "off" - } -} \ No newline at end of file + "env": { + "browser": true, + "commonjs": true, + "es6": true + }, + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "camelcase": "off", + "no-template-curly-in-string": "off" + } +} diff --git a/README.md b/README.md index a33453e..3a686dc 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,19 @@ ![logo](https://owo.whats-th.is/8mT5kxc.png) -##### This project is complete for now. + +##### This project is fork of [MCLC](https://github.com/Pierce01/MinecraftLauncher-core) + [![Build Status](https://travis-ci.com/Pierce01/MinecraftLauncher-core.svg?branch=master)](https://travis-ci.com/Pierce01/MinecraftLauncher-core) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![version](https://img.shields.io/badge/stable_version-3.17.0-blue) ![badge](https://img.shields.io/badge/ncurses-not_supported-purple) -MCLC (Minecraft Launcher Core) is a NodeJS solution for launching modded and vanilla Minecraft without having to download and format everything yourself. +PiMi (Minecraft Launcher Core) is a NodeJS solution for launching modded and vanilla Minecraft without having to download and format everything yourself. Basically a core for your Electron or script based launchers. ### Getting support + Since people seem to use this, I've created a Discord server for anyone who needs to get in contact with me or get help! +

console.log(e)); -launcher.on('data', (e) => console.log(e)); +launcher.on("debug", (e) => console.log(e)); +launcher.on("data", (e) => console.log(e)); ``` + ### Documentation #### Client Functions -| Function | Type | Description | -|----------|---------|-----------------------------------------------------------------------------------------| -| `launch` | Promise | Launches the client with the specified `options` as a parameter. Returns child the process | +| Function | Type | Description | +| -------- | ------- | ------------------------------------------------------------------------------------------ | +| `launch` | Promise | Launches the client with the specified `options` as a parameter. Returns child the process | ##### launch -| Parameter | Type | Description | Required | -|--------------------------|----------|-------------------------------------------------------------------------------------------|----------| -| `options.clientPackage` | String | Path or URL to a zip file, which will be extracted to the root directory. (Not recommended for production use)| False | -| `options.removePackage` | Boolean | Option to remove the client package zip file after its finished extracting. | False | -| `options.installer` | String | Path to installer being executed. | False | -| `options.root` | String | Path where you want the launcher to work in. `C:/Users/user/AppData/Roaming/.mc` | True | -| `options.cache` | String | Path where launcher files will be cached in. `C:/Users/user/AppData/Roaming/.mc/cache` | False | -| `options.os` | String | windows, osx or linux. MCLC will auto determine the OS if this field isn't provided. | False | -| `options.customLaunchArgs`| Array | Array of custom Minecraft arguments you want to add. | False | -| `options.customArgs` | Array | Array of custom Java arguments you want to add. | False | -| `options.features` | Array | Array of game argument feature flags. ex: `is_demo_user` or `has_custom_resolution` | False | -| `options.version.number` | String | Minecraft version that is going to be launched. | True | -| `options.version.type` | String | Any string. The actual Minecraft launcher uses `release` and `snapshot`. | True | -| `options.version.custom` | String | The name of the folder, jar file, and version json in the version folder. | False | -| `options.memory.max` | String | Max amount of memory being used by Minecraft. | True | -| `options.memory.min` | String | Min amount of memory being used by Minecraft. | True | -| `options.forge` | String | Path to Forge Jar. (Versions below 1.13 should be the "universal" jar while versions above 1.13+ should be the "installer" jar) | False | -| `options.javaPath` | String | Path to the JRE executable file, will default to `java` if not entered. | False | -| `options.quickPlay.type` | String | The type of the quickPlay session. `singleplayer`, `multiplayer`, `realms`, `legacy` | False | -| `options.quickPlay.identifier` | String | The folder name, server address, or realm ID, relating to the specified type. `legacy` follows `multiplayer` format. | False | -| `options.quickPlay.path` | String | The specified path for logging (relative to the run directory) | False | -| `options.proxy.host` | String | Host url to the proxy, don't include the port. | False | -| `options.proxy.port` | String | Port of the host proxy, will default to `8080` if not entered. | False | -| `options.proxy.username` | String | Username for the proxy. | False | -| `options.proxy.password` | String | Password for the proxy. | False | -| `options.timeout` | Integer | Timeout on download requests. | False | -| `options.window.width` | String | Width of the Minecraft Client. | False | -| `options.window.height` | String | Height of the Minecraft Client. | False | -| `options.window.fullscreen`| Boolean| Fullscreen the Minecraft Client. | False | -| `options.overrides` | Object | Json object redefining paths for better customization. Example below. | False | -#### IF YOU'RE NEW TO MCLC, LET IT HANDLE EVERYTHING! DO NOT USE OVERRIDES! +| Parameter | Type | Description | Required | +| ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `options.clientPackage` | String | Path or URL to a zip file, which will be extracted to the root directory. (Not recommended for production use) | False | +| `options.removePackage` | Boolean | Option to remove the client package zip file after its finished extracting. | False | +| `options.installer` | String | Path to installer being executed. | False | +| `options.root` | String | Path where you want the launcher to work in. `C:/Users/user/AppData/Roaming/.mc` | True | +| `options.cache` | String | Path where launcher files will be cached in. `C:/Users/user/AppData/Roaming/.mc/cache` | False | +| `options.os` | String | windows, osx or linux. PiMi will auto determine the OS if this field isn't provided. | False | +| `options.customLaunchArgs` | Array | Array of custom Minecraft arguments you want to add. | False | +| `options.customArgs` | Array | Array of custom Java arguments you want to add. | False | +| `options.features` | Array | Array of game argument feature flags. ex: `is_demo_user` or `has_custom_resolution` | False | +| `options.version.number` | String | Minecraft version that is going to be launched. | True | +| `options.version.type` | String | Any string. The actual Minecraft launcher uses `release` and `snapshot`. | True | +| `options.version.custom` | String | The name of the folder, jar file, and version json in the version folder. | False | +| `options.memory.max` | String | Max amount of memory being used by Minecraft. | True | +| `options.memory.min` | String | Min amount of memory being used by Minecraft. | True | +| `options.forge` | String | Path to Forge Jar. (Versions below 1.13 should be the "universal" jar while versions above 1.13+ should be the "installer" jar) | False | +| `options.javaPath` | String | Path to the JRE executable file, will default to `java` if not entered. | False | +| `options.quickPlay.type` | String | The type of the quickPlay session. `singleplayer`, `multiplayer`, `realms`, `legacy` | False | +| `options.quickPlay.identifier` | String | The folder name, server address, or realm ID, relating to the specified type. `legacy` follows `multiplayer` format. | False | +| `options.quickPlay.path` | String | The specified path for logging (relative to the run directory) | False | +| `options.proxy.host` | String | Host url to the proxy, don't include the port. | False | +| `options.proxy.port` | String | Port of the host proxy, will default to `8080` if not entered. | False | +| `options.proxy.username` | String | Username for the proxy. | False | +| `options.proxy.password` | String | Password for the proxy. | False | +| `options.timeout` | Integer | Timeout on download requests. | False | +| `options.window.width` | String | Width of the Minecraft Client. | False | +| `options.window.height` | String | Height of the Minecraft Client. | False | +| `options.window.fullscreen` | Boolean | Fullscreen the Minecraft Client. | False | +| `options.overrides` | Object | Json object redefining paths for better customization. Example below. | False | + +#### IF YOU'RE NEW TO PiMi, LET IT HANDLE EVERYTHING! DO NOT USE OVERRIDES! + ```js let opts = { otherOps..., @@ -115,7 +123,7 @@ let opts = { // in the version json. fallbackMaven: 'https://search.maven.org/remotecontent?filepath=' }, - // The following is options for which version of ForgeWrapper MCLC uses. This allows us to launch modern Forge. + // The following is options for which version of ForgeWrapper PiMi uses. This allows us to launch modern Forge. fw: { baseUrl: 'https://github.com/ZekerZhayard/ForgeWrapper/releases/download/', version: '1.5.1', @@ -128,12 +136,19 @@ let opts = { ``` #### Notes + ##### Custom -If you are loading up a client outside of vanilla Minecraft or Forge (Optifine and for an example), you'll need to download the needed files yourself if you don't provide downloads url downloads like Forge and Fabric. If no version jar is specified, MCLC will default back to the normal MC jar so mods like Fabric work. + +If you are loading up a client outside of vanilla Minecraft or Forge (Optifine and for an example), you'll need to download the needed files yourself if you don't provide downloads url downloads like Forge and Fabric. If no version jar is specified, PiMi will default back to the normal MC jar so mods like Fabric work. + ##### Installer + This runs an executable with specified launch arguments. Was used to support Forge 1.13 before ForgeWrapper. + ##### Authentication -MCLC's authenticator module does not support Microsoft authentication. You will need to use a library like [MSMC](https://github.com/Hanro50/MSMC). If you want to create your own solution, the following is the authorization JSON object format. + +PiMi's authenticator module does not support Microsoft authentication. You will need to use a library like [MSMC](https://github.com/Hanro50/MSMC). If you want to create your own solution, the following is the authorization JSON object format. + ```js { access_token: '', @@ -143,7 +158,7 @@ MCLC's authenticator module does not support Microsoft authentication. You will user_properties: '{}', meta: { type: 'mojang' || 'msa', - demo: true || false, // Demo can also be specified by adding 'is_demo_user' to the options.feature array + demo: true || false, // Demo can also be specified by adding 'is_demo_user' to the options.feature array // properties only exists for specific Minecraft versions. xuid: '', clientId: '' @@ -151,72 +166,74 @@ MCLC's authenticator module does not support Microsoft authentication. You will } ``` -#### Authenticator Functions +#### Authenticator Functions ##### getAuth -| Parameter | Type | Description | Required | -|-----------|--------|--------------------------------------------------------------|----------| -| `username`| String | Email or username | True | -| `password`| String | Password for the Mojang account being used if online mode. | False | -| `client_token`| String | Client token that will be used. If one is not specified, one will be generated | False | +| Parameter | Type | Description | Required | +| -------------- | ------ | ------------------------------------------------------------------------------ | -------- | +| `username` | String | Email or username | True | +| `password` | String | Password for the Mojang account being used if online mode. | False | +| `client_token` | String | Client token that will be used. If one is not specified, one will be generated | False | ##### validate -| Parameter | Type | Description | Required | -|--------------|--------|-------------------------------------------------------------------|----------| -| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | +| Parameter | Type | Description | Required | +| -------------- | ------ | -------------------------------------------------------------------------------- | -------- | +| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | | `client_token` | String | Client token being checked to see if there was a change of client (online mode). | True | -##### refreshAuth +##### refreshAuth -| Parameter | Type | Description | Required | -|--------------------|--------|-------------------------------------------------------------------------------------|----------| -| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | -| `client_token` | String | Token being checked if it's the same client that the access_token was created from. | True | +| Parameter | Type | Description | Required | +| -------------- | ------ | ----------------------------------------------------------------------------------- | -------- | +| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | +| `client_token` | String | Token being checked if it's the same client that the access_token was created from. | True | ##### invalidate -| Parameter | Type | Description | Required | -|--------------|--------|-------------------------------------------------------------------|----------| -| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | +| Parameter | Type | Description | Required | +| -------------- | ------ | ----------------------------------------------------------------------------------- | -------- | +| `access_token` | String | Token being checked if it can be used to login with (online mode). | True | | `client_token` | String | Token being checked if it's the same client that the access_token was created from. | True | ##### signOut -| Parameter | Type | Description | Required | -|--------------|--------|--------------------------------------|----------| +| Parameter | Type | Description | Required | +| ---------- | ------ | --------------------------- | -------- | | `username` | String | Username used to login with | True | | `password` | String | Password used to login with | True | ##### changeApiUrl | Parameter | Type | Description | Required | -|-----------|--------|--------------------------------------------------------------|----------| -| `url` | String | New URL that MCLC will make calls to authenticate the login. | True | +| --------- | ------ | ------------------------------------------------------------ | -------- | +| `url` | String | New URL that PiMi will make calls to authenticate the login. | True | #### Events -| Event Name | Type | Description | -|-------------------|---------|---------------------------------------------------------------------------------------| -| `arguments` | Object | Emitted when launch arguments are set for the Minecraft Jar. | -| `data` | String | Emitted when information is returned from the Minecraft Process | -| `close` | Integer | Code number that is returned by the Minecraft Process | -| `package-extract` | null | Emitted when `clientPackage` finishes being extracted | -| `download` | String | Emitted when a file successfully downloads | -| `download-status` | Object | Emitted when data is received while downloading | -| `debug` | String | Emitted when functions occur, made to help debug if errors occur | -| `progress` | Object | Emitted when files are being downloaded in order. (Assets, Forge, Natives, Classes) | - +| Event Name | Type | Description | +| ----------------- | ------- | ----------------------------------------------------------------------------------- | +| `arguments` | Object | Emitted when launch arguments are set for the Minecraft Jar. | +| `data` | String | Emitted when information is returned from the Minecraft Process | +| `close` | Integer | Code number that is returned by the Minecraft Process | +| `package-extract` | null | Emitted when `clientPackage` finishes being extracted | +| `download` | String | Emitted when a file successfully downloads | +| `download-status` | Object | Emitted when data is received while downloading | +| `debug` | String | Emitted when functions occur, made to help debug if errors occur | +| `progress` | Object | Emitted when files are being downloaded in order. (Assets, Forge, Natives, Classes) | #### What should it look like running from console? -The `pid` is printed in console after the process is launched. + +The `pid` is printed in console after the process is launched. ![gif](https://owo.whats-th.is/3N3PMC4.gif) ## Contributors + These are the people that helped out that aren't listed [here](https://github.com/Pierce01/MinecraftLauncher-core/graphs/contributors)! -* [Pyker](https://github.com/Pyker) - Forge dependency parsing. -* [Khionu](https://github.com/khionu) - Research on how Minecraft's`natives` are handled. -* [Coding-Kiwi](https://github.com/Coding-Kiwi) - Pointed out I didn't pass `clientToken` in initial authentication function. -* maxbsoft - Pointed out that a certain JVM option causes OSX Minecraft to bug out. -* [Noé](https://github.com/NoXeDev) - Pointed out launch args weren't being passed for Forge 1.13+. + +- [Pyker](https://github.com/Pyker) - Forge dependency parsing. +- [Khionu](https://github.com/khionu) - Research on how Minecraft's`natives` are handled. +- [Coding-Kiwi](https://github.com/Coding-Kiwi) - Pointed out I didn't pass `clientToken` in initial authentication function. +- maxbsoft - Pointed out that a certain JVM option causes OSX Minecraft to bug out. +- [Noé](https://github.com/NoXeDev) - Pointed out launch args weren't being passed for Forge 1.13+. diff --git a/components/authenticator.js b/components/authenticator.js index d3e7b52..38c0b38 100644 --- a/components/authenticator.js +++ b/components/authenticator.js @@ -1,42 +1,42 @@ -const request = require('request') -const { v3 } = require('uuid') +const request = require("request"); +const { v3 } = require("uuid"); -let uuid -let api_url = 'https://authserver.mojang.com' +let uuid; +let api_url = "https://authserver.mojang.com"; module.exports.getAuth = function (username, password, client_token = null) { return new Promise((resolve, reject) => { - getUUID(username) + getUUID(username); if (!password) { const user = { access_token: uuid, client_token: client_token || uuid, uuid, name: username, - user_properties: '{}' - } + user_properties: "{}", + }; - return resolve(user) + return resolve(user); } const requestObject = { - url: api_url + '/authenticate', + url: api_url + "/authenticate", json: { agent: { - name: 'Minecraft', - version: 1 + name: "Minecraft", + version: 1, }, username, password, clientToken: uuid, - requestUser: true - } - } + requestUser: true, + }, + }; request.post(requestObject, function (error, response, body) { - if (error) return reject(error) + if (error) return reject(error); if (!body || !body.selectedProfile) { - return reject(new Error('Validation error: ' + response.statusMessage)) + return reject(new Error("Validation error: " + response.statusMessage)); } const userProfile = { @@ -45,48 +45,48 @@ module.exports.getAuth = function (username, password, client_token = null) { uuid: body.selectedProfile.id, name: body.selectedProfile.name, selected_profile: body.selectedProfile, - user_properties: parsePropts(body.user.properties) - } + user_properties: parsePropts(body.user.properties), + }; - resolve(userProfile) - }) - }) -} + resolve(userProfile); + }); + }); +}; module.exports.validate = function (accessToken, clientToken) { return new Promise((resolve, reject) => { const requestObject = { - url: api_url + '/validate', + url: api_url + "/validate", json: { accessToken, - clientToken - } - } + clientToken, + }, + }; request.post(requestObject, async function (error, response, body) { - if (error) return reject(error) + if (error) return reject(error); - if (!body) resolve(true) - else reject(body) - }) - }) -} + if (!body) resolve(true); + else reject(body); + }); + }); +}; module.exports.refreshAuth = function (accessToken, clientToken) { return new Promise((resolve, reject) => { const requestObject = { - url: api_url + '/refresh', + url: api_url + "/refresh", json: { accessToken, clientToken, - requestUser: true - } - } + requestUser: true, + }, + }; request.post(requestObject, function (error, response, body) { - if (error) return reject(error) + if (error) return reject(error); if (!body || !body.selectedProfile) { - return reject(new Error('Validation error: ' + response.statusMessage)) + return reject(new Error("Validation error: " + response.statusMessage)); } const userProfile = { @@ -94,75 +94,75 @@ module.exports.refreshAuth = function (accessToken, clientToken) { client_token: getUUID(body.selectedProfile.name), uuid: body.selectedProfile.id, name: body.selectedProfile.name, - user_properties: parsePropts(body.user.properties) - } + user_properties: parsePropts(body.user.properties), + }; - return resolve(userProfile) - }) - }) -} + return resolve(userProfile); + }); + }); +}; module.exports.invalidate = function (accessToken, clientToken) { return new Promise((resolve, reject) => { const requestObject = { - url: api_url + '/invalidate', + url: api_url + "/invalidate", json: { accessToken, - clientToken - } - } + clientToken, + }, + }; request.post(requestObject, function (error, response, body) { - if (error) return reject(error) + if (error) return reject(error); - if (!body) return resolve(true) - else return reject(body) - }) - }) -} + if (!body) return resolve(true); + else return reject(body); + }); + }); +}; module.exports.signOut = function (username, password) { return new Promise((resolve, reject) => { const requestObject = { - url: api_url + '/signout', + url: api_url + "/signout", json: { username, - password - } - } + password, + }, + }; request.post(requestObject, function (error, response, body) { - if (error) return reject(error) + if (error) return reject(error); - if (!body) return resolve(true) - else return reject(body) - }) - }) -} + if (!body) return resolve(true); + else return reject(body); + }); + }); +}; module.exports.changeApiUrl = function (url) { - api_url = url -} + api_url = url; +}; -function parsePropts (array) { +function parsePropts(array) { if (array) { - const newObj = {} + const newObj = {}; for (const entry of array) { if (newObj[entry.name]) { - newObj[entry.name].push(entry.value) + newObj[entry.name].push(entry.value); } else { - newObj[entry.name] = [entry.value] + newObj[entry.name] = [entry.value]; } } - return JSON.stringify(newObj) + return JSON.stringify(newObj); } else { - return '{}' + return "{}"; } } -function getUUID (value) { +function getUUID(value) { if (!uuid) { - uuid = v3(value, v3.DNS) + uuid = v3(value, v3.DNS); } - return uuid + return uuid; } diff --git a/components/handler.js b/components/handler.js index 1acb92b..7dc0525 100644 --- a/components/handler.js +++ b/components/handler.js @@ -1,756 +1,1079 @@ -const fs = require('fs') -const path = require('path') -const request = require('request') -const checksum = require('checksum') -const Zip = require('adm-zip') -const child = require('child_process') -let counter = 0 +const fs = require("fs"); +const path = require("path"); +const request = require("request"); +const checksum = require("checksum"); +const Zip = require("adm-zip"); +const child = require("child_process"); +let counter = 0; class Handler { - constructor (client) { - this.client = client - this.options = client.options + constructor(client) { + this.client = client; + this.options = client.options; this.baseRequest = request.defaults({ pool: { maxSockets: this.options.overrides.maxSockets || 2 }, - timeout: this.options.timeout || 10000 - }) + timeout: this.options.timeout || 10000, + }); } - checkJava (java) { - return new Promise(resolve => { + checkJava(java) { + return new Promise((resolve) => { child.exec(`"${java}" -version`, (error, stdout, stderr) => { if (error) { resolve({ run: false, - message: error - }) + message: error, + }); } else { - this.client.emit('debug', `[MCLC]: Using Java version ${stderr.match(/"(.*?)"/).pop()} ${stderr.includes('64-Bit') ? '64-bit' : '32-Bit'}`) + this.client.emit( + "debug", + `[PiMi]: Using Java version ${stderr.match(/"(.*?)"/).pop()} ${ + stderr.includes("64-Bit") ? "64-bit" : "32-Bit" + }` + ); resolve({ - run: true - }) + run: true, + }); } - }) - }) + }); + }); } - downloadAsync (url, directory, name, retry, type) { - return new Promise(resolve => { - fs.mkdirSync(directory, { recursive: true }) + downloadAsync(url, directory, name, retry, type) { + return new Promise((resolve) => { + fs.mkdirSync(directory, { recursive: true }); - const _request = this.baseRequest(url) + const _request = this.baseRequest(url); - let receivedBytes = 0 - let totalBytes = 0 + let receivedBytes = 0; + let totalBytes = 0; - _request.on('response', (data) => { + _request.on("response", (data) => { if (data.statusCode === 404) { - this.client.emit('debug', `[MCLC]: Failed to download ${url} due to: File not found...`) - return resolve(false) + this.client.emit( + "debug", + `[PiMi]: Failed to download ${url} due to: File not found...` + ); + return resolve(false); } - totalBytes = parseInt(data.headers['content-length']) - }) + totalBytes = parseInt(data.headers["content-length"]); + }); - _request.on('error', async (error) => { - this.client.emit('debug', `[MCLC]: Failed to download asset to ${path.join(directory, name)} due to\n${error}.` + - ` Retrying... ${retry}`) - if (retry) await this.downloadAsync(url, directory, name, false, type) - resolve() - }) + _request.on("error", async (error) => { + this.client.emit( + "debug", + `[PiMi]: Failed to download asset to ${path.join( + directory, + name + )} due to\n${error}.` + ` Retrying... ${retry}` + ); + if (retry) await this.downloadAsync(url, directory, name, false, type); + resolve(); + }); - _request.on('data', (data) => { - receivedBytes += data.length - this.client.emit('download-status', { + _request.on("data", (data) => { + receivedBytes += data.length; + this.client.emit("download-status", { name: name, type: type, current: receivedBytes, - total: totalBytes - }) - }) + total: totalBytes, + }); + }); - const file = fs.createWriteStream(path.join(directory, name)) - _request.pipe(file) + const file = fs.createWriteStream(path.join(directory, name)); + _request.pipe(file); - file.once('finish', () => { - this.client.emit('download', name) + file.once("finish", () => { + this.client.emit("download", name); resolve({ failed: false, - asset: null - }) - }) + asset: null, + }); + }); - file.on('error', async (e) => { - this.client.emit('debug', `[MCLC]: Failed to download asset to ${path.join(directory, name)} due to\n${e}.` + - ` Retrying... ${retry}`) - if (fs.existsSync(path.join(directory, name))) fs.unlinkSync(path.join(directory, name)) - if (retry) await this.downloadAsync(url, directory, name, false, type) - resolve() - }) - }) + file.on("error", async (e) => { + this.client.emit( + "debug", + `[PiMi]: Failed to download asset to ${path.join( + directory, + name + )} due to\n${e}.` + ` Retrying... ${retry}` + ); + if (fs.existsSync(path.join(directory, name))) + fs.unlinkSync(path.join(directory, name)); + if (retry) await this.downloadAsync(url, directory, name, false, type); + resolve(); + }); + }); } - checkSum (hash, file) { + checkSum(hash, file) { return new Promise((resolve, reject) => { checksum.file(file, (err, sum) => { if (err) { - this.client.emit('debug', `[MCLC]: Failed to check file hash due to ${err}`) - resolve(false) + this.client.emit( + "debug", + `[PiMi]: Failed to check file hash due to ${err}` + ); + resolve(false); } else { - resolve(hash === sum) + resolve(hash === sum); } - }) - }) + }); + }); } - getVersion () { - return new Promise(resolve => { - const versionJsonPath = this.options.overrides.versionJson || path.join(this.options.directory, `${this.options.version.number}.json`) + getVersion() { + return new Promise((resolve) => { + const versionJsonPath = + this.options.overrides.versionJson || + path.join( + this.options.directory, + `${this.options.version.number}.json` + ); if (fs.existsSync(versionJsonPath)) { - this.version = JSON.parse(fs.readFileSync(versionJsonPath)) - return resolve(this.version) + this.version = JSON.parse(fs.readFileSync(versionJsonPath)); + return resolve(this.version); } - const manifest = `${this.options.overrides.url.meta}/mc/game/version_manifest.json` - const cache = this.options.cache ? `${this.options.cache}/json` : `${this.options.root}/cache/json` + const manifest = `${this.options.overrides.url.meta}/mc/game/version_manifest.json`; + const cache = this.options.cache + ? `${this.options.cache}/json` + : `${this.options.root}/cache/json`; request.get(manifest, (error, response, body) => { - if (error && error.code !== 'ENOTFOUND') return resolve(error) + if (error && error.code !== "ENOTFOUND") return resolve(error); if (!error) { if (!fs.existsSync(cache)) { - fs.mkdirSync(cache, { recursive: true }) - this.client.emit('debug', '[MCLC]: Cache directory created.') + fs.mkdirSync(cache, { recursive: true }); + this.client.emit("debug", "[PiMi]: Cache directory created."); } - fs.writeFile(path.join(`${cache}/version_manifest.json`), body, (err) => { - if (err) return resolve(err) - this.client.emit('debug', '[MCLC]: Cached version_manifest.json') - }) + fs.writeFile( + path.join(`${cache}/version_manifest.json`), + body, + (err) => { + if (err) return resolve(err); + this.client.emit("debug", "[PiMi]: Cached version_manifest.json"); + } + ); } - let parsed - if (error && (error.code === 'ENOTFOUND')) { - parsed = JSON.parse(fs.readFileSync(`${cache}/version_manifest.json`)) + let parsed; + if (error && error.code === "ENOTFOUND") { + parsed = JSON.parse( + fs.readFileSync(`${cache}/version_manifest.json`) + ); } else { - parsed = JSON.parse(body) + parsed = JSON.parse(body); } for (const desiredVersion in parsed.versions) { - if (parsed.versions[desiredVersion].id === this.options.version.number) { - request.get(parsed.versions[desiredVersion].url, (error, response, body) => { - if (error && error.code !== 'ENOTFOUND') return resolve(error) - if (!error) { - fs.writeFile(path.join(`${cache}/${this.options.version.number}.json`), body, (err) => { - if (err) return resolve(err) - this.client.emit('debug', `[MCLC]: Cached ${this.options.version.number}.json`) - }) - } + if ( + parsed.versions[desiredVersion].id === this.options.version.number + ) { + request.get( + parsed.versions[desiredVersion].url, + (error, response, body) => { + if (error && error.code !== "ENOTFOUND") return resolve(error); + if (!error) { + fs.writeFile( + path.join(`${cache}/${this.options.version.number}.json`), + body, + (err) => { + if (err) return resolve(err); + this.client.emit( + "debug", + `[PiMi]: Cached ${this.options.version.number}.json` + ); + } + ); + } - this.client.emit('debug', '[MCLC]: Parsed version from version manifest') - if (error && (error.code === 'ENOTFOUND')) { - this.version = JSON.parse(fs.readFileSync(`${cache}/${this.options.version.number}.json`)) - } else { - this.version = JSON.parse(body) + this.client.emit( + "debug", + "[PiMi]: Parsed version from version manifest" + ); + if (error && error.code === "ENOTFOUND") { + this.version = JSON.parse( + fs.readFileSync( + `${cache}/${this.options.version.number}.json` + ) + ); + } else { + this.version = JSON.parse(body); + } + return resolve(this.version); } - return resolve(this.version) - }) + ); } } - }) - }) + }); + }); } - async getJar () { - await this.downloadAsync(this.version.downloads.client.url, this.options.directory, `${this.options.version.custom ? this.options.version.custom : this.options.version.number}.jar`, true, 'version-jar') + async getJar() { + await this.downloadAsync( + this.version.downloads.client.url, + this.options.directory, + `${ + this.options.version.custom + ? this.options.version.custom + : this.options.version.number + }.jar`, + true, + "version-jar" + ); - fs.writeFileSync(path.join(this.options.directory, `${this.options.version.number}.json`), JSON.stringify(this.version, null, 4)) + fs.writeFileSync( + path.join(this.options.directory, `${this.options.version.number}.json`), + JSON.stringify(this.version, null, 4) + ); - return this.client.emit('debug', '[MCLC]: Downloaded version jar and wrote version json') + return this.client.emit( + "debug", + "[PiMi]: Downloaded version jar and wrote version json" + ); } - async getAssets () { - const assetDirectory = path.resolve(this.options.overrides.assetRoot || path.join(this.options.root, 'assets')) - const assetId = this.options.version.custom || this.options.version.number - if (!fs.existsSync(path.join(assetDirectory, 'indexes', `${assetId}.json`))) { - await this.downloadAsync(this.version.assetIndex.url, path.join(assetDirectory, 'indexes'), - `${assetId}.json`, true, 'asset-json') + async getAssets() { + const assetDirectory = path.resolve( + this.options.overrides.assetRoot || path.join(this.options.root, "assets") + ); + const assetId = this.options.version.custom || this.options.version.number; + if ( + !fs.existsSync(path.join(assetDirectory, "indexes", `${assetId}.json`)) + ) { + await this.downloadAsync( + this.version.assetIndex.url, + path.join(assetDirectory, "indexes"), + `${assetId}.json`, + true, + "asset-json" + ); } - const index = JSON.parse(fs.readFileSync(path.join(assetDirectory, 'indexes', `${assetId}.json`), { encoding: 'utf8' })) + const index = JSON.parse( + fs.readFileSync(path.join(assetDirectory, "indexes", `${assetId}.json`), { + encoding: "utf8", + }) + ); - this.client.emit('progress', { - type: 'assets', + this.client.emit("progress", { + type: "assets", task: 0, - total: Object.keys(index.objects).length - }) + total: Object.keys(index.objects).length, + }); - await Promise.all(Object.keys(index.objects).map(async asset => { - const hash = index.objects[asset].hash - const subhash = hash.substring(0, 2) - const subAsset = path.join(assetDirectory, 'objects', subhash) + await Promise.all( + Object.keys(index.objects).map(async (asset) => { + const hash = index.objects[asset].hash; + const subhash = hash.substring(0, 2); + const subAsset = path.join(assetDirectory, "objects", subhash); - if (!fs.existsSync(path.join(subAsset, hash)) || !await this.checkSum(hash, path.join(subAsset, hash))) { - await this.downloadAsync(`${this.options.overrides.url.resource}/${subhash}/${hash}`, subAsset, hash, - true, 'assets') - counter++ - this.client.emit('progress', { - type: 'assets', - task: counter, - total: Object.keys(index.objects).length - }) - } - })) - counter = 0 + if ( + !fs.existsSync(path.join(subAsset, hash)) || + !(await this.checkSum(hash, path.join(subAsset, hash))) + ) { + await this.downloadAsync( + `${this.options.overrides.url.resource}/${subhash}/${hash}`, + subAsset, + hash, + true, + "assets" + ); + counter++; + this.client.emit("progress", { + type: "assets", + task: counter, + total: Object.keys(index.objects).length, + }); + } + }) + ); + counter = 0; // Copy assets to legacy if it's an older Minecraft version. if (this.isLegacy()) { - if (fs.existsSync(path.join(assetDirectory, 'legacy'))) { - this.client.emit('debug', '[MCLC]: The \'legacy\' directory is no longer used as Minecraft looks ' + - 'for the resouces folder regardless of what is passed in the assetDirecotry launch option. I\'d ' + - `recommend removing the directory (${path.join(assetDirectory, 'legacy')})`) + if (fs.existsSync(path.join(assetDirectory, "legacy"))) { + this.client.emit( + "debug", + "[PiMi]: The 'legacy' directory is no longer used as Minecraft looks " + + "for the resouces folder regardless of what is passed in the assetDirecotry launch option. I'd " + + `recommend removing the directory (${path.join( + assetDirectory, + "legacy" + )})` + ); } - const legacyDirectory = path.join(this.options.root, 'resources') - this.client.emit('debug', `[MCLC]: Copying assets over to ${legacyDirectory}`) + const legacyDirectory = path.join(this.options.root, "resources"); + this.client.emit( + "debug", + `[PiMi]: Copying assets over to ${legacyDirectory}` + ); - this.client.emit('progress', { - type: 'assets-copy', + this.client.emit("progress", { + type: "assets-copy", task: 0, - total: Object.keys(index.objects).length - }) + total: Object.keys(index.objects).length, + }); - await Promise.all(Object.keys(index.objects).map(async asset => { - const hash = index.objects[asset].hash - const subhash = hash.substring(0, 2) - const subAsset = path.join(assetDirectory, 'objects', subhash) + await Promise.all( + Object.keys(index.objects).map(async (asset) => { + const hash = index.objects[asset].hash; + const subhash = hash.substring(0, 2); + const subAsset = path.join(assetDirectory, "objects", subhash); - const legacyAsset = asset.split('/') - legacyAsset.pop() + const legacyAsset = asset.split("/"); + legacyAsset.pop(); - if (!fs.existsSync(path.join(legacyDirectory, legacyAsset.join('/')))) { - fs.mkdirSync(path.join(legacyDirectory, legacyAsset.join('/')), { recursive: true }) - } + if ( + !fs.existsSync(path.join(legacyDirectory, legacyAsset.join("/"))) + ) { + fs.mkdirSync(path.join(legacyDirectory, legacyAsset.join("/")), { + recursive: true, + }); + } - if (!fs.existsSync(path.join(legacyDirectory, asset))) { - fs.copyFileSync(path.join(subAsset, hash), path.join(legacyDirectory, asset)) - } - counter++ - this.client.emit('progress', { - type: 'assets-copy', - task: counter, - total: Object.keys(index.objects).length + if (!fs.existsSync(path.join(legacyDirectory, asset))) { + fs.copyFileSync( + path.join(subAsset, hash), + path.join(legacyDirectory, asset) + ); + } + counter++; + this.client.emit("progress", { + type: "assets-copy", + task: counter, + total: Object.keys(index.objects).length, + }); }) - })) + ); } - counter = 0 + counter = 0; - this.client.emit('debug', '[MCLC]: Downloaded assets') + this.client.emit("debug", "[PiMi]: Downloaded assets"); } - parseRule (lib) { + parseRule(lib) { if (lib.rules) { if (lib.rules.length > 1) { - if (lib.rules[0].action === 'allow' && - lib.rules[1].action === 'disallow' && - lib.rules[1].os.name === 'osx') { - return this.getOS() === 'osx' + if ( + lib.rules[0].action === "allow" && + lib.rules[1].action === "disallow" && + lib.rules[1].os.name === "osx" + ) { + return this.getOS() === "osx"; } else { - return true + return true; } } else { - if (lib.rules[0].action === 'allow' && lib.rules[0].os) return lib.rules[0].os.name !== this.getOS() + if (lib.rules[0].action === "allow" && lib.rules[0].os) + return lib.rules[0].os.name !== this.getOS(); } } else { - return false + return false; } } - async getNatives () { - const nativeDirectory = path.resolve(this.options.overrides.natives || path.join(this.options.root, 'natives', this.version.id)) + async getNatives() { + const nativeDirectory = path.resolve( + this.options.overrides.natives || + path.join(this.options.root, "natives", this.version.id) + ); - if (parseInt(this.version.id.split('.')[1]) >= 19) return this.options.overrides.cwd || this.options.root + if (parseInt(this.version.id.split(".")[1]) >= 19) + return this.options.overrides.cwd || this.options.root; - if (!fs.existsSync(nativeDirectory) || !fs.readdirSync(nativeDirectory).length) { - fs.mkdirSync(nativeDirectory, { recursive: true }) + if ( + !fs.existsSync(nativeDirectory) || + !fs.readdirSync(nativeDirectory).length + ) { + fs.mkdirSync(nativeDirectory, { recursive: true }); const natives = async () => { - const natives = [] - await Promise.all(this.version.libraries.map(async (lib) => { - if (!lib.downloads || !lib.downloads.classifiers) return - if (this.parseRule(lib)) return + const natives = []; + await Promise.all( + this.version.libraries.map(async (lib) => { + if (!lib.downloads || !lib.downloads.classifiers) return; + if (this.parseRule(lib)) return; - const native = this.getOS() === 'osx' - ? lib.downloads.classifiers['natives-osx'] || lib.downloads.classifiers['natives-macos'] - : lib.downloads.classifiers[`natives-${this.getOS()}`] + const native = + this.getOS() === "osx" + ? lib.downloads.classifiers["natives-osx"] || + lib.downloads.classifiers["natives-macos"] + : lib.downloads.classifiers[`natives-${this.getOS()}`]; - natives.push(native) - })) - return natives - } - const stat = await natives() + natives.push(native); + }) + ); + return natives; + }; + const stat = await natives(); - this.client.emit('progress', { - type: 'natives', + this.client.emit("progress", { + type: "natives", task: 0, - total: stat.length - }) + total: stat.length, + }); - await Promise.all(stat.map(async (native) => { - if (!native) return - const name = native.path.split('/').pop() - await this.downloadAsync(native.url, nativeDirectory, name, true, 'natives') - if (!await this.checkSum(native.sha1, path.join(nativeDirectory, name))) { - await this.downloadAsync(native.url, nativeDirectory, name, true, 'natives') - } - try { - new Zip(path.join(nativeDirectory, name)).extractAllTo(nativeDirectory, true) - } catch (e) { - // Only doing a console.warn since a stupid error happens. You can basically ignore this. - // if it says Invalid file name, just means two files were downloaded and both were deleted. - // All is well. - console.warn(e) - } - fs.unlinkSync(path.join(nativeDirectory, name)) - counter++ - this.client.emit('progress', { - type: 'natives', - task: counter, - total: stat.length + await Promise.all( + stat.map(async (native) => { + if (!native) return; + const name = native.path.split("/").pop(); + await this.downloadAsync( + native.url, + nativeDirectory, + name, + true, + "natives" + ); + if ( + !(await this.checkSum( + native.sha1, + path.join(nativeDirectory, name) + )) + ) { + await this.downloadAsync( + native.url, + nativeDirectory, + name, + true, + "natives" + ); + } + try { + new Zip(path.join(nativeDirectory, name)).extractAllTo( + nativeDirectory, + true + ); + } catch (e) { + // Only doing a console.warn since a stupid error happens. You can basically ignore this. + // if it says Invalid file name, just means two files were downloaded and both were deleted. + // All is well. + console.warn(e); + } + fs.unlinkSync(path.join(nativeDirectory, name)); + counter++; + this.client.emit("progress", { + type: "natives", + task: counter, + total: stat.length, + }); }) - })) - this.client.emit('debug', '[MCLC]: Downloaded and extracted natives') + ); + this.client.emit("debug", "[PiMi]: Downloaded and extracted natives"); } - counter = 0 - this.client.emit('debug', `[MCLC]: Set native path to ${nativeDirectory}`) + counter = 0; + this.client.emit("debug", `[PiMi]: Set native path to ${nativeDirectory}`); - return nativeDirectory + return nativeDirectory; } - fwAddArgs () { + fwAddArgs() { const forgeWrapperAgrs = [ - `-Dforgewrapper.librariesDir=${path.resolve(this.options.overrides.libraryRoot || path.join(this.options.root, 'libraries'))}`, + `-Dforgewrapper.librariesDir=${path.resolve( + this.options.overrides.libraryRoot || + path.join(this.options.root, "libraries") + )}`, `-Dforgewrapper.installer=${this.options.forge}`, - `-Dforgewrapper.minecraft=${this.options.mcPath}` - ] + `-Dforgewrapper.minecraft=${this.options.mcPath}`, + ]; this.options.customArgs - ? this.options.customArgs = this.options.customArgs.concat(forgeWrapperAgrs) - : this.options.customArgs = forgeWrapperAgrs + ? (this.options.customArgs = + this.options.customArgs.concat(forgeWrapperAgrs)) + : (this.options.customArgs = forgeWrapperAgrs); } - isModernForge (json) { - return json.inheritsFrom && json.inheritsFrom.split('.')[1] >= 12 && !(json.inheritsFrom === '1.12.2' && (json.id.split('.')[json.id.split('.').length - 1]) === '2847') + isModernForge(json) { + return ( + json.inheritsFrom && + json.inheritsFrom.split(".")[1] >= 12 && + !( + json.inheritsFrom === "1.12.2" && + json.id.split(".")[json.id.split(".").length - 1] === "2847" + ) + ); } - async getForgedWrapped () { - let json = null - let installerJson = null - const versionPath = path.join(this.options.root, 'forge', `${this.version.id}`, 'version.json') - // Since we're building a proper "custom" JSON that will work nativly with MCLC, the version JSON will not + async getForgedWrapped() { + let json = null; + let installerJson = null; + const versionPath = path.join( + this.options.root, + "forge", + `${this.version.id}`, + "version.json" + ); + // Since we're building a proper "custom" JSON that will work nativly with PiMi, the version JSON will not // be re-generated on the next run. if (fs.existsSync(versionPath)) { try { - json = JSON.parse(fs.readFileSync(versionPath)) - if (!json.forgeWrapperVersion || !(json.forgeWrapperVersion === this.options.overrides.fw.version)) { - this.client.emit('debug', '[MCLC]: Old ForgeWrapper has generated this version JSON, re-generating') + json = JSON.parse(fs.readFileSync(versionPath)); + if ( + !json.forgeWrapperVersion || + !(json.forgeWrapperVersion === this.options.overrides.fw.version) + ) { + this.client.emit( + "debug", + "[PiMi]: Old ForgeWrapper has generated this version JSON, re-generating" + ); } else { - // If forge is modern, add ForgeWrappers launch arguments and set forge to null so MCLC treats it as a custom json. + // If forge is modern, add ForgeWrappers launch arguments and set forge to null so PiMi treats it as a custom json. if (this.isModernForge(json)) { - this.fwAddArgs() - this.options.forge = null + this.fwAddArgs(); + this.options.forge = null; } - return json + return json; } } catch (e) { - console.warn(e) - this.client.emit('debug', '[MCLC]: Failed to parse Forge version JSON, re-generating') + console.warn(e); + this.client.emit( + "debug", + "[PiMi]: Failed to parse Forge version JSON, re-generating" + ); } } - this.client.emit('debug', '[MCLC]: Generating a proper version json, this might take a bit') - const zipFile = new Zip(this.options.forge) - json = zipFile.readAsText('version.json') - if (zipFile.getEntry('install_profile.json')) installerJson = zipFile.readAsText('install_profile.json') + this.client.emit( + "debug", + "[PiMi]: Generating a proper version json, this might take a bit" + ); + const zipFile = new Zip(this.options.forge); + json = zipFile.readAsText("version.json"); + if (zipFile.getEntry("install_profile.json")) + installerJson = zipFile.readAsText("install_profile.json"); try { - json = JSON.parse(json) - if (installerJson) installerJson = JSON.parse(installerJson) + json = JSON.parse(json); + if (installerJson) installerJson = JSON.parse(installerJson); } catch (e) { - this.client.emit('debug', '[MCLC]: Failed to load json files for ForgeWrapper, using Vanilla instead') - return null + this.client.emit( + "debug", + "[PiMi]: Failed to load json files for ForgeWrapper, using Vanilla instead" + ); + return null; } - // Adding the installer libraries as mavenFiles so MCLC downloads them but doesn't add them to the class paths. + // Adding the installer libraries as mavenFiles so PiMi downloads them but doesn't add them to the class paths. if (installerJson) { json.mavenFiles - ? json.mavenFiles = json.mavenFiles.concat(installerJson.libraries) - : json.mavenFiles = installerJson.libraries + ? (json.mavenFiles = json.mavenFiles.concat(installerJson.libraries)) + : (json.mavenFiles = installerJson.libraries); } // Holder for the specifc jar ending which depends on the specifc forge version. - let jarEnding = 'universal' + let jarEnding = "universal"; // We need to handle modern forge differently than legacy. if (this.isModernForge(json)) { - // If forge is modern and above 1.12.2, we add ForgeWrapper to the libraries so MCLC includes it in the classpaths. - if (json.inheritsFrom !== '1.12.2') { - this.fwAddArgs() - const fwName = `ForgeWrapper-${this.options.overrides.fw.version}.jar` - const fwPathArr = ['io', 'github', 'zekerzhayard', 'ForgeWrapper', this.options.overrides.fw.version] + // If forge is modern and above 1.12.2, we add ForgeWrapper to the libraries so PiMi includes it in the classpaths. + if (json.inheritsFrom !== "1.12.2") { + this.fwAddArgs(); + const fwName = `ForgeWrapper-${this.options.overrides.fw.version}.jar`; + const fwPathArr = [ + "io", + "github", + "zekerzhayard", + "ForgeWrapper", + this.options.overrides.fw.version, + ]; json.libraries.push({ - name: fwPathArr.join(':'), + name: fwPathArr.join(":"), downloads: { artifact: { - path: [...fwPathArr, fwName].join('/'), + path: [...fwPathArr, fwName].join("/"), url: `${this.options.overrides.fw.baseUrl}${this.options.overrides.fw.version}/${fwName}`, sha1: this.options.overrides.fw.sh1, - size: this.options.overrides.fw.size - } - } - }) - json.mainClass = 'io.github.zekerzhayard.forgewrapper.installer.Main' - jarEnding = 'launcher' + size: this.options.overrides.fw.size, + }, + }, + }); + json.mainClass = "io.github.zekerzhayard.forgewrapper.installer.Main"; + jarEnding = "launcher"; // Providing a download URL to the universal jar mavenFile so it can be downloaded properly. for (const library of json.mavenFiles) { - const lib = library.name.split(':') - if (lib[0] === 'net.minecraftforge' && lib[1].includes('forge')) { - library.downloads.artifact.url = 'https://files.minecraftforge.net/maven/' + library.downloads.artifact.path - break + const lib = library.name.split(":"); + if (lib[0] === "net.minecraftforge" && lib[1].includes("forge")) { + library.downloads.artifact.url = + "https://files.minecraftforge.net/maven/" + + library.downloads.artifact.path; + break; } } } else { // Remove the forge dependent since we're going to overwrite the first entry anyways. for (const library in json.mavenFiles) { - const lib = json.mavenFiles[library].name.split(':') - if (lib[0] === 'net.minecraftforge' && lib[1].includes('forge')) { - delete json.mavenFiles[library] - break + const lib = json.mavenFiles[library].name.split(":"); + if (lib[0] === "net.minecraftforge" && lib[1].includes("forge")) { + delete json.mavenFiles[library]; + break; } } } } else { - // Modifying legacy library format to play nice with MCLC's downloadToDirectory function. - await Promise.all(json.libraries.map(async library => { - const lib = library.name.split(':') - if (lib[0] === 'net.minecraftforge' && lib[1].includes('forge')) return + // Modifying legacy library format to play nice with PiMi's downloadToDirectory function. + await Promise.all( + json.libraries.map(async (library) => { + const lib = library.name.split(":"); + if (lib[0] === "net.minecraftforge" && lib[1].includes("forge")) + return; - let url = this.options.overrides.url.mavenForge - const name = `${lib[1]}-${lib[2]}.jar` + let url = this.options.overrides.url.mavenForge; + const name = `${lib[1]}-${lib[2]}.jar`; - if (!library.url) { - if (library.serverreq || library.clientreq) { - url = this.options.overrides.url.defaultRepoForge - } else { - return - } - } - library.url = url - const downloadLink = `${url}${lib[0].replace(/\./g, '/')}/${lib[1]}/${lib[2]}/${name}` - // Checking if the file still exists on Forge's server, if not, replace it with the fallback. - // Not checking for sucess, only if it 404s. - this.baseRequest(downloadLink, (error, response, body) => { - if (error) { - this.client.emit('debug', `[MCLC]: Failed checking request for ${downloadLink}`) - } else { - if (response.statusCode === 404) library.url = this.options.overrides.url.fallbackMaven + if (!library.url) { + if (library.serverreq || library.clientreq) { + url = this.options.overrides.url.defaultRepoForge; + } else { + return; + } } + library.url = url; + const downloadLink = `${url}${lib[0].replace(/\./g, "/")}/${lib[1]}/${ + lib[2] + }/${name}`; + // Checking if the file still exists on Forge's server, if not, replace it with the fallback. + // Not checking for sucess, only if it 404s. + this.baseRequest(downloadLink, (error, response, body) => { + if (error) { + this.client.emit( + "debug", + `[PiMi]: Failed checking request for ${downloadLink}` + ); + } else { + if (response.statusCode === 404) + library.url = this.options.overrides.url.fallbackMaven; + } + }); }) - })) + ); } // If a downloads property exists, we modify the inital forge entry to include ${jarEnding} so ForgeWrapper can work properly. // If it doesn't, we simply remove it since we're already providing the universal jar. if (json.libraries[0].downloads) { - if (json.libraries[0].name.includes('minecraftforge')) { - json.libraries[0].name = json.libraries[0].name + `:${jarEnding}` - json.libraries[0].downloads.artifact.path = json.libraries[0].downloads.artifact.path.replace('.jar', `-${jarEnding}.jar`) - json.libraries[0].downloads.artifact.url = 'https://files.minecraftforge.net/maven/' + json.libraries[0].downloads.artifact.path + if (json.libraries[0].name.includes("minecraftforge")) { + json.libraries[0].name = json.libraries[0].name + `:${jarEnding}`; + json.libraries[0].downloads.artifact.path = + json.libraries[0].downloads.artifact.path.replace( + ".jar", + `-${jarEnding}.jar` + ); + json.libraries[0].downloads.artifact.url = + "https://files.minecraftforge.net/maven/" + + json.libraries[0].downloads.artifact.path; } } else { - delete json.libraries[0] + delete json.libraries[0]; } // Removing duplicates and null types - json.libraries = this.cleanUp(json.libraries) - if (json.mavenFiles) json.mavenFiles = this.cleanUp(json.mavenFiles) + json.libraries = this.cleanUp(json.libraries); + if (json.mavenFiles) json.mavenFiles = this.cleanUp(json.mavenFiles); - json.forgeWrapperVersion = this.options.overrides.fw.version + json.forgeWrapperVersion = this.options.overrides.fw.version; // Saving file for next run! - if (!fs.existsSync(path.join(this.options.root, 'forge', this.version.id))) { - fs.mkdirSync(path.join(this.options.root, 'forge', this.version.id), { recursive: true }) + if ( + !fs.existsSync(path.join(this.options.root, "forge", this.version.id)) + ) { + fs.mkdirSync(path.join(this.options.root, "forge", this.version.id), { + recursive: true, + }); } - fs.writeFileSync(versionPath, JSON.stringify(json, null, 4)) + fs.writeFileSync(versionPath, JSON.stringify(json, null, 4)); - // Make MCLC treat modern forge as a custom version json rather then legacy forge. - if (this.isModernForge(json)) this.options.forge = null + // Make PiMi treat modern forge as a custom version json rather then legacy forge. + if (this.isModernForge(json)) this.options.forge = null; - return json + return json; } - runInstaller (path) { - return new Promise(resolve => { - const installer = child.exec(path) - installer.on('close', (code) => resolve(code)) - }) + runInstaller(path) { + return new Promise((resolve) => { + const installer = child.exec(path); + installer.on("close", (code) => resolve(code)); + }); } - async downloadToDirectory (directory, libraries, eventName) { - const libs = [] + async downloadToDirectory(directory, libraries, eventName) { + const libs = []; - await Promise.all(libraries.map(async library => { - if (!library) return - if (this.parseRule(library)) return - const lib = library.name.split(':') + await Promise.all( + libraries.map(async (library) => { + if (!library) return; + if (this.parseRule(library)) return; + const lib = library.name.split(":"); - let jarPath - let name - if (library.downloads && library.downloads.artifact && library.downloads.artifact.path) { - name = library.downloads.artifact.path.split('/')[library.downloads.artifact.path.split('/').length - 1] - jarPath = path.join(directory, this.popString(library.downloads.artifact.path)) - } else { - name = `${lib[1]}-${lib[2]}${lib[3] ? '-' + lib[3] : ''}.jar` - jarPath = path.join(directory, `${lib[0].replace(/\./g, '/')}/${lib[1]}/${lib[2]}`) - } - - if (!fs.existsSync(path.join(jarPath, name)) || !this.checkSum(library.downloads.artifact.sha1, path.join(jarPath, name))) { - // Simple lib support, forgot which addon needed this but here you go, Mr special. - if (library.url) { - const url = `${library.url}${lib[0].replace(/\./g, '/')}/${lib[1]}/${lib[2]}/${name}` - await this.downloadAsync(url, jarPath, name, true, eventName) - } else if (library.downloads && library.downloads.artifact) { - await this.downloadAsync(library.downloads.artifact.url, jarPath, name, true, eventName) + let jarPath; + let name; + if ( + library.downloads && + library.downloads.artifact && + library.downloads.artifact.path + ) { + name = + library.downloads.artifact.path.split("/")[ + library.downloads.artifact.path.split("/").length - 1 + ]; + jarPath = path.join( + directory, + this.popString(library.downloads.artifact.path) + ); + } else { + name = `${lib[1]}-${lib[2]}${lib[3] ? "-" + lib[3] : ""}.jar`; + jarPath = path.join( + directory, + `${lib[0].replace(/\./g, "/")}/${lib[1]}/${lib[2]}` + ); } - } - counter++ - this.client.emit('progress', { - type: eventName, - task: counter, - total: libraries.length + if ( + !fs.existsSync(path.join(jarPath, name)) || + !this.checkSum( + library.downloads.artifact.sha1, + path.join(jarPath, name) + ) + ) { + // Simple lib support, forgot which addon needed this but here you go, Mr special. + if (library.url) { + const url = `${library.url}${lib[0].replace(/\./g, "/")}/${ + lib[1] + }/${lib[2]}/${name}`; + await this.downloadAsync(url, jarPath, name, true, eventName); + } else if (library.downloads && library.downloads.artifact) { + await this.downloadAsync( + library.downloads.artifact.url, + jarPath, + name, + true, + eventName + ); + } + } + + counter++; + this.client.emit("progress", { + type: eventName, + task: counter, + total: libraries.length, + }); + libs.push(`${jarPath}${path.sep}${name}`); }) - libs.push(`${jarPath}${path.sep}${name}`) - })) - counter = 0 + ); + counter = 0; - return libs + return libs; } - async getClasses (classJson) { - let libs = [] + async getClasses(classJson) { + let libs = []; - const libraryDirectory = path.resolve(this.options.overrides.libraryRoot || path.join(this.options.root, 'libraries')) + const libraryDirectory = path.resolve( + this.options.overrides.libraryRoot || + path.join(this.options.root, "libraries") + ); if (classJson) { if (classJson.mavenFiles) { - await this.downloadToDirectory(libraryDirectory, classJson.mavenFiles, 'classes-maven-custom') + await this.downloadToDirectory( + libraryDirectory, + classJson.mavenFiles, + "classes-maven-custom" + ); } - libs = (await this.downloadToDirectory(libraryDirectory, classJson.libraries, 'classes-custom')) + libs = await this.downloadToDirectory( + libraryDirectory, + classJson.libraries, + "classes-custom" + ); } - const parsed = this.version.libraries.map(lib => { - if (lib.downloads && lib.downloads.artifact && !this.parseRule(lib)) return lib - }) + const parsed = this.version.libraries.map((lib) => { + if (lib.downloads && lib.downloads.artifact && !this.parseRule(lib)) + return lib; + }); - libs = libs.concat((await this.downloadToDirectory(libraryDirectory, parsed, 'classes'))) - counter = 0 + libs = libs.concat( + await this.downloadToDirectory(libraryDirectory, parsed, "classes") + ); + counter = 0; // Temp Quilt support - if (classJson) libs.sort() + if (classJson) libs.sort(); - this.client.emit('debug', '[MCLC]: Collected class paths') - return libs + this.client.emit("debug", "[PiMi]: Collected class paths"); + return libs; } - popString (path) { - const tempArray = path.split('/') - tempArray.pop() - return tempArray.join('/') + popString(path) { + const tempArray = path.split("/"); + tempArray.pop(); + return tempArray.join("/"); } - cleanUp (array) { - const newArray = [] + cleanUp(array) { + const newArray = []; for (const classPath in array) { - if (newArray.includes(array[classPath]) || array[classPath] === null) continue - newArray.push(array[classPath]) + if (newArray.includes(array[classPath]) || array[classPath] === null) + continue; + newArray.push(array[classPath]); } - return newArray + return newArray; } - formatQuickPlay () { + formatQuickPlay() { const types = { - singleplayer: '--quickPlaySingleplayer', - multiplayer: '--quickPlayMultiplayer', - realms: '--quickPlayRealms', - legacy: null - } - const { type, identifier, path } = this.options.quickPlay - const keys = Object.keys(types) + singleplayer: "--quickPlaySingleplayer", + multiplayer: "--quickPlayMultiplayer", + realms: "--quickPlayRealms", + legacy: null, + }; + const { type, identifier, path } = this.options.quickPlay; + const keys = Object.keys(types); if (!keys.includes(type)) { - this.client.emit('debug', `[MCLC]: quickPlay type is not valid. Valid types are: ${keys.join(', ')}`) - return null + this.client.emit( + "debug", + `[PiMi]: quickPlay type is not valid. Valid types are: ${keys.join( + ", " + )}` + ); + return null; } - const returnArgs = type === 'legacy' - ? ['--server', identifier.split(':')[0], '--port', identifier.split(':')[1] || '25565'] - : [types[type], identifier] - if (path) returnArgs.push('--quickPlayPath', path) - return returnArgs + const returnArgs = + type === "legacy" + ? [ + "--server", + identifier.split(":")[0], + "--port", + identifier.split(":")[1] || "25565", + ] + : [types[type], identifier]; + if (path) returnArgs.push("--quickPlayPath", path); + return returnArgs; } - async getLaunchOptions (modification) { - const type = modification || this.version + async getLaunchOptions(modification) { + const type = modification || this.version; let args = type.minecraftArguments - ? type.minecraftArguments.split(' ') - : type.arguments.game - const assetRoot = path.resolve(this.options.overrides.assetRoot || path.join(this.options.root, 'assets')) + ? type.minecraftArguments.split(" ") + : type.arguments.game; + const assetRoot = path.resolve( + this.options.overrides.assetRoot || path.join(this.options.root, "assets") + ); const assetPath = this.isLegacy() - ? path.join(this.options.root, 'resources') - : path.join(assetRoot) + ? path.join(this.options.root, "resources") + : path.join(assetRoot); - const minArgs = this.options.overrides.minArgs || this.isLegacy() ? 5 : 11 - if (args.length < minArgs) args = args.concat(this.version.minecraftArguments ? this.version.minecraftArguments.split(' ') : this.version.arguments.game) - if (this.options.customLaunchArgs) args = args.concat(this.options.customLaunchArgs) + const minArgs = this.options.overrides.minArgs || this.isLegacy() ? 5 : 11; + if (args.length < minArgs) + args = args.concat( + this.version.minecraftArguments + ? this.version.minecraftArguments.split(" ") + : this.version.arguments.game + ); + if (this.options.customLaunchArgs) + args = args.concat(this.options.customLaunchArgs); - this.options.authorization = await Promise.resolve(this.options.authorization) - this.options.authorization.meta = this.options.authorization.meta ? this.options.authorization.meta : { type: 'mojang' } + this.options.authorization = await Promise.resolve( + this.options.authorization + ); + this.options.authorization.meta = this.options.authorization.meta + ? this.options.authorization.meta + : { type: "mojang" }; const fields = { - '${auth_access_token}': this.options.authorization.access_token, - '${auth_session}': this.options.authorization.access_token, - '${auth_player_name}': this.options.authorization.name, - '${auth_uuid}': this.options.authorization.uuid, - '${auth_xuid}': this.options.authorization.meta.xuid || this.options.authorization.access_token, - '${user_properties}': this.options.authorization.user_properties, - '${user_type}': this.options.authorization.meta.type, - '${version_name}': this.options.version.number, - '${assets_index_name}': this.options.overrides.assetIndex || this.options.version.custom || this.options.version.number, - '${game_directory}': this.options.overrides.gameDirectory || this.options.root, - '${assets_root}': assetPath, - '${game_assets}': assetPath, - '${version_type}': this.options.version.type, - '${clientid}': this.options.authorization.meta.clientId || (this.options.authorization.client_token || this.options.authorization.access_token), - '${resolution_width}': this.options.window ? this.options.window.width : 856, - '${resolution_height}': this.options.window ? this.options.window.height : 482 - } + "${auth_access_token}": this.options.authorization.access_token, + "${auth_session}": this.options.authorization.access_token, + "${auth_player_name}": this.options.authorization.name, + "${auth_uuid}": this.options.authorization.uuid, + "${auth_xuid}": + this.options.authorization.meta.xuid || + this.options.authorization.access_token, + "${user_properties}": this.options.authorization.user_properties, + "${user_type}": this.options.authorization.meta.type, + "${version_name}": this.options.version.number, + "${assets_index_name}": + this.options.overrides.assetIndex || + this.options.version.custom || + this.options.version.number, + "${game_directory}": + this.options.overrides.gameDirectory || this.options.root, + "${assets_root}": assetPath, + "${game_assets}": assetPath, + "${version_type}": this.options.version.type, + "${clientid}": + this.options.authorization.meta.clientId || + this.options.authorization.client_token || + this.options.authorization.access_token, + "${resolution_width}": this.options.window + ? this.options.window.width + : 856, + "${resolution_height}": this.options.window + ? this.options.window.height + : 482, + }; - if (this.options.authorization.meta.demo && (this.options.features ? !this.options.features.includes('is_demo_user') : true)) { - args.push('--demo') + if ( + this.options.authorization.meta.demo && + (this.options.features + ? !this.options.features.includes("is_demo_user") + : true) + ) { + args.push("--demo"); } const replaceArg = (obj, index) => { if (Array.isArray(obj.value)) { for (const arg of obj.value) { - args.push(arg) + args.push(arg); } } else { - args.push(obj.value) + args.push(obj.value); } - delete args[index] - } + delete args[index]; + }; for (let index = 0; index < args.length; index++) { - if (typeof args[index] === 'object') { + if (typeof args[index] === "object") { if (args[index].rules) { - if (!this.options.features) continue - const featureFlags = [] + if (!this.options.features) continue; + const featureFlags = []; for (const rule of args[index].rules) { - featureFlags.push(...Object.keys(rule.features)) + featureFlags.push(...Object.keys(rule.features)); } - let hasAllRules = true + let hasAllRules = true; for (const feature of this.options.features) { if (!featureFlags.includes(feature)) { - hasAllRules = false + hasAllRules = false; } } - if (hasAllRules) replaceArg(args[index], index) + if (hasAllRules) replaceArg(args[index], index); } else { - replaceArg(args[index], index) + replaceArg(args[index], index); } } else { if (Object.keys(fields).includes(args[index])) { - args[index] = fields[args[index]] + args[index] = fields[args[index]]; } } } if (this.options.window) { // eslint-disable-next-line no-unused-expressions this.options.window.fullscreen - ? args.push('--fullscreen') + ? args.push("--fullscreen") : () => { - if (this.options.features ? !this.options.features.includes('has_custom_resolution') : true) { - args.push('--width', this.options.window.width, '--height', this.options.window.height) - } - } + if ( + this.options.features + ? !this.options.features.includes("has_custom_resolution") + : true + ) { + args.push( + "--width", + this.options.window.width, + "--height", + this.options.window.height + ); + } + }; } - if (this.options.server) this.client.emit('debug', '[MCLC]: server and port are deprecated launch flags. Use the quickPlay field.') - if (this.options.quickPlay) args = args.concat(this.formatQuickPlay()) + if (this.options.server) + this.client.emit( + "debug", + "[PiMi]: server and port are deprecated launch flags. Use the quickPlay field." + ); + if (this.options.quickPlay) args = args.concat(this.formatQuickPlay()); if (this.options.proxy) { args.push( - '--proxyHost', + "--proxyHost", this.options.proxy.host, - '--proxyPort', - this.options.proxy.port || '8080', - '--proxyUser', + "--proxyPort", + this.options.proxy.port || "8080", + "--proxyUser", this.options.proxy.username, - '--proxyPass', + "--proxyPass", this.options.proxy.password - ) + ); } - args = args.filter(value => typeof value === 'string' || typeof value === 'number') - this.client.emit('debug', '[MCLC]: Set launch options') - return args + args = args.filter( + (value) => typeof value === "string" || typeof value === "number" + ); + this.client.emit("debug", "[PiMi]: Set launch options"); + return args; } - async getJVM () { + async getJVM() { const opts = { - windows: '-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump', - osx: '-XstartOnFirstThread', - linux: '-Xss1M' - } - return opts[this.getOS()] + windows: + "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump", + osx: "-XstartOnFirstThread", + linux: "-Xss1M", + }; + return opts[this.getOS()]; } - isLegacy () { - return this.version.assets === 'legacy' || this.version.assets === 'pre-1.6' + isLegacy() { + return ( + this.version.assets === "legacy" || this.version.assets === "pre-1.6" + ); } - getOS () { + getOS() { if (this.options.os) { - return this.options.os + return this.options.os; } else { switch (process.platform) { - case 'win32': return 'windows' - case 'darwin': return 'osx' - default: return 'linux' + case "win32": + return "windows"; + case "darwin": + return "osx"; + default: + return "linux"; } } } // To prevent launchers from breaking when they update. Will be reworked with rewrite. - getMemory () { + getMemory() { if (!this.options.memory) { - this.client.emit('debug', '[MCLC]: Memory not set! Setting 1GB as MAX!') + this.client.emit("debug", "[PiMi]: Memory not set! Setting 1GB as MAX!"); this.options.memory = { min: 512, - max: 1023 - } + max: 1023, + }; } if (!isNaN(this.options.memory.max) && !isNaN(this.options.memory.min)) { if (this.options.memory.max < this.options.memory.min) { - this.client.emit('debug', '[MCLC]: MIN memory is higher then MAX! Resetting!') - this.options.memory.max = 1023 - this.options.memory.min = 512 + this.client.emit( + "debug", + "[PiMi]: MIN memory is higher then MAX! Resetting!" + ); + this.options.memory.max = 1023; + this.options.memory.min = 512; } - return [`${this.options.memory.max}M`, `${this.options.memory.min}M`] - } else { return [`${this.options.memory.max}`, `${this.options.memory.min}`] } + return [`${this.options.memory.max}M`, `${this.options.memory.min}M`]; + } else { + return [`${this.options.memory.max}`, `${this.options.memory.min}`]; + } } - async extractPackage (options = this.options) { - if (options.clientPackage.startsWith('http')) { - await this.downloadAsync(options.clientPackage, options.root, 'clientPackage.zip', true, 'client-package') - options.clientPackage = path.join(options.root, 'clientPackage.zip') + async extractPackage(options = this.options) { + if (options.clientPackage.startsWith("http")) { + await this.downloadAsync( + options.clientPackage, + options.root, + "clientPackage.zip", + true, + "client-package" + ); + options.clientPackage = path.join(options.root, "clientPackage.zip"); } - new Zip(options.clientPackage).extractAllTo(options.root, true) - if (options.removePackage) fs.unlinkSync(options.clientPackage) + new Zip(options.clientPackage).extractAllTo(options.root, true); + if (options.removePackage) fs.unlinkSync(options.clientPackage); - return this.client.emit('package-extract', true) + return this.client.emit("package-extract", true); } } -module.exports = Handler +module.exports = Handler; diff --git a/components/launcher.js b/components/launcher.js index 771f9ce..9e6530d 100644 --- a/components/launcher.js +++ b/components/launcher.js @@ -1,204 +1,304 @@ -const child = require('child_process') -const path = require('path') -const Handler = require('./handler') -const fs = require('fs') -const EventEmitter = require('events').EventEmitter +const child = require("child_process"); +const path = require("path"); +const Handler = require("./handler"); +const fs = require("fs"); +const EventEmitter = require("events").EventEmitter; -class MCLCore extends EventEmitter { - async launch (options) { +class PiMiCore extends EventEmitter { + async launch(options) { try { - this.options = { ...options } - this.options.root = path.resolve(this.options.root) + this.options = { ...options }; + this.options.root = path.resolve(this.options.root); this.options.overrides = { detached: true, ...this.options.overrides, url: { - meta: 'https://launchermeta.mojang.com', - resource: 'https://resources.download.minecraft.net', - mavenForge: 'http://files.minecraftforge.net/maven/', - defaultRepoForge: 'https://libraries.minecraft.net/', - fallbackMaven: 'https://search.maven.org/remotecontent?filepath=', - ...this.options.overrides - ? this.options.overrides.url - : undefined + meta: "https://launchermeta.mojang.com", + resource: "https://resources.download.minecraft.net", + mavenForge: "http://files.minecraftforge.net/maven/", + defaultRepoForge: "https://libraries.minecraft.net/", + fallbackMaven: "https://search.maven.org/remotecontent?filepath=", + ...(this.options.overrides ? this.options.overrides.url : undefined), }, fw: { - baseUrl: 'https://github.com/ZekerZhayard/ForgeWrapper/releases/download/', - version: '1.5.5', - sh1: '566dfd60aacffaa02884614835f1151d36f1f985', + baseUrl: + "https://github.com/ZekerZhayard/ForgeWrapper/releases/download/", + version: "1.5.5", + sh1: "566dfd60aacffaa02884614835f1151d36f1f985", size: 34331, - ...this.options.overrides - ? this.options.overrides.fw - : undefined - } - } + ...(this.options.overrides ? this.options.overrides.fw : undefined), + }, + }; - this.handler = new Handler(this) + this.handler = new Handler(this); - this._printVersion() + this._printVersion(); - const java = await this.handler.checkJava(this.options.javaPath || 'java') + const java = await this.handler.checkJava( + this.options.javaPath || "java" + ); if (!java.run) { - this.emit('debug', `[MCLC]: Couldn't start Minecraft due to: ${java.message}`) - this.emit('close', 1) - return null + this.emit( + "debug", + `[PiMi]: Couldn't start Minecraft due to: ${java.message}` + ); + this.emit("close", 1); + return null; } - this._createRootDirectory() - this._createGameDirectory() + this._createRootDirectory(); + this._createGameDirectory(); - await this._extractPackage() + await this._extractPackage(); if (this.options.installer) { // So installers that create a profile in launcher_profiles.json can run without breaking. - const profilePath = path.join(this.options.root, 'launcher_profiles.json') - if (!fs.existsSync(profilePath) || !JSON.parse(fs.readFileSync(profilePath)).profiles) { - fs.writeFileSync(profilePath, JSON.stringify({ profiles: {} }, null, 4)) + const profilePath = path.join( + this.options.root, + "launcher_profiles.json" + ); + if ( + !fs.existsSync(profilePath) || + !JSON.parse(fs.readFileSync(profilePath)).profiles + ) { + fs.writeFileSync( + profilePath, + JSON.stringify({ profiles: {} }, null, 4) + ); } - const code = await this.handler.runInstaller(this.options.installer) + const code = await this.handler.runInstaller(this.options.installer); if (!this.options.version.custom && code === 0) { - this.emit('debug', '[MCLC]: Installer successfully ran, but no custom version was provided') + this.emit( + "debug", + "[PiMi]: Installer successfully ran, but no custom version was provided" + ); } - this.emit('debug', `[MCLC]: Installer closed with code ${code}`) + this.emit("debug", `[PiMi]: Installer closed with code ${code}`); } - const directory = this.options.overrides.directory || path.join(this.options.root, 'versions', this.options.version.custom ? this.options.version.custom : this.options.version.number) - this.options.directory = directory + const directory = + this.options.overrides.directory || + path.join( + this.options.root, + "versions", + this.options.version.custom + ? this.options.version.custom + : this.options.version.number + ); + this.options.directory = directory; - const versionFile = await this.handler.getVersion() - const mcPath = this.options.overrides.minecraftJar || (this.options.version.custom - ? path.join(this.options.root, 'versions', this.options.version.custom, `${this.options.version.custom}.jar`) - : path.join(directory, `${this.options.version.number}.jar`)) - this.options.mcPath = mcPath - const nativePath = await this.handler.getNatives() + const versionFile = await this.handler.getVersion(); + const mcPath = + this.options.overrides.minecraftJar || + (this.options.version.custom + ? path.join( + this.options.root, + "versions", + this.options.version.custom, + `${this.options.version.custom}.jar` + ) + : path.join(directory, `${this.options.version.number}.jar`)); + this.options.mcPath = mcPath; + const nativePath = await this.handler.getNatives(); if (!fs.existsSync(mcPath)) { - this.emit('debug', '[MCLC]: Attempting to download Minecraft version jar') - await this.handler.getJar() + this.emit( + "debug", + "[PiMi]: Attempting to download Minecraft version jar" + ); + await this.handler.getJar(); } - const modifyJson = await this._getModifyJson() + const modifyJson = await this._getModifyJson(); - const args = [] + const args = []; let jvm = [ - '-XX:-UseAdaptiveSizePolicy', - '-XX:-OmitStackTraceInFastThrow', - '-Dfml.ignorePatchDiscrepancies=true', - '-Dfml.ignoreInvalidMinecraftCertificates=true', + "-XX:-UseAdaptiveSizePolicy", + "-XX:-OmitStackTraceInFastThrow", + "-Dfml.ignorePatchDiscrepancies=true", + "-Dfml.ignoreInvalidMinecraftCertificates=true", `-Djava.library.path=${nativePath}`, `-Xmx${this.handler.getMemory()[0]}`, - `-Xms${this.handler.getMemory()[1]}` - ] - if (this.handler.getOS() === 'osx') { - if (parseInt(versionFile.id.split('.')[1]) > 12) jvm.push(await this.handler.getJVM()) - } else jvm.push(await this.handler.getJVM()) + `-Xms${this.handler.getMemory()[1]}`, + ]; + if (this.handler.getOS() === "osx") { + if (parseInt(versionFile.id.split(".")[1]) > 12) + jvm.push(await this.handler.getJVM()); + } else jvm.push(await this.handler.getJVM()); - if (this.options.customArgs) jvm = jvm.concat(this.options.customArgs) + if (this.options.customArgs) jvm = jvm.concat(this.options.customArgs); if (this.options.overrides.logj4ConfigurationFile) { - jvm.push(`-Dlog4j.configurationFile=${path.resolve(this.options.overrides.logj4ConfigurationFile)}`) + jvm.push( + `-Dlog4j.configurationFile=${path.resolve( + this.options.overrides.logj4ConfigurationFile + )}` + ); } // https://help.minecraft.net/hc/en-us/articles/4416199399693-Security-Vulnerability-in-Minecraft-Java-Edition - if (parseInt(versionFile.id.split('.')[1]) === 17) jvm.push('-Dlog4j2.formatMsgNoLookups=true') - if (parseInt(versionFile.id.split('.')[1]) < 17) { - if (!jvm.find(arg => arg.includes('Dlog4j.configurationFile'))) { - const configPath = path.resolve(this.options.overrides.cwd || this.options.root) - const intVersion = parseInt(versionFile.id.split('.')[1]) + if (parseInt(versionFile.id.split(".")[1]) === 17) + jvm.push("-Dlog4j2.formatMsgNoLookups=true"); + if (parseInt(versionFile.id.split(".")[1]) < 17) { + if (!jvm.find((arg) => arg.includes("Dlog4j.configurationFile"))) { + const configPath = path.resolve( + this.options.overrides.cwd || this.options.root + ); + const intVersion = parseInt(versionFile.id.split(".")[1]); if (intVersion >= 12) { - await this.handler.downloadAsync('https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml', - configPath, 'log4j2_112-116.xml', true, 'log4j') - jvm.push('-Dlog4j.configurationFile=log4j2_112-116.xml') + await this.handler.downloadAsync( + "https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml", + configPath, + "log4j2_112-116.xml", + true, + "log4j" + ); + jvm.push("-Dlog4j.configurationFile=log4j2_112-116.xml"); } else if (intVersion >= 7) { - await this.handler.downloadAsync('https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml', - configPath, 'log4j2_17-111.xml', true, 'log4j') - jvm.push('-Dlog4j.configurationFile=log4j2_17-111.xml') + await this.handler.downloadAsync( + "https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml", + configPath, + "log4j2_17-111.xml", + true, + "log4j" + ); + jvm.push("-Dlog4j.configurationFile=log4j2_17-111.xml"); } } } - const classes = this.options.overrides.classes || this.handler.cleanUp(await this.handler.getClasses(modifyJson)) - const classPaths = ['-cp'] - const separator = this.handler.getOS() === 'windows' ? ';' : ':' - this.emit('debug', `[MCLC]: Using ${separator} to separate class paths`) + const classes = + this.options.overrides.classes || + this.handler.cleanUp(await this.handler.getClasses(modifyJson)); + const classPaths = ["-cp"]; + const separator = this.handler.getOS() === "windows" ? ";" : ":"; + this.emit("debug", `[PiMi]: Using ${separator} to separate class paths`); // Handling launch arguments. - const file = modifyJson || versionFile + const file = modifyJson || versionFile; // So mods like fabric work. const jar = fs.existsSync(mcPath) ? `${separator}${mcPath}` - : `${separator}${path.join(directory, `${this.options.version.number}.jar`)}` - classPaths.push(`${this.options.forge ? this.options.forge + separator : ''}${classes.join(separator)}${jar}`) - classPaths.push(file.mainClass) + : `${separator}${path.join( + directory, + `${this.options.version.number}.jar` + )}`; + classPaths.push( + `${ + this.options.forge ? this.options.forge + separator : "" + }${classes.join(separator)}${jar}` + ); + classPaths.push(file.mainClass); - this.emit('debug', '[MCLC]: Attempting to download assets') - await this.handler.getAssets() + this.emit("debug", "[PiMi]: Attempting to download assets"); + await this.handler.getAssets(); // Forge -> Custom -> Vanilla - const launchOptions = await this.handler.getLaunchOptions(modifyJson) + const launchOptions = await this.handler.getLaunchOptions(modifyJson); - const launchArguments = args.concat(jvm, classPaths, launchOptions) - this.emit('arguments', launchArguments) - this.emit('debug', `[MCLC]: Launching with arguments ${launchArguments.join(' ')}`) + const launchArguments = args.concat(jvm, classPaths, launchOptions); + this.emit("arguments", launchArguments); + this.emit( + "debug", + `[PiMi]: Launching with arguments ${launchArguments.join(" ")}` + ); - return this.startMinecraft(launchArguments) + return this.startMinecraft(launchArguments); } catch (e) { - this.emit('debug', `[MCLC]: Failed to start due to ${e}, closing...`) - return null + this.emit("debug", `[PiMi]: Failed to start due to ${e}, closing...`); + return null; } } - _printVersion () { - if (fs.existsSync(path.join(__dirname, '..', 'package.json'))) { - const { version } = require('../package.json') - this.emit('debug', `[MCLC]: MCLC version ${version}`) - } else { this.emit('debug', '[MCLC]: Package JSON not found, skipping MCLC version check.') } + _printVersion() { + if (fs.existsSync(path.join(__dirname, "..", "package.json"))) { + const { version } = require("../package.json"); + this.emit("debug", `[PiMi]: PiMi version ${version}`); + } else { + this.emit( + "debug", + "[PiMi]: Package JSON not found, skipping PiMi version check." + ); + } } - _createRootDirectory () { + _createRootDirectory() { if (!fs.existsSync(this.options.root)) { - this.emit('debug', '[MCLC]: Attempting to create root folder') - fs.mkdirSync(this.options.root) + this.emit("debug", "[PiMi]: Attempting to create root folder"); + fs.mkdirSync(this.options.root); } } - _createGameDirectory () { + _createGameDirectory() { if (this.options.overrides.gameDirectory) { - this.options.overrides.gameDirectory = path.resolve(this.options.overrides.gameDirectory) + this.options.overrides.gameDirectory = path.resolve( + this.options.overrides.gameDirectory + ); if (!fs.existsSync(this.options.overrides.gameDirectory)) { - fs.mkdirSync(this.options.overrides.gameDirectory, { recursive: true }) + fs.mkdirSync(this.options.overrides.gameDirectory, { recursive: true }); } } } - async _extractPackage () { + async _extractPackage() { if (this.options.clientPackage) { - this.emit('debug', `[MCLC]: Extracting client package to ${this.options.root}`) - await this.handler.extractPackage() + this.emit( + "debug", + `[PiMi]: Extracting client package to ${this.options.root}` + ); + await this.handler.extractPackage(); } } - async _getModifyJson () { - let modifyJson = null + async _getModifyJson() { + let modifyJson = null; if (this.options.forge) { - this.options.forge = path.resolve(this.options.forge) - this.emit('debug', '[MCLC]: Detected Forge in options, getting dependencies') - modifyJson = await this.handler.getForgedWrapped() + this.options.forge = path.resolve(this.options.forge); + this.emit( + "debug", + "[PiMi]: Detected Forge in options, getting dependencies" + ); + modifyJson = await this.handler.getForgedWrapped(); } else if (this.options.version.custom) { - this.emit('debug', '[MCLC]: Detected custom in options, setting custom version file') - modifyJson = modifyJson || JSON.parse(fs.readFileSync(path.join(this.options.root, 'versions', this.options.version.custom, `${this.options.version.custom}.json`), { encoding: 'utf8' })) + this.emit( + "debug", + "[PiMi]: Detected custom in options, setting custom version file" + ); + modifyJson = + modifyJson || + JSON.parse( + fs.readFileSync( + path.join( + this.options.root, + "versions", + this.options.version.custom, + `${this.options.version.custom}.json` + ), + { encoding: "utf8" } + ) + ); } - return modifyJson + return modifyJson; } - startMinecraft (launchArguments) { - const minecraft = child.spawn(this.options.javaPath ? this.options.javaPath : 'java', launchArguments, - { cwd: this.options.overrides.cwd || this.options.root, detached: this.options.overrides.detached }) - minecraft.stdout.on('data', (data) => this.emit('data', data.toString('utf-8'))) - minecraft.stderr.on('data', (data) => this.emit('data', data.toString('utf-8'))) - minecraft.on('close', (code) => this.emit('close', code)) - return minecraft + startMinecraft(launchArguments) { + const minecraft = child.spawn( + this.options.javaPath ? this.options.javaPath : "java", + launchArguments, + { + cwd: this.options.overrides.cwd || this.options.root, + detached: this.options.overrides.detached, + } + ); + minecraft.stdout.on("data", (data) => + this.emit("data", data.toString("utf-8")) + ); + minecraft.stderr.on("data", (data) => + this.emit("data", data.toString("utf-8")) + ); + minecraft.on("close", (code) => this.emit("close", code)); + return minecraft; } } -module.exports = MCLCore +module.exports = PiMiCore; diff --git a/index.d.ts b/index.d.ts index 4af309e..c0a4866 100644 --- a/index.d.ts +++ b/index.d.ts @@ -38,7 +38,7 @@ declare module "minecraft-launcher-core" { */ clientPackage?: string; /** - * if true MCLC will remove the client package zip file after its finished extracting. + * if true PiMi will remove the client package zip file after its finished extracting. */ removePackage?: boolean; /** @@ -52,12 +52,12 @@ declare module "minecraft-launcher-core" { root: string; /** * OS override for minecraft natives - * + * * @default will autodetect */ os?: OS; /** - * Array of custom Minecraft arguments. + * Array of custom Minecraft arguments. */ customLaunchArgs?: Array; /** @@ -73,19 +73,19 @@ declare module "minecraft-launcher-core" { */ version: { /** - * Actual version. - * + * Actual version. + * * @example '1.16.4' */ number: string; /** * type of release, usually `release` or `snapshot` */ - type: 'release' | 'snapshot' | string; + type: "release" | "snapshot" | string; /** - * The name of the folder, jar file, and version json in the version folder. - * - * ` MCLC will look in the `versions` folder for this name + * The name of the folder, jar file, and version json in the version folder. + * + * ` PiMi will look in the `versions` folder for this name * @example '1.16.4-fabric' */ custom?: string; @@ -101,8 +101,8 @@ declare module "minecraft-launcher-core" { min: string | number; }; /** - * Path to Forge Jar. - * + * Path to Forge Jar. + * * Versions below 1.13 should be the "universal" jar while versions above 1.13+ should be the "installer" jar */ forge?: string; @@ -117,7 +117,7 @@ declare module "minecraft-launcher-core" { host: string; /** * Port of the host url - * + * * @default 25565 */ port?: string; @@ -129,7 +129,7 @@ declare module "minecraft-launcher-core" { host: string; /** * Username for the proxy. - * + * * @default 8080 */ port?: string; @@ -152,7 +152,7 @@ declare module "minecraft-launcher-core" { fullscreen?: boolean; }; quickPlay?: { - type: 'singleplayer' | 'multiplayer' | 'realms' | 'legacy'; + type: "singleplayer" | "multiplayer" | "realms" | "legacy"; identifier: string; path?: string; }; @@ -171,8 +171,8 @@ declare module "minecraft-launcher-core" { name: string; user_properties: Partial; meta?: { - type: "mojang" | "msa", - demo?: boolean + type: "mojang" | "msa"; + demo?: boolean; }; } @@ -188,7 +188,7 @@ declare module "minecraft-launcher-core" { */ getAuth(username: string, password?: string): Promise; /** - * + * * @param access_token Token being checked if it can be used to login with (online mode) * @param client_token Client token being checked to see if there was a change of client (online mode) */ @@ -197,16 +197,13 @@ declare module "minecraft-launcher-core" { client_token: string ): Promise>; /** - * + * * @param access_token Token being checked if it can be used to login with (online mode) * @param client_token Client token being checked to see if there was a change of client (online mode) */ - refreshAuth( - access_token: string, - client_token: string, - ): Promise; + refreshAuth(access_token: string, client_token: string): Promise; /** - * + * * @param access_token Token being checked if it can be used to login with (online mode) * @param client_token Client token being checked to see if there was a change of client (online mode) */ @@ -215,9 +212,9 @@ declare module "minecraft-launcher-core" { client_token: string ): Promise>; /** - * @param username email if using a password, else the username - * @param password password for mojang account - */ + * @param username email if using a password, else the username + * @param password password for mojang account + */ signOut( username: string, password: string @@ -225,17 +222,21 @@ declare module "minecraft-launcher-core" { changeApiUrl(url: string): void; } - import { EventEmitter } from 'events' - import { ChildProcessWithoutNullStreams } from 'child_process' + import { EventEmitter } from "events"; + import { ChildProcessWithoutNullStreams } from "child_process"; export class Client extends EventEmitter { - launch(options: ILauncherOptions): Promise; + launch( + options: ILauncherOptions + ): Promise; protected printVersion(): void; protected createRootDirectory(): void; protected createGameDirectory(): void; protected extractPackage(): Promise; protected getModifyJson(): Promise; - protected startMinecraft(launchArguments: string[]): ChildProcessWithoutNullStreams; + protected startMinecraft( + launchArguments: string[] + ): ChildProcessWithoutNullStreams; } export const Authenticator: IAuthenticator; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b973431 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2952 @@ +{ + "name": "pimi-launcher-core", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pimi-launcher-core", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "adm-zip": "^0.4.13", + "checksum": "^0.1.1", + "request": "^2.88.0", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/node": "^14.0.27", + "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.1", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.51.tgz", + "integrity": "sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/checksum": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz", + "integrity": "sha512-xWkkJpoWQ6CptWw2GvtoQbScL3xtvGjoqvHpALE7B0tSHxSw0ex0tlsKOKkbETaOYGBhMliAyscestDyAZIN9g==", + "dependencies": { + "optimist": "~0.3.5" + }, + "bin": { + "checksum": "bin/checksum-cli.js" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", + "dev": true, + "peerDependencies": { + "eslint": ">=6.2.2", + "eslint-plugin-import": ">=2.18.0", + "eslint-plugin-node": ">=9.1.0", + "eslint-plugin-promise": ">=4.2.1", + "eslint-plugin-standard": ">=4.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", + "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dependencies": { + "wordwrap": "~0.0.2" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + } + } +} diff --git a/package.json b/package.json index fe34150..019b8fc 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { - "name": "minecraft-launcher-core", - "version": "3.17.0", - "description": "Lightweight module that downloads and runs Minecraft using javascript / NodeJS", + "name": "pimi-launcher-core", + "version": "1.0.0", + "description": "Core for pimi-launcher (Minecraft)", "main": "index.js", + "types": "./index.d.ts", "dependencies": { "adm-zip": "^0.4.13", "checksum": "^0.1.1", @@ -23,7 +24,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/Pierce01/MinecraftLauncher-core.git" + "url": "git+https://github.com/artegoser/pimi-launcher-core.git" }, "keywords": [ "minecraft", @@ -32,7 +33,14 @@ "launcher", "minecraft-forge" ], - "author": "Pierce Harriz", + "author": "artegoser (https://github.com/artegoser)", + "contributors": [ + "Pierce Harriz (https://github.com/Pierce01)", + "Bricklou (https://github.com/Bricklou)", + "Suyashtnt (https://github.com/Suyashtnt)", + "Coding-Kiwi (https://github.com/Coding-Kiwi)", + "KevSlashNull (https://github.com/KevSlashNull)" + ], "license": "MIT", "bugs": { "url": "https://github.com/Pierce01/MinecraftLauncher-core/issues"