1
0
mirror of https://github.com/barthuijgen/factorio-sites.git synced 2025-10-08 23:41:56 +02:00

feat: added pulumi infra and fixed thumbnail render function

This commit is contained in:
Bart
2021-12-06 23:51:12 +01:00
parent cb5fcc81d4
commit 8f2295c4f1
18 changed files with 627 additions and 70 deletions

2
.gitignore vendored
View File

@@ -46,3 +46,5 @@ Thumbs.db
.local.env
.env
local.readme.md
/bin/

View File

@@ -1,20 +0,0 @@
{
"name": "blueprint-image-function",
"version": "0.0.1",
"scripts": {
"postinstall": "yarn prisma generate"
},
"dependencies": {
"puppeteer": "7.1.0",
"tslib": "2.1.0",
"sharp": "0.27.2",
"prisma": "2.18.0",
"@prisma/client": "2.18.0",
"@google-cloud/pubsub": "2.9.0",
"@google-cloud/secret-manager": "3.4.0",
"@google-cloud/storage": "5.7.4",
"cookie": "0.4.1",
"pako": "1.0.11",
"bcrypt": "5.0.0"
}
}

View File

@@ -0,0 +1,24 @@
console.log("POST BUILD SCRIPT", __dirname);
/*
yarn nx build blueprint-image-function
1. Add to package.json
"scripts": {
"postinstall": "yarn prisma generate"
},
2. Add to dependencies
"prisma": "3.6.0",
2. Replace prisma generate header
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "debian-openssl-1.1.x"]
}
*/

View File

@@ -0,0 +1,83 @@
import * as phin from "phin";
import {
getBlueprintById,
hasBlueprintImage,
saveBlueprintImage,
init,
} from "@factorio-sites/database";
import { jsonReplaceErrors } from "@factorio-sites/node-utils";
import { optimise } from "./image-optimiser";
// {"blueprintId":"ee9b98eb-313a-4401-8aee-d6e970b76aad"}
// ^ image_hash: 6f78c0a93c20fe99076e8defe4e396923f42753b
/** message body for pubsub triggered function */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Message = Record<string, any>;
/** context for pubsub triggered function */
interface Context {
eventId: string;
eventType: string;
timestamp: string;
resource: { service: string; name: string };
}
type PubSubHandler = (
message: Message,
context: Context,
callback: (error?: string) => void
) => void;
export const functionPubSubHandler: PubSubHandler = async (message, _context, callback) => {
const error = (message: string, data: Record<string, unknown> = {}) => {
console.error(JSON.stringify({ message, ...data }, jsonReplaceErrors));
callback(message);
};
const log = (message: string, data: Record<string, unknown> = {}) => {
console.log(JSON.stringify({ message, ...data }));
};
try {
const data = message.data
? JSON.parse(Buffer.from(message.data, "base64").toString())
: message;
const blueprintId = data.blueprintId;
if (!blueprintId) {
return error("No blueprintId in body");
}
await init();
const blueprint = await getBlueprintById(blueprintId);
if (!blueprint) {
return error(`Blueprint ${blueprintId} not found`);
}
if (await hasBlueprintImage(blueprint.image_hash, "300")) {
log(`Image already exists ${blueprint.image_hash}`);
return callback();
}
console.log(`Fetching https://fbsr.factorio.workers.dev/${blueprint.blueprint_hash}?size=300`);
const response = await phin(
`https://fbsr.factorio.workers.dev/${blueprint.blueprint_hash}?size=300`
);
const image = response.body;
console.log("Image fetched");
// Make thumbnail, max size 300px
const min_image = await optimise(image, 300);
await saveBlueprintImage(blueprint.image_hash, min_image, "300");
log(`Saved image with image hash ${blueprint.image_hash}`);
// await saveBlueprintImage(blueprint.image_hash, image, "original");
callback();
} catch (reason) {
error(`Error rendering image ${reason}`, { error: reason });
}
};

View File

