Last active
March 25, 2024 01:23
-
-
Save yojohanshinwataikei/0697a3e787a686b843e0c2bcb9da1ad3 to your computer and use it in GitHub Desktop.
Arcaea score prober backend
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fs = require("fs-extra") | |
import path = require("path") | |
import net = require("net") | |
import https = require("https") | |
import child = require("child_process") | |
import util = require("util") | |
import WebSocket = require("ws") | |
import brotli = require("brotli") | |
import mysql2 = require("mysql2/promise") | |
import sqlite3 = require("better-sqlite3") | |
import luxon = require("luxon") | |
import fetch = require("node-fetch") | |
import { URLSearchParams } from "url" | |
import config = require("./config.json") | |
// helper | |
type LanguageName = "en" | "ja" | "ko" | "zh-Hans" | "zh-Hant" | |
type LocalizedString = Record<LanguageName, string> | |
interface SongData { | |
id: string, | |
title_localized: LocalizedString, | |
artist: string | |
date: number | |
} | |
interface SongList { | |
songs: SongData[] | |
} | |
type TokenInfo = [token: string, deviceId: string] | |
const getJSONFile = (filename: string) => fs.readJSONSync(path.join(__dirname, filename)) | |
const songlist = () => getJSONFile("songlist") as SongList | |
const tokens = () => getJSONFile("tokens.json") as TokenInfo[] | |
const brotli_compress = (data: any) => brotli.compress(Buffer.from(JSON.stringify(data)), { quality: 5 }) | |
const parseNumber = (num: string, defaultNum: number) => { | |
const value = +num | |
if (Number.isNaN(value)) { | |
return defaultNum | |
} else { | |
return value | |
} | |
} | |
const sleep = async (millis: number) => await util.promisify(setTimeout)(millis) | |
const log = (filename: string, message: string) => fs.appendFileSync( | |
path.join(__dirname, filename), | |
luxon.DateTime.now().toFormat("[MM/dd HH:mm:ss] ") + message | |
) | |
const sendData = async (websocket: WebSocket, data: any) => { | |
await util.promisify(websocket.send).call(websocket, data) | |
} | |
const constantFromScoreAndRating = (score: number, rating: number) => { | |
let result = 0 | |
if (score > 100e5) { | |
result = rating - 2 | |
} else if (score > 98e5) { | |
result = rating - 1 - (score - 98e5) / 2e5 | |
} else if (rating > 0) { | |
result = rating - (score - 95e5) / 3e5 | |
} | |
return Math.round(result * 100) / 100 | |
} | |
const ratingFromConstantAndScore = (constant: number, score: number) => { | |
if (score > 100e5) { | |
return constant + 2 | |
} else if (score > 98e5) { | |
return constant + 1 + (score - 98e5) / 2e5 | |
} else { | |
return Math.max(constant + (score - 95e5) / 3e5, 0) | |
} | |
} | |
// database setup | |
const mysqlPool = mysql2.createPool(config.mysql) | |
const sqlite3DB = new sqlite3(path.join(__dirname, config.sqlite3)) | |
sqlite3DB.pragma("synchronous = 3") | |
// token management | |
const inUseToken = new Set<string>() | |
interface TokenRequestQueueItem { | |
res: (_: void) => void; | |
notifyQueueLength?: (length: number) => void; | |
} | |
const tokenRequestQueue: TokenRequestQueueItem[] = [] | |
const getToken = async (notifyQueueLength?: (length: number) => void) => { | |
while (true) { | |
const usableToken = tokens().filter(([token,]) => !inUseToken.has(token)) | |
if (usableToken.length === 0) { | |
await new Promise((res, _) => { | |
notifyQueueLength?.(tokenRequestQueue.length + 1) | |
tokenRequestQueue.push({ res, notifyQueueLength }) | |
log("arc.log", `tokenRequestQueue.push -->${tokenRequestQueue.length}\n`) | |
}) | |
continue | |
} | |
const tokenInfo = usableToken[Math.floor(Math.random() * usableToken.length)] | |
inUseToken.add(tokenInfo[0]) | |
return tokenInfo | |
} | |
} | |
const returnToken = (tokenInfo: TokenInfo) => { | |
inUseToken.delete(tokenInfo[0]) | |
let item = tokenRequestQueue.shift() | |
log("arc.log", `tokenRequestQueue.shift -->${tokenRequestQueue.length}\n`) | |
item?.res?.() | |
tokenRequestQueue.forEach((item, i) => { | |
item.notifyQueueLength?.(i + 1) | |
}) | |
} | |
const withToken = async (inner: (tokenInfo: TokenInfo) => Promise<void>, notifyQueueLength?: (length: number) => void) => { | |
const tokenInfo = await getToken(notifyQueueLength) | |
try { | |
await inner(tokenInfo) | |
} finally { | |
await sleep(1000) | |
returnToken(tokenInfo) | |
} | |
} | |
// arcapi interaction | |
const challengeGen = path.join(__dirname, config.challenge) | |
const gen_challenge = async (path: string, body: string) => { | |
const gen_cp = child.spawn(challengeGen, [path], { | |
stdio: ["pipe", "pipe", "inherit"], | |
env: { ...process.env, ARC_API_CHALLENGE_SALT: config.salt }, | |
}) | |
const stdin = gen_cp.stdin | |
util.promisify(stdin.end).call(stdin, body) | |
let result = "" | |
gen_cp.stdout.on("data", (data) => result += data) | |
await new Promise((res, rej) => { | |
gen_cp.on("exit", res) | |
}) | |
return result | |
} | |
const endpoint = config.endpoint | |
const apiVersion = config.apiVersion | |
const appVersion = config.appVersion | |
const pfx = config.pfx | |
const passphrase = config.passphrase | |
const agent = new https.Agent({ | |
pfx: fs.readFileSync(pfx), | |
passphrase: fs.readFileSync(passphrase, "utf-8"), | |
}) | |
class ApiError extends Error { | |
public error_code: number | |
public status_code: number | |
constructor(status_code: number, error_code: number, message: string = null) { | |
super(`Arcaea api Error, status_code:${status_code}, error_code:${error_code}` + (message ? `, message:${message}` : "")) | |
this.error_code = error_code | |
this.status_code = status_code | |
} | |
} | |
type ArcapiResult = { success: true, value: any } | { success: false, error_code: number } | |
const intervalBetweenRequests = () => Math.max(180, Math.floor(1000 / tokens().length)) | |
let arcapiRequestCount = 0 | |
const arcapiRequestLimit = config.arcapiRequestLimit | |
const arcapiRequestQueue: ((_: void) => void)[] = [] | |
const beginArcapiRequests = async () => { | |
while (arcapiRequestCount >= arcapiRequestLimit) { | |
await new Promise((res, _) => { | |
arcapiRequestQueue.push(res) | |
}) | |
} | |
arcapiRequestCount++ | |
} | |
const endArcapiRequest = () => { | |
arcapiRequestCount-- | |
let request = arcapiRequestQueue.shift() | |
request?.() | |
} | |
const arcFetchBase = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
const pathBase = `/${apiVersion}/${path}` | |
const fullPath = pathBase + ((method === "GET" && param) ? ("?" + param.toString()) : "") | |
const url = endpoint + fullPath | |
const body = method === "GET" ? null : param.toString() | |
const challenge = await gen_challenge(fullPath, body ?? "") | |
const headers = { | |
"Accept-Encoding": "identity", | |
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8", | |
"Platform": "android", | |
"AppVersion": appVersion, | |
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; G8142 Build/47.2.A.10.107)", | |
"Connection": "Keep-Alive", | |
"DeviceId": tokenInfo[1], | |
"Authorization": `Bearer ${tokenInfo[0]}`, | |
"X-Random-Challenge": challenge, | |
} | |
try { | |
const response = await fetch.default(url, { | |
method, | |
headers, | |
body, | |
agent | |
}) | |
const rawResult = await response.text() | |
const result = (() => { | |
try { | |
return JSON.parse(rawResult) as ArcapiResult | |
} catch (err) { | |
throw new ApiError(response.status, NaN, `JSON parsing error, raw result:${rawResult}`) | |
} | |
})() | |
if (result && result.success) { | |
return result.value | |
} else if (result.success === false) { | |
throw new ApiError(response.status, result.error_code) | |
} else { | |
throw new ApiError(response.status, NaN) | |
} | |
} catch (err) { | |
if (config.logAPIError) { | |
log("arc.log", `arcapi error:${err}\nmethod:${method}\nurl:${url}\ntoken:${tokenInfo[0]}\nrequest body:${body}\n`) | |
} | |
throw err; | |
} | |
} | |
const arcFetchBaseWithRateLimiter = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
await beginArcapiRequests() | |
try { | |
await sleep(intervalBetweenRequests()) | |
return await arcFetchBase(method, path, tokenInfo, param) | |
} finally { | |
endArcapiRequest() | |
} | |
} | |
const arcFetch = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
const retryLimit = config.retryLimit | |
let retryCount = 0 | |
while (true) { | |
try { | |
return await arcFetchBaseWithRateLimiter(method, path, tokenInfo, param) | |
} catch (err) { | |
if (err instanceof ApiError) { | |
if (retryCount < retryLimit && err.status_code === 404 && err.error_code === 1) { | |
retryCount++ | |
continue | |
} | |
if (retryCount < retryLimit && Number.isNaN(err.error_code)) { | |
retryCount++ | |
continue | |
} | |
} | |
if (err instanceof fetch.FetchError) { | |
if (retryCount < retryLimit && (err.code === "ETIMEDOUT" || err.code === "ENOTFOUND")) { | |
retryCount++ | |
continue | |
} | |
} | |
throw err | |
} | |
} | |
} | |
const userMe = async (tokenInfo: TokenInfo) => { | |
return await arcFetch("GET", "user/me", tokenInfo) | |
} | |
const deleteFriend = async (tokenInfo: TokenInfo, userid: number) => { | |
return await arcFetch("POST", "friend/me/delete", tokenInfo, new URLSearchParams({ friend_id: userid.toString() })) | |
} | |
const addFriend = async (tokenInfo: TokenInfo, usercode: string) => { | |
return await arcFetch("POST", "friend/me/add", tokenInfo, new URLSearchParams({ friend_code: usercode })) | |
} | |
const clearFriend = async (tokenInfo: TokenInfo) => { | |
const self = await userMe(tokenInfo) | |
for (const friend of self.friends) { | |
await deleteFriend(tokenInfo, friend.user_id) | |
} | |
} | |
const friendRank = async ( | |
tokenInfo: TokenInfo, | |
songid: string, difficulty: number, start: number = 0, limit: number = 11 | |
) => { | |
return await arcFetch("GET", "score/song/friend", tokenInfo, new URLSearchParams({ | |
song_id: songid, | |
difficulty: difficulty.toString(), | |
start: start.toString(), | |
limit: limit.toString() | |
})) | |
} | |
// features | |
class ProberError extends Error { | |
public client_message: string | |
public reason?: any | |
constructor(client_message: string, reason?: any) { | |
super(`Prober Error, error_code:${client_message}` + (reason ? (` reason:${reason}`) : "")) | |
this.client_message = client_message | |
this.reason = reason | |
} | |
} | |
const sendSongMeta = async (connection: WebSocket) => { | |
const songTitleData: Record<string, LocalizedString> = {} | |
for (const song of songlist().songs) { | |
songTitleData[song.id] = song.title_localized | |
} | |
await sendData(connection, brotli_compress({ cmd: "songtitle", data: songTitleData })) | |
const songArtistData: Record<string, string> = {} | |
for (const song of songlist().songs) { | |
songArtistData[song.id] = song.artist | |
} | |
await sendData(connection, brotli_compress({ cmd: "songartist", data: songArtistData })) | |
} | |
const getSongDate = () => { | |
const songDateData: Record<string, number> = {} | |
for (const song of songlist().songs) { | |
songDateData[song.id] = song.date | |
} | |
return songDateData | |
} | |
const testQuery = async (connection: WebSocket) => { | |
await sendData(connection, brotli_compress(getJSONFile("test_user.json"))) | |
let id = 1 | |
while (fs.existsSync(path.join(__dirname, `test_${id}.json`))) { | |
await sleep(100) | |
await sendData(connection, brotli_compress(getJSONFile(`test_${id}.json`))) | |
id++ | |
} | |
await sendData(connection, "bye") | |
connection.close() | |
} | |
const metaQuery = async (connection: WebSocket, chara: number) => { | |
await sendData(connection, brotli_compress({ | |
cmd: "userinfo", data: { | |
join_date: 1489517588494, | |
name: ["Hikari", "Tairitsu"][chara], | |
rating: 616, | |
recent_score: [], | |
user_code: ["000000001", "000000002"][chara], | |
user_id: [1000001, 1000002][chara] | |
} | |
})) | |
await sendData(connection, "bye") | |
connection.close() | |
} | |
const proberAddFriend = async (tokenInfo: TokenInfo, usercode: string) => { | |
try { | |
await clearFriend(tokenInfo) | |
return await addFriend(tokenInfo, usercode) | |
} catch (err) { | |
if (err instanceof ApiError) { | |
if (err.error_code === 5 || err.error_code === 1203) { | |
throw new ProberError("Please update arcaea", err) | |
} else if (err.error_code === 603) { | |
throw new ProberError("account is locked", err) | |
} else if (err.error_code === 401) { | |
throw new ProberError("invalid user code", err) | |
} else if (err.status_code === 401 || err.status_code === 403) { | |
throw new ProberError("account cannot login", err) | |
} | |
} else if (err instanceof fetch.FetchError) { | |
if (err.code === "ETIMEDOUT") { | |
throw new ProberError("Lowiro server timeout", err) | |
} | |
} | |
throw new ProberError("add", err) | |
} | |
} | |
const proberFriendRank = async (tokenInfo: TokenInfo, songid: string, difficulty: number) => { | |
try { | |
return await friendRank(tokenInfo, songid, difficulty) | |
} catch (err) { | |
if (err instanceof fetch.FetchError) { | |
if (err.code === "ETIMEDOUT") { | |
throw new ProberError("Lowiro server timeout", err) | |
} | |
} | |
throw new ProberError("fetch", err) | |
} | |
} | |
const query = async (connection: WebSocket, userCode: string, param: string[]) => { | |
let constFrom = parseNumber(param[0], 0) | |
let constTo = parseNumber(param[1], 12) | |
await sendSongMeta(connection) | |
const songDateData = getSongDate() | |
if (userCode === "000007357") { | |
return await testQuery(connection) | |
} else if (userCode === "000000001") { | |
return await metaQuery(connection, 0) | |
} else if (userCode === "000000002") { | |
return await metaQuery(connection, 1) | |
} | |
const selectUser = sqlite3DB.prepare("SELECT id FROM known_code WHERE code=?") | |
let cachedUserId = selectUser.get(userCode)?.id ?? 0 | |
log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress}\t${userCode}\t${cachedUserId}\n`) | |
await sendData(connection, "queued") | |
const notifyQueueLength = async (length: number) => { | |
try { | |
await sendData(connection, `queueLength,${length}`) | |
} catch { | |
// do nothing | |
} | |
} | |
await withToken(async (tokenInfo) => { | |
await sendData(connection, "queried") | |
const addResult = await proberAddFriend(tokenInfo, userCode) | |
// delete all and add one, so we should only have one friend | |
if (addResult.friends.length !== 1) { | |
throw new ProberError("add", new Error("Friend count after add is not 1")) | |
} | |
const userInfo = addResult.friends[0] | |
const insertCode = sqlite3DB.prepare("INSERT OR REPLACE INTO known_code (code,id) VALUES (?,?)") | |
insertCode.run(userCode, userInfo.user_id) | |
sqlite3DB.transaction(() => { | |
if (userInfo.rating > 0) { | |
const data = [userInfo.join_date, userInfo.name, userInfo.rating, userCode, Date.now(), userInfo.user_id] | |
sqlite3DB.prepare("INSERT OR IGNORE INTO user_info (join_date,name,rating,code,data_time,id) VALUES (?,?,?,?,?,?)").run(...data) | |
sqlite3DB.prepare("UPDATE user_info SET join_date=?,name=?,rating=?,code=?,data_time=? WHERE id=?").run(...data) | |
sqlite3DB.prepare('INSERT OR IGNORE INTO rating_record (id,date,rating) VALUES (?,?,?)').run(userInfo.user_id, luxon.DateTime.now().toFormat("yyMMdd"), userInfo.rating); | |
} else { | |
//new user or hidden rating | |
const data = [userInfo.join_date, userInfo.name, userCode, userInfo.user_id] | |
sqlite3DB.prepare('INSERT OR IGNORE INTO user_info (join_date,name,code,id) VALUES (?,?,?,?)').run(...data); | |
sqlite3DB.prepare('UPDATE user_info SET join_date=?,name=?,code=? WHERE id=?').run(...data); | |
} | |
}).exclusive() | |
for (const score of userInfo.recent_score) { | |
if ("rating" in score) { | |
score.constant = constantFromScoreAndRating(score.score, score.rating) | |
score.song_date = songDateData[score.song_id] | |
score.constant_old = score.time_played < config.lastConstantUpdateTime | |
const connection = await mysqlPool.getConnection() | |
await connection.beginTransaction() | |
try { | |
const [chartRows,] = await connection.query("SELECT id,difficulty,time_played FROM chart_constants WHERE id=? AND difficulty=?", [score.song_id, score.difficulty]) | |
const recordedTime = chartRows[0]?.time_played ?? -Infinity | |
const needUpdate = recordedTime < config.lastConstantUpdateTime && score.time_played >= config.lastConstantUpdateTime | |
if (score.rating > 0) { | |
if (needUpdate) { | |
await connection.execute("REPLACE INTO chart_constants (id,difficulty,constant,source_score,source_rating,time_played) VALUES (?,?,?,?,?,?)", | |
[score.song_id, score.difficulty, score.constant, score.score, score.rating, score.time_played]) | |
} else { | |
await connection.execute("INSERT IGNORE INTO chart_constants (id,difficulty,constant,source_score,source_rating,time_played) VALUES (?,?,?,?,?,?)", | |
[score.song_id, score.difficulty, score.constant, score.score, score.rating, score.time_played]) | |
} | |
} | |
await connection.commit(); | |
} catch (err) { | |
await connection.rollback(); | |
throw err; | |
} finally { | |
connection.release(); | |
} | |
} | |
} | |
userInfo.user_code = userCode | |
const selectRatingRecord = sqlite3DB.prepare("SELECT date,rating FROM rating_record WHERE id=?") | |
const ratingRecord = selectRatingRecord.all(userInfo.user_id) | |
userInfo.rating_records = ratingRecord.map((row) => [row.date.toString(), row.rating]) | |
log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress} --> ${((userInfo.rating as number) / 100).toFixed(2)} ${userInfo.name}\n`) | |
await sendData(connection, brotli_compress({ cmd: "userinfo", data: userInfo })) | |
const userPtt = userInfo.rating / 100 | |
if (param.length == 0) { | |
if (userInfo.rating <= 0) { | |
throw new ProberError("potential_hidden") | |
} else { | |
constFrom = userPtt - 3 | |
} | |
} | |
const [chartRows,] = await mysqlPool.query("SELECT id,difficulty,constant,time_played FROM chart_constants") | |
const charts = (chartRows as any[]).filter(chart => chart.constant <= constTo && chart.constant >= constFrom); | |
charts.sort((a, b) => b.constant - a.constant) | |
for (const chart of charts) { | |
const rank = await proberFriendRank(tokenInfo, chart.id, chart.difficulty) | |
const scores = rank.filter(record => record.user_id === userInfo.user_id) | |
if (scores.length === 1) { | |
const score = scores[0] | |
score.constant = chart.constant | |
score.constant_old = chart.time_played < config.lastConstantUpdateTime | |
score.rating = ratingFromConstantAndScore(chart.constant, score.score) | |
score.song_date = songDateData[chart.id] | |
await sendData(connection, brotli_compress({ cmd: "scores", data: [score] })) | |
} | |
} | |
await sendData(connection, "bye") | |
connection.close() | |
}, notifyQueueLength) | |
} | |
const fetchConstants = async (connection: WebSocket) => { | |
await sendSongMeta(connection) | |
const [rows,] = await mysqlPool.query("SELECT id,difficulty,constant,time_played FROM chart_constants") | |
const songConstantsData: Record<string, { constant: any; old: boolean; }[]> = {} | |
for (const { id, difficulty, constant, time_played } of rows as mysql2.RowDataPacket[]) { | |
if (!(id in songConstantsData)) { | |
songConstantsData[id] = [] | |
} | |
songConstantsData[id][difficulty] = { constant, old: time_played < config.lastConstantUpdateTime } | |
} | |
await sendData(connection, brotli_compress({ cmd: "constants", data: songConstantsData })) | |
await sendData(connection, "bye") | |
connection.close() | |
} | |
const lookupUser = async (connection: WebSocket, user: string) => { | |
if (!/^[a-zA-Z0-9]+$/.test(user)) { | |
await sendData(connection, "invalid id") | |
connection.close() | |
return | |
} | |
const selectUser = sqlite3DB.prepare("SELECT * FROM user_info WHERE lower(name)=?") | |
const userInfos = selectUser.all(user.toLowerCase()) | |
await sendData(connection, brotli_compress({ | |
cmd: "lookup_result", data: userInfos.map(row => ({ | |
...row, | |
data_time: luxon.DateTime.fromMillis(row.data_time).toFormat("yyyy/MM/dd"), | |
})) | |
})) | |
await sendData(connection, "bye") | |
connection.close() | |
} | |
const handleCommand = async (connection: WebSocket, command: string[]) => { | |
try { | |
if (command.length === 0) { | |
await sendData(connection, "invalid cmd") | |
connection.close() | |
return | |
} else if (command[0] === "constants") { | |
return await fetchConstants(connection); | |
} else if (command[0] === "lookup" && command.length >= 2) { | |
return await lookupUser(connection, command[1]); | |
} else if (/^\d{9}$/.test(command[0])) { | |
return await query(connection, command[0], command.slice(1)) | |
} | |
await sendData(connection, "invalid id") | |
connection.close() | |
} catch (err) { | |
connection.send(`error,${err?.client_message ?? "Unknown error"}`) | |
log("arc.log", `[error]command:${command}\nerr:${err}\n`) | |
connection.close() | |
} | |
} | |
// server setup | |
const connectionHasPong = new WeakMap<WebSocket, boolean>() | |
const httpsServer = https.createServer({ | |
cert: fs.readFileSync(config.httpsCert), | |
key: fs.readFileSync(config.httpsKey), | |
}) | |
const server = new WebSocket.Server({ | |
server: httpsServer, | |
}) | |
server.on("connection", (connection) => { | |
connectionHasPong.set(connection, true) | |
connection.on("pong", () => { | |
connectionHasPong.set(connection, true) | |
}) | |
connection.binaryType = "arraybuffer" | |
const commandTimeout = setTimeout(() => { | |
connection.send("timeout") | |
connection.close() | |
}, 5000) | |
connection.on("message", async (message, isBinary) => { | |
clearTimeout(commandTimeout) | |
if (isBinary) { | |
connection.send("invalid cmd") | |
connection.close() | |
return | |
} | |
const command = message.toString().split(" ") | |
await handleCommand(connection, command) | |
}) | |
connection.on("error", (_, err) => { | |
log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress}\twebsocket error:${err}`) | |
console.error(`${((connection as any)._socket as net.Socket)?.remoteAddress}\twebsocket error:${err}`) | |
connection.terminate() | |
}) | |
}) | |
const connectionPingTestInterval = setInterval(() => { | |
for (const connection of server.clients) { | |
if (connectionHasPong.get(connection)) { | |
connectionHasPong.set(connection, false) | |
connection.ping() | |
} else { | |
connection.terminate() | |
} | |
} | |
}, 5000) | |
server.on("close", () => { | |
clearInterval(connectionPingTestInterval) | |
}) | |
httpsServer.listen(config.port) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "arc_probe", | |
"version": "0.0.0", | |
"lockfileVersion": 2, | |
"requires": true, | |
"packages": { | |
"": { | |
"version": "0.0.0", | |
"license": "ISC", | |
"dependencies": { | |
"better-sqlite3": "^7.4.1", | |
"brotli": "^1.3.2", | |
"fs-extra": "^10.0.0", | |
"luxon": "^1.27.0", | |
"mysql2": "^2.2.5", | |
"node-fetch": "^2.6.1", | |
"ws": "^8.2.0" | |
}, | |
"devDependencies": { | |
"@types/better-sqlite3": "^5.4.1", | |
"@types/brotli": "^1.3.0", | |
"@types/fs-extra": "^9.0.11", | |
"@types/luxon": "^1.27.0", | |
"@types/node": "^15.12.3", | |
"@types/node-fetch": "^2.5.10", | |
"@types/ws": "^7.4.7", | |
"typescript": "^4.3.4" | |
} | |
}, | |
"node_modules/@types/better-sqlite3": { | |
"version": "5.4.1", | |
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz", | |
"integrity": "sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng==", | |
"dev": true, | |
"dependencies": { | |
"@types/integer": "*" | |
} | |
}, | |
"node_modules/@types/brotli": { | |
"version": "1.3.0", | |
"resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.0.tgz", | |
"integrity": "sha512-89tTxLlpcaOw+K2KVTGUfEXhTj1EwBDy2W2bNCt5pGG9x02SgLb9ayLTGVgpWMJAqr+EwCV0hVy2S94u6vQ16w==", | |
"dev": true, | |
"dependencies": { | |
"@types/node": "*" | |
} | |
}, | |
"node_modules/@types/fs-extra": { | |
"version": "9.0.11", | |
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz", | |
"integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==", | |
"dev": true, | |
"dependencies": { | |
"@types/node": "*" | |
} | |
}, | |
"node_modules/@types/integer": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.0.tgz", | |
"integrity": "sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw==", | |
"dev": true | |
}, | |
"node_modules/@types/luxon": { | |
"version": "1.27.0", | |
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.27.0.tgz", | |
"integrity": "sha512-rr2lNXsErnA/ARtgFn46NtQjUa66cuwZYeo/2K7oqqxhJErhXgHBPyNKCo+pfOC3L7HFwtao8ebViiU9h4iAxA==", | |
"dev": true | |
}, | |
"node_modules/@types/node": { | |
"version": "15.12.3", | |
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", | |
"integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==", | |
"dev": true | |
}, | |
"node_modules/@types/node-fetch": { | |
"version": "2.5.10", | |
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", | |
"integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", | |
"dev": true, | |
"dependencies": { | |
"@types/node": "*", | |
"form-data": "^3.0.0" | |
} | |
}, | |
"node_modules/@types/ws": { | |
"version": "7.4.7", | |
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", | |
"integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", | |
"dev": true, | |
"dependencies": { | |
"@types/node": "*" | |
} | |
}, | |
"node_modules/ansi-regex": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | |
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/aproba": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", | |
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" | |
}, | |
"node_modules/are-we-there-yet": { | |
"version": "1.1.5", | |
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", | |
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | |
"dependencies": { | |
"delegates": "^1.0.0", | |
"readable-stream": "^2.0.6" | |
} | |
}, | |
"node_modules/asynckit": { | |
"version": "0.4.0", | |
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | |
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", | |
"dev": true | |
}, | |
"node_modules/base64-js": { | |
"version": "1.5.1", | |
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | |
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", | |
"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/better-sqlite3": { | |
"version": "7.4.1", | |
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.1.tgz", | |
"integrity": "sha512-sk1kW3PsWE7W7G9qbi5TQxCROlQVR8YWlp4srbyrwN5DrLeamKfrm3JExwOiNSAYyJv8cw5/2HOfvF/ipZj4qg==", | |
"hasInstallScript": true, | |
"dependencies": { | |
"bindings": "^1.5.0", | |
"prebuild-install": "^6.0.1", | |
"tar": "^6.1.0" | |
} | |
}, | |
"node_modules/bindings": { | |
"version": "1.5.0", | |
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", | |
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", | |
"dependencies": { | |
"file-uri-to-path": "1.0.0" | |
} | |
}, | |
"node_modules/bl": { | |
"version": "4.1.0", | |
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", | |
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", | |
"dependencies": { | |
"buffer": "^5.5.0", | |
"inherits": "^2.0.4", | |
"readable-stream": "^3.4.0" | |
} | |
}, | |
"node_modules/bl/node_modules/readable-stream": { | |
"version": "3.6.0", | |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
"dependencies": { | |
"inherits": "^2.0.3", | |
"string_decoder": "^1.1.1", | |
"util-deprecate": "^1.0.1" | |
}, | |
"engines": { | |
"node": ">= 6" | |
} | |
}, | |
"node_modules/brotli": { | |
"version": "1.3.2", | |
"resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", | |
"integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", | |
"dependencies": { | |
"base64-js": "^1.1.2" | |
} | |
}, | |
"node_modules/buffer": { | |
"version": "5.7.1", | |
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | |
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | |
"funding": [ | |
{ | |
"type": "github", | |
"url": "https://github.com/sponsors/feross" | |
}, | |
{ | |
"type": "patreon", | |
"url": "https://www.patreon.com/feross" | |
}, | |
{ | |
"type": "consulting", | |
"url": "https://feross.org/support" | |
} | |
], | |
"dependencies": { | |
"base64-js": "^1.3.1", | |
"ieee754": "^1.1.13" | |
} | |
}, | |
"node_modules/chownr": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", | |
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", | |
"engines": { | |
"node": ">=10" | |
} | |
}, | |
"node_modules/code-point-at": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | |
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"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==", | |
"dev": true, | |
"dependencies": { | |
"delayed-stream": "~1.0.0" | |
}, | |
"engines": { | |
"node": ">= 0.8" | |
} | |
}, | |
"node_modules/console-control-strings": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", | |
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" | |
}, | |
"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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" | |
}, | |
"node_modules/decompress-response": { | |
"version": "4.2.1", | |
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", | |
"integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", | |
"dependencies": { | |
"mimic-response": "^2.0.0" | |
}, | |
"engines": { | |
"node": ">=8" | |
} | |
}, | |
"node_modules/deep-extend": { | |
"version": "0.6.0", | |
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | |
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", | |
"engines": { | |
"node": ">=4.0.0" | |
} | |
}, | |
"node_modules/delayed-stream": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | |
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", | |
"dev": true, | |
"engines": { | |
"node": ">=0.4.0" | |
} | |
}, | |
"node_modules/delegates": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | |
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" | |
}, | |
"node_modules/denque": { | |
"version": "1.5.0", | |
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", | |
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", | |
"engines": { | |
"node": ">=0.10" | |
} | |
}, | |
"node_modules/detect-libc": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | |
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", | |
"bin": { | |
"detect-libc": "bin/detect-libc.js" | |
}, | |
"engines": { | |
"node": ">=0.10" | |
} | |
}, | |
"node_modules/end-of-stream": { | |
"version": "1.4.4", | |
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", | |
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", | |
"dependencies": { | |
"once": "^1.4.0" | |
} | |
}, | |
"node_modules/expand-template": { | |
"version": "2.0.3", | |
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", | |
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", | |
"engines": { | |
"node": ">=6" | |
} | |
}, | |
"node_modules/file-uri-to-path": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", | |
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" | |
}, | |
"node_modules/form-data": { | |
"version": "3.0.1", | |
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", | |
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", | |
"dev": true, | |
"dependencies": { | |
"asynckit": "^0.4.0", | |
"combined-stream": "^1.0.8", | |
"mime-types": "^2.1.12" | |
}, | |
"engines": { | |
"node": ">= 6" | |
} | |
}, | |
"node_modules/fs-constants": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", | |
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" | |
}, | |
"node_modules/fs-extra": { | |
"version": "10.0.0", | |
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", | |
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", | |
"dependencies": { | |
"graceful-fs": "^4.2.0", | |
"jsonfile": "^6.0.1", | |
"universalify": "^2.0.0" | |
}, | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/fs-minipass": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", | |
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", | |
"dependencies": { | |
"minipass": "^3.0.0" | |
}, | |
"engines": { | |
"node": ">= 8" | |
} | |
}, | |
"node_modules/gauge": { | |
"version": "2.7.4", | |
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", | |
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | |
"dependencies": { | |
"aproba": "^1.0.3", | |
"console-control-strings": "^1.0.0", | |
"has-unicode": "^2.0.0", | |
"object-assign": "^4.1.0", | |
"signal-exit": "^3.0.0", | |
"string-width": "^1.0.1", | |
"strip-ansi": "^3.0.1", | |
"wide-align": "^1.1.0" | |
} | |
}, | |
"node_modules/generate-function": { | |
"version": "2.3.1", | |
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", | |
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", | |
"dependencies": { | |
"is-property": "^1.0.2" | |
} | |
}, | |
"node_modules/github-from-package": { | |
"version": "0.0.0", | |
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", | |
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" | |
}, | |
"node_modules/graceful-fs": { | |
"version": "4.2.6", | |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", | |
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" | |
}, | |
"node_modules/has-unicode": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", | |
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" | |
}, | |
"node_modules/iconv-lite": { | |
"version": "0.6.3", | |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", | |
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", | |
"dependencies": { | |
"safer-buffer": ">= 2.1.2 < 3.0.0" | |
}, | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/ieee754": { | |
"version": "1.2.1", | |
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | |
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", | |
"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/inherits": { | |
"version": "2.0.4", | |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | |
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | |
}, | |
"node_modules/ini": { | |
"version": "1.3.8", | |
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", | |
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" | |
}, | |
"node_modules/is-fullwidth-code-point": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", | |
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | |
"dependencies": { | |
"number-is-nan": "^1.0.0" | |
}, | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/is-property": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", | |
"integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" | |
}, | |
"node_modules/isarray": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | |
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | |
}, | |
"node_modules/jsonfile": { | |
"version": "6.1.0", | |
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", | |
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", | |
"dependencies": { | |
"universalify": "^2.0.0" | |
}, | |
"optionalDependencies": { | |
"graceful-fs": "^4.1.6" | |
} | |
}, | |
"node_modules/long": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", | |
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" | |
}, | |
"node_modules/lru-cache": { | |
"version": "6.0.0", | |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", | |
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", | |
"dependencies": { | |
"yallist": "^4.0.0" | |
}, | |
"engines": { | |
"node": ">=10" | |
} | |
}, | |
"node_modules/luxon": { | |
"version": "1.27.0", | |
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.27.0.tgz", | |
"integrity": "sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==", | |
"engines": { | |
"node": "*" | |
} | |
}, | |
"node_modules/mime-db": { | |
"version": "1.48.0", | |
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", | |
"integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", | |
"dev": true, | |
"engines": { | |
"node": ">= 0.6" | |
} | |
}, | |
"node_modules/mime-types": { | |
"version": "2.1.31", | |
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", | |
"integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", | |
"dev": true, | |
"dependencies": { | |
"mime-db": "1.48.0" | |
}, | |
"engines": { | |
"node": ">= 0.6" | |
} | |
}, | |
"node_modules/mimic-response": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", | |
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", | |
"engines": { | |
"node": ">=8" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/minimist": { | |
"version": "1.2.5", | |
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | |
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" | |
}, | |
"node_modules/minipass": { | |
"version": "3.1.3", | |
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", | |
"integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", | |
"dependencies": { | |
"yallist": "^4.0.0" | |
}, | |
"engines": { | |
"node": ">=8" | |
} | |
}, | |
"node_modules/minizlib": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", | |
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", | |
"dependencies": { | |
"minipass": "^3.0.0", | |
"yallist": "^4.0.0" | |
}, | |
"engines": { | |
"node": ">= 8" | |
} | |
}, | |
"node_modules/mkdirp": { | |
"version": "1.0.4", | |
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", | |
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", | |
"bin": { | |
"mkdirp": "bin/cmd.js" | |
}, | |
"engines": { | |
"node": ">=10" | |
} | |
}, | |
"node_modules/mkdirp-classic": { | |
"version": "0.5.3", | |
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", | |
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" | |
}, | |
"node_modules/mysql2": { | |
"version": "2.2.5", | |
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", | |
"integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", | |
"dependencies": { | |
"denque": "^1.4.1", | |
"generate-function": "^2.3.1", | |
"iconv-lite": "^0.6.2", | |
"long": "^4.0.0", | |
"lru-cache": "^6.0.0", | |
"named-placeholders": "^1.1.2", | |
"seq-queue": "^0.0.5", | |
"sqlstring": "^2.3.2" | |
}, | |
"engines": { | |
"node": ">= 8.0" | |
} | |
}, | |
"node_modules/named-placeholders": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", | |
"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", | |
"dependencies": { | |
"lru-cache": "^4.1.3" | |
}, | |
"engines": { | |
"node": ">=6.0.0" | |
} | |
}, | |
"node_modules/named-placeholders/node_modules/lru-cache": { | |
"version": "4.1.5", | |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", | |
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", | |
"dependencies": { | |
"pseudomap": "^1.0.2", | |
"yallist": "^2.1.2" | |
} | |
}, | |
"node_modules/named-placeholders/node_modules/yallist": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | |
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" | |
}, | |
"node_modules/napi-build-utils": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", | |
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" | |
}, | |
"node_modules/node-abi": { | |
"version": "2.30.0", | |
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", | |
"integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", | |
"dependencies": { | |
"semver": "^5.4.1" | |
} | |
}, | |
"node_modules/node-fetch": { | |
"version": "2.6.1", | |
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", | |
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", | |
"engines": { | |
"node": "4.x || >=6.0.0" | |
} | |
}, | |
"node_modules/npmlog": { | |
"version": "4.1.2", | |
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", | |
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | |
"dependencies": { | |
"are-we-there-yet": "~1.1.2", | |
"console-control-strings": "~1.1.0", | |
"gauge": "~2.7.3", | |
"set-blocking": "~2.0.0" | |
} | |
}, | |
"node_modules/number-is-nan": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", | |
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/object-assign": { | |
"version": "4.1.1", | |
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | |
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/once": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |
"dependencies": { | |
"wrappy": "1" | |
} | |
}, | |
"node_modules/prebuild-install": { | |
"version": "6.1.3", | |
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", | |
"integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", | |
"dependencies": { | |
"detect-libc": "^1.0.3", | |
"expand-template": "^2.0.3", | |
"github-from-package": "0.0.0", | |
"minimist": "^1.2.3", | |
"mkdirp-classic": "^0.5.3", | |
"napi-build-utils": "^1.0.1", | |
"node-abi": "^2.21.0", | |
"npmlog": "^4.0.1", | |
"pump": "^3.0.0", | |
"rc": "^1.2.7", | |
"simple-get": "^3.0.3", | |
"tar-fs": "^2.0.0", | |
"tunnel-agent": "^0.6.0" | |
}, | |
"bin": { | |
"prebuild-install": "bin.js" | |
}, | |
"engines": { | |
"node": ">=6" | |
} | |
}, | |
"node_modules/process-nextick-args": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | |
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | |
}, | |
"node_modules/pseudomap": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", | |
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" | |
}, | |
"node_modules/pump": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", | |
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", | |
"dependencies": { | |
"end-of-stream": "^1.1.0", | |
"once": "^1.3.1" | |
} | |
}, | |
"node_modules/rc": { | |
"version": "1.2.8", | |
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | |
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | |
"dependencies": { | |
"deep-extend": "^0.6.0", | |
"ini": "~1.3.0", | |
"minimist": "^1.2.0", | |
"strip-json-comments": "~2.0.1" | |
}, | |
"bin": { | |
"rc": "cli.js" | |
} | |
}, | |
"node_modules/readable-stream": { | |
"version": "2.3.7", | |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | |
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | |
"dependencies": { | |
"core-util-is": "~1.0.0", | |
"inherits": "~2.0.3", | |
"isarray": "~1.0.0", | |
"process-nextick-args": "~2.0.0", | |
"safe-buffer": "~5.1.1", | |
"string_decoder": "~1.1.1", | |
"util-deprecate": "~1.0.1" | |
} | |
}, | |
"node_modules/safe-buffer": { | |
"version": "5.1.2", | |
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | |
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | |
}, | |
"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": "5.7.1", | |
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | |
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", | |
"bin": { | |
"semver": "bin/semver" | |
} | |
}, | |
"node_modules/seq-queue": { | |
"version": "0.0.5", | |
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", | |
"integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" | |
}, | |
"node_modules/set-blocking": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", | |
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" | |
}, | |
"node_modules/signal-exit": { | |
"version": "3.0.3", | |
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", | |
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" | |
}, | |
"node_modules/simple-concat": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", | |
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", | |
"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/simple-get": { | |
"version": "3.1.0", | |
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", | |
"integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", | |
"dependencies": { | |
"decompress-response": "^4.2.0", | |
"once": "^1.3.1", | |
"simple-concat": "^1.0.0" | |
} | |
}, | |
"node_modules/sqlstring": { | |
"version": "2.3.2", | |
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", | |
"integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", | |
"engines": { | |
"node": ">= 0.6" | |
} | |
}, | |
"node_modules/string_decoder": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | |
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | |
"dependencies": { | |
"safe-buffer": "~5.1.0" | |
} | |
}, | |
"node_modules/string-width": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", | |
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | |
"dependencies": { | |
"code-point-at": "^1.0.0", | |
"is-fullwidth-code-point": "^1.0.0", | |
"strip-ansi": "^3.0.0" | |
}, | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/strip-ansi": { | |
"version": "3.0.1", | |
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | |
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | |
"dependencies": { | |
"ansi-regex": "^2.0.0" | |
}, | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/strip-json-comments": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | |
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/tar": { | |
"version": "6.1.10", | |
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", | |
"integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", | |
"dependencies": { | |
"chownr": "^2.0.0", | |
"fs-minipass": "^2.0.0", | |
"minipass": "^3.0.0", | |
"minizlib": "^2.1.1", | |
"mkdirp": "^1.0.3", | |
"yallist": "^4.0.0" | |
}, | |
"engines": { | |
"node": ">= 10" | |
} | |
}, | |
"node_modules/tar-fs": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", | |
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", | |
"dependencies": { | |
"chownr": "^1.1.1", | |
"mkdirp-classic": "^0.5.2", | |
"pump": "^3.0.0", | |
"tar-stream": "^2.1.4" | |
} | |
}, | |
"node_modules/tar-fs/node_modules/chownr": { | |
"version": "1.1.4", | |
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", | |
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" | |
}, | |
"node_modules/tar-stream": { | |
"version": "2.2.0", | |
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", | |
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", | |
"dependencies": { | |
"bl": "^4.0.3", | |
"end-of-stream": "^1.4.1", | |
"fs-constants": "^1.0.0", | |
"inherits": "^2.0.3", | |
"readable-stream": "^3.1.1" | |
}, | |
"engines": { | |
"node": ">=6" | |
} | |
}, | |
"node_modules/tar-stream/node_modules/readable-stream": { | |
"version": "3.6.0", | |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
"dependencies": { | |
"inherits": "^2.0.3", | |
"string_decoder": "^1.1.1", | |
"util-deprecate": "^1.0.1" | |
}, | |
"engines": { | |
"node": ">= 6" | |
} | |
}, | |
"node_modules/tunnel-agent": { | |
"version": "0.6.0", | |
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", | |
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", | |
"dependencies": { | |
"safe-buffer": "^5.0.1" | |
}, | |
"engines": { | |
"node": "*" | |
} | |
}, | |
"node_modules/typescript": { | |
"version": "4.3.4", | |
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", | |
"integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", | |
"dev": true, | |
"bin": { | |
"tsc": "bin/tsc", | |
"tsserver": "bin/tsserver" | |
}, | |
"engines": { | |
"node": ">=4.2.0" | |
} | |
}, | |
"node_modules/universalify": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", | |
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", | |
"engines": { | |
"node": ">= 10.0.0" | |
} | |
}, | |
"node_modules/util-deprecate": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | |
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" | |
}, | |
"node_modules/wide-align": { | |
"version": "1.1.3", | |
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", | |
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", | |
"dependencies": { | |
"string-width": "^1.0.2 || 2" | |
} | |
}, | |
"node_modules/wrappy": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | |
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" | |
}, | |
"node_modules/ws": { | |
"version": "8.2.0", | |
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", | |
"integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", | |
"engines": { | |
"node": ">=10.0.0" | |
}, | |
"peerDependencies": { | |
"bufferutil": "^4.0.1", | |
"utf-8-validate": "^5.0.2" | |
}, | |
"peerDependenciesMeta": { | |
"bufferutil": { | |
"optional": true | |
}, | |
"utf-8-validate": { | |
"optional": true | |
} | |
} | |
}, | |
"node_modules/yallist": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | |
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" | |
} | |
}, | |
"dependencies": { | |
"@types/better-sqlite3": { | |
"version": "5.4.1", | |
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz", | |
"integrity": "sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng==", | |
"dev": true, | |
"requires": { | |
"@types/integer": "*" | |
} | |
}, | |
"@types/brotli": { | |
"version": "1.3.0", | |
"resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.0.tgz", | |
"integrity": "sha512-89tTxLlpcaOw+K2KVTGUfEXhTj1EwBDy2W2bNCt5pGG9x02SgLb9ayLTGVgpWMJAqr+EwCV0hVy2S94u6vQ16w==", | |
"dev": true, | |
"requires": { | |
"@types/node": "*" | |
} | |
}, | |
"@types/fs-extra": { | |
"version": "9.0.11", | |
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz", | |
"integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==", | |
"dev": true, | |
"requires": { | |
"@types/node": "*" | |
} | |
}, | |
"@types/integer": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.0.tgz", | |
"integrity": "sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw==", | |
"dev": true | |
}, | |
"@types/luxon": { | |
"version": "1.27.0", | |
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.27.0.tgz", | |
"integrity": "sha512-rr2lNXsErnA/ARtgFn46NtQjUa66cuwZYeo/2K7oqqxhJErhXgHBPyNKCo+pfOC3L7HFwtao8ebViiU9h4iAxA==", | |
"dev": true | |
}, | |
"@types/node": { | |
"version": "15.12.3", | |
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", | |
"integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==", | |
"dev": true | |
}, | |
"@types/node-fetch": { | |
"version": "2.5.10", | |
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", | |
"integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", | |
"dev": true, | |
"requires": { | |
"@types/node": "*", | |
"form-data": "^3.0.0" | |
} | |
}, | |
"@types/ws": { | |
"version": "7.4.7", | |
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", | |
"integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", | |
"dev": true, | |
"requires": { | |
"@types/node": "*" | |
} | |
}, | |
"ansi-regex": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | |
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" | |
}, | |
"aproba": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", | |
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" | |
}, | |
"are-we-there-yet": { | |
"version": "1.1.5", | |
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", | |
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | |
"requires": { | |
"delegates": "^1.0.0", | |
"readable-stream": "^2.0.6" | |
} | |
}, | |
"asynckit": { | |
"version": "0.4.0", | |
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | |
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", | |
"dev": true | |
}, | |
"base64-js": { | |
"version": "1.5.1", | |
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | |
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" | |
}, | |
"better-sqlite3": { | |
"version": "7.4.1", | |
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.1.tgz", | |
"integrity": "sha512-sk1kW3PsWE7W7G9qbi5TQxCROlQVR8YWlp4srbyrwN5DrLeamKfrm3JExwOiNSAYyJv8cw5/2HOfvF/ipZj4qg==", | |
"requires": { | |
"bindings": "^1.5.0", | |
"prebuild-install": "^6.0.1", | |
"tar": "^6.1.0" | |
} | |
}, | |
"bindings": { | |
"version": "1.5.0", | |
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", | |
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", | |
"requires": { | |
"file-uri-to-path": "1.0.0" | |
} | |
}, | |
"bl": { | |
"version": "4.1.0", | |
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", | |
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", | |
"requires": { | |
"buffer": "^5.5.0", | |
"inherits": "^2.0.4", | |
"readable-stream": "^3.4.0" | |
}, | |
"dependencies": { | |
"readable-stream": { | |
"version": "3.6.0", | |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
"requires": { | |
"inherits": "^2.0.3", | |
"string_decoder": "^1.1.1", | |
"util-deprecate": "^1.0.1" | |
} | |
} | |
} | |
}, | |
"brotli": { | |
"version": "1.3.2", | |
"resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", | |
"integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", | |
"requires": { | |
"base64-js": "^1.1.2" | |
} | |
}, | |
"buffer": { | |
"version": "5.7.1", | |
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | |
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | |
"requires": { | |
"base64-js": "^1.3.1", | |
"ieee754": "^1.1.13" | |
} | |
}, | |
"chownr": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", | |
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" | |
}, | |
"code-point-at": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | |
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" | |
}, | |
"combined-stream": { | |
"version": "1.0.8", | |
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | |
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | |
"dev": true, | |
"requires": { | |
"delayed-stream": "~1.0.0" | |
} | |
}, | |
"console-control-strings": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", | |
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" | |
}, | |
"core-util-is": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | |
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" | |
}, | |
"decompress-response": { | |
"version": "4.2.1", | |
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", | |
"integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", | |
"requires": { | |
"mimic-response": "^2.0.0" | |
} | |
}, | |
"deep-extend": { | |
"version": "0.6.0", | |
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | |
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" | |
}, | |
"delayed-stream": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | |
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", | |
"dev": true | |
}, | |
"delegates": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | |
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" | |
}, | |
"denque": { | |
"version": "1.5.0", | |
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", | |
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" | |
}, | |
"detect-libc": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | |
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" | |
}, | |
"end-of-stream": { | |
"version": "1.4.4", | |
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", | |
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", | |
"requires": { | |
"once": "^1.4.0" | |
} | |
}, | |
"expand-template": { | |
"version": "2.0.3", | |
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", | |
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" | |
}, | |
"file-uri-to-path": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", | |
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" | |
}, | |
"form-data": { | |
"version": "3.0.1", | |
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", | |
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", | |
"dev": true, | |
"requires": { | |
"asynckit": "^0.4.0", | |
"combined-stream": "^1.0.8", | |
"mime-types": "^2.1.12" | |
} | |
}, | |
"fs-constants": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", | |
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" | |
}, | |
"fs-extra": { | |
"version": "10.0.0", | |
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", | |
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", | |
"requires": { | |
"graceful-fs": "^4.2.0", | |
"jsonfile": "^6.0.1", | |
"universalify": "^2.0.0" | |
} | |
}, | |
"fs-minipass": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", | |
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", | |
"requires": { | |
"minipass": "^3.0.0" | |
} | |
}, | |
"gauge": { | |
"version": "2.7.4", | |
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", | |
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | |
"requires": { | |
"aproba": "^1.0.3", | |
"console-control-strings": "^1.0.0", | |
"has-unicode": "^2.0.0", | |
"object-assign": "^4.1.0", | |
"signal-exit": "^3.0.0", | |
"string-width": "^1.0.1", | |
"strip-ansi": "^3.0.1", | |
"wide-align": "^1.1.0" | |
} | |
}, | |
"generate-function": { | |
"version": "2.3.1", | |
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", | |
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", | |
"requires": { | |
"is-property": "^1.0.2" | |
} | |
}, | |
"github-from-package": { | |
"version": "0.0.0", | |
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", | |
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" | |
}, | |
"graceful-fs": { | |
"version": "4.2.6", | |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", | |
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" | |
}, | |
"has-unicode": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", | |
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" | |
}, | |
"iconv-lite": { | |
"version": "0.6.3", | |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", | |
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", | |
"requires": { | |
"safer-buffer": ">= 2.1.2 < 3.0.0" | |
} | |
}, | |
"ieee754": { | |
"version": "1.2.1", | |
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | |
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" | |
}, | |
"inherits": { | |
"version": "2.0.4", | |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | |
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | |
}, | |
"ini": { | |
"version": "1.3.8", | |
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", | |
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" | |
}, | |
"is-fullwidth-code-point": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", | |
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | |
"requires": { | |
"number-is-nan": "^1.0.0" | |
} | |
}, | |
"is-property": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", | |
"integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" | |
}, | |
"isarray": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | |
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | |
}, | |
"jsonfile": { | |
"version": "6.1.0", | |
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", | |
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", | |
"requires": { | |
"graceful-fs": "^4.1.6", | |
"universalify": "^2.0.0" | |
} | |
}, | |
"long": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", | |
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" | |
}, | |
"lru-cache": { | |
"version": "6.0.0", | |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", | |
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", | |
"requires": { | |
"yallist": "^4.0.0" | |
} | |
}, | |
"luxon": { | |
"version": "1.27.0", | |
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.27.0.tgz", | |
"integrity": "sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==" | |
}, | |
"mime-db": { | |
"version": "1.48.0", | |
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", | |
"integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", | |
"dev": true | |
}, | |
"mime-types": { | |
"version": "2.1.31", | |
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", | |
"integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", | |
"dev": true, | |
"requires": { | |
"mime-db": "1.48.0" | |
} | |
}, | |
"mimic-response": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", | |
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" | |
}, | |
"minimist": { | |
"version": "1.2.5", | |
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | |
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" | |
}, | |
"minipass": { | |
"version": "3.1.3", | |
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", | |
"integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", | |
"requires": { | |
"yallist": "^4.0.0" | |
} | |
}, | |
"minizlib": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", | |
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", | |
"requires": { | |
"minipass": "^3.0.0", | |
"yallist": "^4.0.0" | |
} | |
}, | |
"mkdirp": { | |
"version": "1.0.4", | |
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", | |
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" | |
}, | |
"mkdirp-classic": { | |
"version": "0.5.3", | |
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", | |
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" | |
}, | |
"mysql2": { | |
"version": "2.2.5", | |
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", | |
"integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", | |
"requires": { | |
"denque": "^1.4.1", | |
"generate-function": "^2.3.1", | |
"iconv-lite": "^0.6.2", | |
"long": "^4.0.0", | |
"lru-cache": "^6.0.0", | |
"named-placeholders": "^1.1.2", | |
"seq-queue": "^0.0.5", | |
"sqlstring": "^2.3.2" | |
} | |
}, | |
"named-placeholders": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", | |
"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", | |
"requires": { | |
"lru-cache": "^4.1.3" | |
}, | |
"dependencies": { | |
"lru-cache": { | |
"version": "4.1.5", | |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", | |
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", | |
"requires": { | |
"pseudomap": "^1.0.2", | |
"yallist": "^2.1.2" | |
} | |
}, | |
"yallist": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | |
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" | |
} | |
} | |
}, | |
"napi-build-utils": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", | |
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" | |
}, | |
"node-abi": { | |
"version": "2.30.0", | |
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", | |
"integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", | |
"requires": { | |
"semver": "^5.4.1" | |
} | |
}, | |
"node-fetch": { | |
"version": "2.6.1", | |
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", | |
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" | |
}, | |
"npmlog": { | |
"version": "4.1.2", | |
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", | |
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | |
"requires": { | |
"are-we-there-yet": "~1.1.2", | |
"console-control-strings": "~1.1.0", | |
"gauge": "~2.7.3", | |
"set-blocking": "~2.0.0" | |
} | |
}, | |
"number-is-nan": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", | |
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" | |
}, | |
"object-assign": { | |
"version": "4.1.1", | |
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | |
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" | |
}, | |
"once": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |
"requires": { | |
"wrappy": "1" | |
} | |
}, | |
"prebuild-install": { | |
"version": "6.1.3", | |
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", | |
"integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", | |
"requires": { | |
"detect-libc": "^1.0.3", | |
"expand-template": "^2.0.3", | |
"github-from-package": "0.0.0", | |
"minimist": "^1.2.3", | |
"mkdirp-classic": "^0.5.3", | |
"napi-build-utils": "^1.0.1", | |
"node-abi": "^2.21.0", | |
"npmlog": "^4.0.1", | |
"pump": "^3.0.0", | |
"rc": "^1.2.7", | |
"simple-get": "^3.0.3", | |
"tar-fs": "^2.0.0", | |
"tunnel-agent": "^0.6.0" | |
} | |
}, | |
"process-nextick-args": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | |
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | |
}, | |
"pseudomap": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", | |
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" | |
}, | |
"pump": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", | |
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", | |
"requires": { | |
"end-of-stream": "^1.1.0", | |
"once": "^1.3.1" | |
} | |
}, | |
"rc": { | |
"version": "1.2.8", | |
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | |
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | |
"requires": { | |
"deep-extend": "^0.6.0", | |
"ini": "~1.3.0", | |
"minimist": "^1.2.0", | |
"strip-json-comments": "~2.0.1" | |
} | |
}, | |
"readable-stream": { | |
"version": "2.3.7", | |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | |
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | |
"requires": { | |
"core-util-is": "~1.0.0", | |
"inherits": "~2.0.3", | |
"isarray": "~1.0.0", | |
"process-nextick-args": "~2.0.0", | |
"safe-buffer": "~5.1.1", | |
"string_decoder": "~1.1.1", | |
"util-deprecate": "~1.0.1" | |
} | |
}, | |
"safe-buffer": { | |
"version": "5.1.2", | |
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | |
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | |
}, | |
"safer-buffer": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | |
}, | |
"semver": { | |
"version": "5.7.1", | |
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | |
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" | |
}, | |
"seq-queue": { | |
"version": "0.0.5", | |
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", | |
"integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" | |
}, | |
"set-blocking": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", | |
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" | |
}, | |
"signal-exit": { | |
"version": "3.0.3", | |
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", | |
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" | |
}, | |
"simple-concat": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", | |
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" | |
}, | |
"simple-get": { | |
"version": "3.1.0", | |
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", | |
"integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", | |
"requires": { | |
"decompress-response": "^4.2.0", | |
"once": "^1.3.1", | |
"simple-concat": "^1.0.0" | |
} | |
}, | |
"sqlstring": { | |
"version": "2.3.2", | |
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", | |
"integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" | |
}, | |
"string_decoder": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | |
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | |
"requires": { | |
"safe-buffer": "~5.1.0" | |
} | |
}, | |
"string-width": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", | |
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | |
"requires": { | |
"code-point-at": "^1.0.0", | |
"is-fullwidth-code-point": "^1.0.0", | |
"strip-ansi": "^3.0.0" | |
} | |
}, | |
"strip-ansi": { | |
"version": "3.0.1", | |
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | |
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | |
"requires": { | |
"ansi-regex": "^2.0.0" | |
} | |
}, | |
"strip-json-comments": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | |
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" | |
}, | |
"tar": { | |
"version": "6.1.10", | |
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", | |
"integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", | |
"requires": { | |
"chownr": "^2.0.0", | |
"fs-minipass": "^2.0.0", | |
"minipass": "^3.0.0", | |
"minizlib": "^2.1.1", | |
"mkdirp": "^1.0.3", | |
"yallist": "^4.0.0" | |
} | |
}, | |
"tar-fs": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", | |
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", | |
"requires": { | |
"chownr": "^1.1.1", | |
"mkdirp-classic": "^0.5.2", | |
"pump": "^3.0.0", | |
"tar-stream": "^2.1.4" | |
}, | |
"dependencies": { | |
"chownr": { | |
"version": "1.1.4", | |
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", | |
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" | |
} | |
} | |
}, | |
"tar-stream": { | |
"version": "2.2.0", | |
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", | |
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", | |
"requires": { | |