@@ -58,7 +58,7 @@ export const functionHttpHandler: Handler = async (req, res) => {
}
if (await hasBlueprintImage(blueprint.image_hash, "300")) {
return res.status(200).send("Image already exists");
return res.status(200).send(`Image already exists ${blueprint.image_hash}`);
}
const blueprint_string = await getBlueprintStringByHash(blueprint.blueprint_hash);
@@ -75,7 +75,7 @@ export const functionHttpHandler: Handler = async (req, res) => {
await saveBlueprintImage(blueprint.image_hash, min_image, "300");
res.status(200).send("Done");
} catch (reason) {
} catch (reason: any) {
res.status(500).send(`Error rendering image ${reason.stack || reason}`);
}
};
@@ -100,13 +100,11 @@ export const functionPubSubHandler: PubSubHandler = async (message, _context, ca
return error("No blueprintId in body");
}
log(`generating image for ${blueprintId}`);
await init();
const blueprint = await getBlueprintById(blueprintId);
if (!blueprint) {
return error("Blueprint not found");
return error(`Blueprint ${blueprintId} not found`);
}
if (await hasBlueprintImage(blueprint.image_hash, "300")) {
@@ -114,6 +112,8 @@ export const functionPubSubHandler: PubSubHandler = async (message, _context, ca
return callback();
}
log(`generating image for ${blueprintId}`);
const blueprint_string = await getBlueprintStringByHash(blueprint.blueprint_hash);
if (!blueprint_string) {
return error("Blueprint string not found");

View File

@@ -1,11 +1,8 @@
import { functionHttpHandler, functionPubSubHandler } from "./function-handler";
// import { local_test } from "./local-test";
// import { functionHttpHandler, functionPubSubHandler } from "./function-handler";
import { functionPubSubHandler } from "./fetch-handlers";
// import { rePublishAllBlueprints } from "./republish-pubsub";
// import { subscribeToPubSub } from "./pubsub-render";
// subscribeToPubSub().catch((reason) => console.error("Fatal error:", reason));
// rePublishAllBlueprints().catch((reason) => console.error("Fatal error:", reason));
exports.renderImageHttp = functionHttpHandler;
// exports.renderImageHttp = functionHttpHandler;
exports.renderImagePubSub = functionPubSubHandler;
// local_test("8737437e-f15b-459c-8c1d-d0074f3a89ca");
// rePublishAllBlueprints();

View File

@@ -60,7 +60,7 @@ export async function subscribeToPubSub() {
await saveBlueprintImage(blueprint.image_hash, min_image, "300");
return ack("[pubsub] image saved", true);
} catch (reason) {
} catch (reason: any) {
return ack(`[pubsub:error] ${reason.stack || reason}`, false);
}
};

View File

@@ -1,22 +1,70 @@
// import { getBlueprintImageRequestTopic, getPaginatedBlueprints } from "@factorio-sites/database";
import {
getBlueprintBookById,
getBlueprintById,
getBlueprintImageRequestTopic,
hasBlueprintImage,
init,
searchBlueprintPages,
} from "@factorio-sites/database";
import { getFirstBlueprintFromChildTree } from "@factorio-sites/node-utils";
import { BlueprintPage } from "@factorio-sites/types";
// export async function rePublishAllBlueprints() {
// const topic = getBlueprintImageRequestTopic();
// const fetchPage = async (page = 1) => {
// const blueprints = await getPaginatedBlueprints(page);
// if (blueprints.length === 0) {
// return console.log("No more blueprints found");
// }
// console.log(`Publishing page ${page} with ${blueprints.length} blueprints`);
const perPage = 10;
const pageLimit = 99;
// await Promise.all(
// blueprints.map((blueprint) => {
// return topic.publishJSON({ blueprintId: blueprint.id });
// })
// );
// fetchPage(page + 1);
// };
// await fetchPage();
// }
async function getBlueprintPageFirstBlueprint(page: BlueprintPage) {
if (page.blueprint_id) {
return getBlueprintById(page.blueprint_id);
} else if (page.blueprint_book_id) {
const book = await getBlueprintBookById(page.blueprint_book_id);
if (!book) return null;
const blueprint = getFirstBlueprintFromChildTree(book.child_tree);
return getBlueprintById(blueprint);
}
return null;
}
export {};
export async function rePublishAllBlueprints() {
const topic = getBlueprintImageRequestTopic();
if (!topic) throw Error("Topic not found");
let exists = 0;
let published = 0;
await init();
const fetchPage = async (page = 1) => {
const blueprintPages = await searchBlueprintPages({
page,
perPage,
mode: "AND",
order: "date",
});
if (blueprintPages.rows.length === 0) {
return console.log("No more blueprints found");
}
console.log(`Publishing page ${page} with ${blueprintPages.rows.length} blueprints`);
await Promise.all(
blueprintPages.rows.map(async (blueprintPage) => {
const blueprint = await getBlueprintPageFirstBlueprint(blueprintPage);
if (!blueprint) {
console.log(`Error: blueprint not found for page ${blueprintPage.id}`);
return;
}
if (await hasBlueprintImage(blueprint.image_hash, "300")) {
exists++;
return;
}
published++;
return topic.publishMessage({ json: { blueprintId: blueprint.id } });
})
);
if (page < pageLimit) await fetchPage(page + 1);
};
await fetchPage();
console.log(`done fetching, ${exists} already existed, ${published} published`);
}

View File

@@ -18,7 +18,7 @@ const mapBlueprintInstanceToEntry = (entity: BlueprintModel): Blueprint => ({
created_at: entity.created_at && entity.created_at.getTime() / 1000,
updated_at: entity.updated_at && entity.updated_at.getTime() / 1000,
game_version: entity.game_version || null,
data: (entity.data as unknown) as DbBlueprintData,
data: entity.data as unknown as DbBlueprintData,
});
export async function getBlueprintById(id: string): Promise<Blueprint | null> {
@@ -31,6 +31,17 @@ export async function getBlueprintByHash(hash: string): Promise<Blueprint | null
return result ? mapBlueprintInstanceToEntry(result) : null;
}
export async function getPaginatedBlueprints({
skip = 0,
take = 30,
}: {
skip: number;
take: number;
}): Promise<Blueprint[]> {
const results = await prisma.blueprint.findMany({ skip, take });
return results.map(mapBlueprintInstanceToEntry);
}
export async function createBlueprint(
blueprint: BlueprintData,
extraInfo: {

View File

@@ -119,6 +119,8 @@
"ts-node": "10.4.0",
"tslint": "6.1.3",
"typescript": "4.5.2",
"wasm-loader": "1.3.0"
"wasm-loader": "1.3.0",
"@pulumi/pulumi": "3.0.0",
"@pulumi/gcp": "5.0.0"
}
}

2
pulumi/Pulumi.dev.yaml Normal file
View File

@@ -0,0 +1,2 @@
config:
gcp:project: factorio-sites-dev

View File

@@ -0,0 +1,2 @@
config:
gcp:project: factorio-sites

3
pulumi/Pulumi.yaml Normal file
View File

@@ -0,0 +1,3 @@
name: factorio-sites
runtime: nodejs
description: Factorio blueprints mono repo

66
pulumi/dev.index.ts Normal file
View File

@@ -0,0 +1,66 @@
import * as path from "path";
import * as dotenv from "dotenv";
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
dotenv.config({ path: path.join(__dirname, ".env") });
const account = new gcp.serviceaccount.Account("factorio-blueprints", {
accountId: "factorio-blueprints",
displayName: "Factorio blueprints service account",
});
// Can't get service account roles sorted, manual steps
// 1. Add a member in IAM with the same email as the service account
// 2. Assign roles to that member in IAM
// Roles used: Pub/Sub Editor, Secret Manager Secret Accessor, Storage Object Admin
const postgresPasswordSecret = new gcp.secretmanager.Secret("prd-postgres-password", {
replication: { automatic: true },
secretId: "prd-postgres-password",
});
const postgresPasswordSecretVersion = new gcp.secretmanager.SecretVersion(
"prd-postgres-password-version",
{
secret: postgresPasswordSecret.id,
secretData: process.env.DATABASE_PASSWORD,
}
);
const functionsBucket = new gcp.storage.Bucket("blueprint-thumbnail-render-code", {
storageClass: "STANDARD",
location: "EUROPE-WEST1",
});
const blueprintImagesBucket = new gcp.storage.Bucket("blueprint-thumbnail-images", {
storageClass: "STANDARD",
location: "EUROPE-WEST1",
});
const archive = new gcp.storage.BucketObject("archive", {
bucket: functionsBucket.name,
source: new pulumi.asset.FileArchive("../dist/apps/blueprint-image-function"),
});
const renderTopic = new gcp.pubsub.Topic("blueprint-thumbnail-render");
new gcp.cloudfunctions.Function("blueprint-image-render", {
eventTrigger: {
eventType: "google.pubsub.topic.publish",
resource: renderTopic.name,
},
sourceArchiveBucket: functionsBucket.name,
sourceArchiveObject: archive.name,
entryPoint: "renderImagePubSub",
runtime: "nodejs14",
region: "europe-west1",
timeout: 60,
environmentVariables: {
POSTGRES_DB: "factorio-blueprints",
POSTGRES_USER: "factorio-blueprints",
POSTGRES_HOST: process.env.POSTGRES_HOST,
POSTGRES_PASSWORD: postgresPasswordSecretVersion.id,
GCP_BLUEPRINT_IMAGES_BUCKET: blueprintImagesBucket.id,
},
serviceAccountEmail: account.email,
});

66
pulumi/index.ts Normal file
View File

@@ -0,0 +1,66 @@
import * as path from "path";
import * as dotenv from "dotenv";
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
dotenv.config({ path: path.join(__dirname, ".env") });
// const account = new gcp.serviceaccount.Account("factorio-blueprints", {
// accountId: "factorio-blueprints",
// displayName: "Factorio blueprints service account",
// });
// Can't get service account roles sorted, manual steps
// 1. Add a member in IAM with the same email as the service account
// 2. Assign roles to that member in IAM
// Roles used: Pub/Sub Editor, Secret Manager Secret Accessor, Storage Object Admin
// const postgresPasswordSecret = new gcp.secretmanager.Secret("prd-postgres-password", {
// replication: { automatic: true },
// secretId: "prd-postgres-password",
// });
// const postgresPasswordSecretVersion = new gcp.secretmanager.SecretVersion(
// "prd-postgres-password-version",
// {
// secret: postgresPasswordSecret.id,
// secretData: process.env.DATABASE_PASSWORD,
// }
// );
const functionsBucket = new gcp.storage.Bucket("blueprint-thumbnail-render-code", {
storageClass: "STANDARD",
location: "EUROPE-WEST1",
});
// const blueprintImagesBucket = new gcp.storage.Bucket("blueprint-thumbnail-images", {
// storageClass: "STANDARD",
// location: "EUROPE-WEST1",
// });
const archive = new gcp.storage.BucketObject("archive", {
bucket: functionsBucket.name,
source: new pulumi.asset.FileArchive("../dist/apps/blueprint-image-function"),
});
// const renderTopic = new gcp.pubsub.Topic("blueprint-thumbnail-render");
new gcp.cloudfunctions.Function("blueprint-image-render", {
eventTrigger: {
eventType: "google.pubsub.topic.publish",
resource: process.env.IMAGE_RENDER_TOPIC,
},
sourceArchiveBucket: functionsBucket.name,
sourceArchiveObject: archive.name,
entryPoint: "renderImagePubSub",
runtime: "nodejs14",
region: "europe-west1",
timeout: 60,
environmentVariables: {
POSTGRES_DB: "factorio-blueprints",
POSTGRES_USER: "factorio-blueprints",
POSTGRES_HOST: process.env.POSTGRES_HOST,
POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD,
GCP_BLUEPRINT_IMAGES_BUCKET: "blueprint-images",
},
serviceAccountEmail: process.env.RENDER_FUNCTION_SERVICE_ACCOUNT,
});

13
pulumi/package.json Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "factorio-sites",
"version": "0.0.0",
"license": "MIT",
"private": true,
"scripts": {
"pulumi:up": "pulumi up"
},
"devDependencies": {
"@pulumi/pulumi": "^3.0.0",
"@pulumi/gcp": "^5.0.0"
}
}

View File

@@ -14,7 +14,14 @@
"outputPath": "dist/apps/blueprint-image-function",
"main": "apps/blueprint-image-function/src/main.ts",
"tsConfig": "apps/blueprint-image-function/tsconfig.app.json",
"assets": []
"assets": [
{
"input": "apps/blueprints/prisma",
"glob": "schema.prisma",
"output": "./prisma"
}
],
"generatePackageJson": true
},
"configurations": {
"production": {

279
yarn.lock
View File

@@ -3026,14 +3026,7 @@
stream-events "^1.0.1"
xdg-basedir "^4.0.0"
"@grpc/grpc-js@~1.3.0":
version "1.3.8"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.8.tgz#0d7dce9de7aeb20702a28f0704e61b0bf34061c1"
integrity sha512-4qJqqn+CU/nBydz9ePJP+oa8dz0U42Ut/GejlbyaQ1xTkynCc+ndNHHnISlNeHawDsv4MOAyP3mV/EnDNUw2zA==
dependencies:
"@types/node" ">=12.12.47"
"@grpc/grpc-js@~1.4.0":
"@grpc/grpc-js@^1.2.7", "@grpc/grpc-js@~1.4.0":
version "1.4.4"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.4.4.tgz#59336f13d77bc446bbdf2161564a32639288dc5b"
integrity sha512-a6222b7Dl6fIlMgzVl7e+NiRoLiZFbpcwvBH2Oli56Bn7W4/3Ld+86hK4ffPn5rx2DlDidmIcvIJiOQXyhv9gA==
@@ -3041,6 +3034,13 @@
"@grpc/proto-loader" "^0.6.4"
"@types/node" ">=12.12.47"
"@grpc/grpc-js@~1.3.0", "@grpc/grpc-js@~1.3.8":
version "1.3.8"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.8.tgz#0d7dce9de7aeb20702a28f0704e61b0bf34061c1"
integrity sha512-4qJqqn+CU/nBydz9ePJP+oa8dz0U42Ut/GejlbyaQ1xTkynCc+ndNHHnISlNeHawDsv4MOAyP3mV/EnDNUw2zA==
dependencies:
"@types/node" ">=12.12.47"
"@grpc/proto-loader@^0.6.1", "@grpc/proto-loader@^0.6.4":
version "0.6.7"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.7.tgz#e62a202f4cf5897bdd0e244dec1dbc80d84bdfa1"
@@ -3420,6 +3420,11 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
"@logdna/tail-file@^2.0.6":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@logdna/tail-file/-/tail-file-2.1.0.tgz#7c3d98c3378d15061589e12875ffb7673b0ce82c"
integrity sha512-8zYzetB1zfa7WA4c0RS1EU9pNKcj1BqilU2fCsEvmKfWgEdpaphff6hk2Rcn3A0qHwynEdw9lTrlYN4sUw2FpA==
"@mapbox/node-pre-gyp@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.1.tgz#1b23a8decb5e6356b04770d586067d2bff2703dd"
@@ -4331,6 +4336,63 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@pulumi/gcp@5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@pulumi/gcp/-/gcp-5.0.0.tgz#094ede098d3ae33461cf016ed7219849e0484ee0"
integrity sha512-8/d4RRaSDOcG3P92XD0KIgBdLS9yozyiJXqpwvzErhp6c2UMnAAlLqymC5hpVKoa6tHBXPm0ZH3qmsx+3HEE6Q==
dependencies:
"@pulumi/pulumi" "^3.0.0"
"@types/express" "^4.16.0"
read-package-json "^2.0.13"
"@pulumi/pulumi@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@pulumi/pulumi/-/pulumi-3.0.0.tgz#b1a1a845718b21d3b4975740627f5b25f2c04fcb"
integrity sha512-s9pwbdFrMU8vt4F5aIf8cpnDmHSM5Pn5V2Y7T7m0R14pfxTjCqt5ZAuEdKys0SgL+DxDp5L4Kz/53SXC6MFEEw==
dependencies:
"@grpc/grpc-js" "^1.2.7"
"@logdna/tail-file" "^2.0.6"
"@pulumi/query" "^0.3.0"
google-protobuf "^3.5.0"
js-yaml "^3.14.0"
minimist "^1.2.0"
normalize-package-data "^2.4.0"
protobufjs "^6.8.6"
read-package-tree "^5.3.1"
require-from-string "^2.0.1"
semver "^6.1.0"
source-map-support "^0.4.16"
split2 "^3.2.2"
ts-node "^7.0.1"
typescript "~3.7.3"
upath "^1.1.0"
"@pulumi/pulumi@^3.0.0":
version "3.19.0"
resolved "https://registry.yarnpkg.com/@pulumi/pulumi/-/pulumi-3.19.0.tgz#2df5612daca39c906caac939c9c2fe45e9c07578"
integrity sha512-e5RJkoS1G38sf18jJJkIC4R24zQSAwEBNypAtOUKUG2f+bwqhrm+eZ3yF+CUjY5c4ZgWCmVftJcV4LGG3rphyQ==
dependencies:
"@grpc/grpc-js" "~1.3.8"
"@logdna/tail-file" "^2.0.6"
"@pulumi/query" "^0.3.0"
google-protobuf "^3.5.0"
js-yaml "^3.14.0"
minimist "^1.2.0"
normalize-package-data "^2.4.0"
protobufjs "^6.8.6"
read-package-tree "^5.3.1"
require-from-string "^2.0.1"
semver "^6.1.0"
source-map-support "^0.4.16"
ts-node "^7.0.1"
typescript "~3.7.3"
upath "^1.1.0"
"@pulumi/query@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@pulumi/query/-/query-0.3.0.tgz#f496608e86a18c3dd31b6c533408e2441c29071d"
integrity sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==
"@reach/alert@0.13.2":
version "0.13.2"
resolved "https://registry.yarnpkg.com/@reach/alert/-/alert-0.13.2.tgz#71c4a848d51341f1d6d9eaae060975391c224870"
@@ -4671,6 +4733,14 @@
dependencies:
"@types/node" "*"
"@types/body-parser@*":
version "1.19.2"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
dependencies:
"@types/connect" "*"
"@types/node" "*"
"@types/codemirror@0.0.109":
version "0.0.109"
resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.109.tgz#89d575ff1c7b462c4c3b8654f8bb38e5622e9036"
@@ -4678,6 +4748,13 @@
dependencies:
"@types/tern" "*"
"@types/connect@*":
version "3.4.35"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
dependencies:
"@types/node" "*"
"@types/cookie@0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
@@ -4738,6 +4815,25 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
"@types/express-serve-static-core@^4.17.18":
version "4.17.26"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz#5d9a8eeecb9d5f9d7fc1d85f541512a84638ae88"
integrity sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==
dependencies:
"@types/node" "*"
"@types/qs" "*"
"@types/range-parser" "*"
"@types/express@^4.16.0":
version "4.17.13"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
dependencies:
"@types/body-parser" "*"
"@types/express-serve-static-core" "^4.17.18"
"@types/qs" "*"
"@types/serve-static" "*"
"@types/fs-extra@^8.0.1":
version "8.1.1"
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.1.tgz#1e49f22d09aa46e19b51c0b013cb63d0d923a068"
@@ -4858,6 +4954,11 @@
resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
"@types/mime@^1":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -4940,6 +5041,16 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
"@types/qs@*":
version "6.9.7"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
"@types/range-parser@*":
version "1.2.4"
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
"@types/react-dom@17.0.11":
version "17.0.11"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466"
@@ -4988,6 +5099,14 @@
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==
"@types/serve-static@*":
version "1.13.10"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
dependencies:
"@types/mime" "^1"
"@types/node" "*"
"@types/sharp@0.29.4":
version "0.29.4"
resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.29.4.tgz#e47d8677befc9944d4b9d76ed837452814166de0"
@@ -5696,11 +5815,21 @@ array.prototype.flatmap@^1.2.5:
define-properties "^1.1.3"
es-abstract "^1.19.0"
arrify@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
arrify@^2.0.0, arrify@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
asap@^2.0.0:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
asn1.js@^5.2.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
@@ -6318,6 +6447,11 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
buffer-from@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer-from@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
@@ -7441,6 +7575,11 @@ debug@~3.1.0:
dependencies:
ms "2.0.0"
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -7608,6 +7747,14 @@ devtools-protocol@0.0.937139:
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.937139.tgz#bdee3751fdfdb81cb701fd3afa94b1065dafafcf"
integrity sha512-daj+rzR3QSxsPRy5vjjthn58axO8c11j58uY0lG5vvlJk/EiOdCWOptGdkXDjtuRHr78emKq0udHCXM4trhoDQ==
dezalgo@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
dependencies:
asap "^2.0.0"
wrappy "1"
diff-sequences@^27.0.6:
version "27.0.6"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723"
@@ -7618,6 +7765,11 @@ diff-sequences@^27.4.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==
diff@^3.1.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
@@ -9444,6 +9596,11 @@ google-p12-pem@^3.0.3:
dependencies:
node-forge "^0.10.0"
google-protobuf@^3.5.0:
version "3.19.1"
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.1.tgz#5af5390e8206c446d8f49febaffd4b7f4ac28f41"
integrity sha512-Isv1RlNC+IzZzilcxnlVSf+JvuhxmY7DaxYCBy+zPS9XVuJRtlTTIXR9hnZ1YL1MMusJn/7eSy2swCzZIomQSg==
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
@@ -11282,6 +11439,14 @@ js-yaml@^3.13.1, js-yaml@^3.9.0:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@^3.14.0:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -12292,7 +12457,7 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1:
mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -12540,7 +12705,7 @@ nopt@^5.0.0:
dependencies:
abbrev "1"
normalize-package-data@^2.3.2:
normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -12565,6 +12730,11 @@ normalize-url@^6.0.1:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
npm-normalize-package-bin@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-run-all@^4.1.5:
version "4.1.5"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
@@ -12739,6 +12909,15 @@ object.fromentries@^2.0.5:
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.getownpropertydescriptors@^2.0.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.getownpropertydescriptors@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
@@ -13830,7 +14009,7 @@ proto3-json-serializer@^0.1.1, proto3-json-serializer@^0.1.5:
dependencies:
protobufjs "^6.11.2"
protobufjs@6.11.2, protobufjs@^6.10.0, protobufjs@^6.11.2:
protobufjs@6.11.2, protobufjs@^6.10.0, protobufjs@^6.11.2, protobufjs@^6.8.6:
version "6.11.2"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b"
integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==
@@ -14199,6 +14378,25 @@ read-cache@^1.0.0:
dependencies:
pify "^2.3.0"
read-package-json@^2.0.0, read-package-json@^2.0.13:
version "2.1.2"
resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a"
integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==
dependencies:
glob "^7.1.1"
json-parse-even-better-errors "^2.3.0"
normalize-package-data "^2.0.0"
npm-normalize-package-bin "^1.0.0"
read-package-tree@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636"
integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==
dependencies:
read-package-json "^2.0.0"
readdir-scoped-modules "^1.0.0"
util-promisify "^2.1.0"
read-pkg-up@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@@ -14257,6 +14455,16 @@ readable-stream@~1.0.17, readable-stream@~1.0.27-1:
isarray "0.0.1"
string_decoder "~0.10.x"
readdir-scoped-modules@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
dependencies:
debuglog "^1.0.1"
dezalgo "^1.0.0"
graceful-fs "^4.1.2"
once "^1.3.0"
readdirp@~3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
@@ -14748,7 +14956,7 @@ semver@7.3.4, semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4:
dependencies:
lru-cache "^6.0.0"
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -15005,6 +15213,13 @@ source-map-support@0.5.19, source-map-support@^0.5.17, source-map-support@^0.5.6
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map-support@^0.4.16:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
dependencies:
source-map "^0.5.6"
source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
@@ -15025,7 +15240,7 @@ source-map@0.8.0-beta.0:
dependencies:
whatwg-url "^7.0.0"
source-map@^0.5.0, source-map@^0.5.7:
source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -15106,7 +15321,7 @@ split-array-stream@^2.0.0:
dependencies:
is-stream-ended "^0.1.4"
split2@^3.1.1:
split2@^3.1.1, split2@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
@@ -15880,6 +16095,20 @@ ts-node@10.4.0:
make-error "^1.1.1"
yn "3.1.1"
ts-node@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf"
integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==
dependencies:
arrify "^1.0.0"
buffer-from "^1.1.0"
diff "^3.1.0"
make-error "^1.1.1"
minimist "^1.2.0"
mkdirp "^0.5.1"
source-map-support "^0.5.6"
yn "^2.0.0"
ts-node@^9.1.1, ts-node@~9.1.1:
version "9.1.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d"
@@ -16045,6 +16274,11 @@ typescript@4.5.2:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
typescript@~3.7.3:
version "3.7.7"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.7.tgz#c931733e2ec10dda56b855b379cc488a72a81199"
integrity sha512-MmQdgo/XenfZPvVLtKZOq9jQQvzaUAUpcKW8Z43x9B2fOm4S5g//tPtMweZUIP+SoBqrVPEIm+dJeQ9dfO0QdA==
typo-js@*:
version "1.2.1"
resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.1.tgz#334a0d8c3f6c56f2f1e15fdf6c31677793cbbe9b"
@@ -16219,6 +16453,11 @@ untildify@^4.0.0:
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
upath@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
uri-js@^4.2.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
@@ -16286,6 +16525,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
util-promisify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53"
integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=
dependencies:
object.getownpropertydescriptors "^2.0.3"
util.promisify@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
@@ -16934,6 +17180,11 @@ yn@3.1.1:
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
yn@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"