From 9a4c2a8664d2204ef05e466cf4ff6b39efa8df3e Mon Sep 17 00:00:00 2001 From: zhiyan114 Date: Tue, 8 Oct 2024 14:44:34 -0400 Subject: [PATCH 1/5] src optimization --- src/commands/discord/tbypass.ts | 4 ++++ src/commands/discord/tverify.ts | 5 ++++ src/commands/twitch/link.ts | 3 +++ src/core/DiscordClient.ts | 41 ++++++++++++++++++--------------- src/events/index.ts | 18 ++++----------- 5 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/commands/discord/tbypass.ts b/src/commands/discord/tbypass.ts index bcc4496..2897bc9 100644 --- a/src/commands/discord/tbypass.ts +++ b/src/commands/discord/tbypass.ts @@ -26,6 +26,10 @@ export class TwitchChatRelay extends baseCommand { const uniqueID = randomUUID(); const tUser = await this.client.prisma.twitch.findUnique({ + select: { + verified: true, + username: true, + }, where: { memberid: interaction.user.id } diff --git a/src/commands/discord/tverify.ts b/src/commands/discord/tverify.ts index d617b0b..236035a 100644 --- a/src/commands/discord/tverify.ts +++ b/src/commands/discord/tverify.ts @@ -35,6 +35,11 @@ export class TwitchVerify extends baseCommand { // Check for the request and status const userReq = await this.client.prisma.twitch.findUnique({ + select: { + id: true, + username: true, + verified: true, + }, where: { memberid: interaction.user.id, username: twitchUsername, diff --git a/src/commands/twitch/link.ts b/src/commands/twitch/link.ts index 0db81ae..add6ab5 100644 --- a/src/commands/twitch/link.ts +++ b/src/commands/twitch/link.ts @@ -33,6 +33,9 @@ export class LinkCommand extends baseTCommand { // Check if user has already joined in the discord server const dAccCount = await data.client.discord.prisma.members.findUnique({ + select: { + rulesconfirmedon: true, + }, where: { id: discordID, } diff --git a/src/core/DiscordClient.ts b/src/core/DiscordClient.ts index 36f0fdf..5e491a8 100644 --- a/src/core/DiscordClient.ts +++ b/src/core/DiscordClient.ts @@ -1,6 +1,7 @@ import { ActivityType, Client, GatewayIntentBits, Partials, DefaultWebSocketManagerOptions } from "discord.js"; import config from '../config.json'; import { PrismaClient } from "@prisma/client"; +import { suppressTracing } from "@sentry/core"; import Redis from "ioredis"; import { eventLogger } from "./helper/eventLogger"; import { DiscordEvents, RedisEvents } from "../events"; @@ -97,27 +98,31 @@ export class DiscordClient extends Client implements baseClient { } public async start(token: string) { - // Connect all services - await this.prisma.$connect(); - if(this.redis.status === "close") - await this.redis.connect(); - await this.login(token); - - // Start all services - await new DiscordCommandHandler(this).commandRegister(); - await this.loadServices(); - this.updateStatus(); - - // Start helper clients - await this.twitch.start(); - await this.youtube.start(); + return await suppressTracing(async()=>{ + // Connect all services + await this.prisma.$connect(); + if(this.redis.status === "close") + await this.redis.connect(); + await this.login(token); + + // Start all services + await new DiscordCommandHandler(this).commandRegister(); + await this.loadServices(); + this.updateStatus(); + + // Start helper clients + await this.twitch.start(); + await this.youtube.start(); + }); } public async dispose() { - // Close all connections - await this.prisma.$disconnect(); - await this.redis.quit(); - await this.destroy(); + return await suppressTracing(async() => { + // Close all connections + await this.prisma.$disconnect(); + await this.redis.quit(); + await this.destroy(); + }); } public updateStatus() { diff --git a/src/events/index.ts b/src/events/index.ts index a0e7c44..c71c4ba 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -1,13 +1,5 @@ -import { DiscordEvents } from "./discordEvents"; -import { RedisEvents } from "./redisEvents"; -import { TwitchEvents } from "./twitchEvents"; -import { StreamEvents } from "./streamEvents"; -import { YoutubeEvents } from "./YoutubeEvents"; - -export { - DiscordEvents, - RedisEvents, - TwitchEvents, - StreamEvents, - YoutubeEvents -}; \ No newline at end of file +export { DiscordEvents } from "./discordEvents"; +export { RedisEvents } from "./redisEvents"; +export { TwitchEvents } from "./twitchEvents"; +export { StreamEvents } from "./streamEvents"; +export { YoutubeEvents } from "./YoutubeEvents"; From 0eaf6e4f2af7b539d32c22ef1088a73447b15b09 Mon Sep 17 00:00:00 2001 From: zhiyan114 Date: Tue, 8 Oct 2024 14:46:56 -0400 Subject: [PATCH 2/5] Minor pkg upgrade --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2209ea9..8bf6089 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4664,9 +4664,9 @@ "peer": true }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5370,9 +5370,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -5380,7 +5380,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", From b9f44a0cf2222110448c3502ea7fd6f809e806ec Mon Sep 17 00:00:00 2001 From: zhiyan114 Date: Wed, 9 Oct 2024 14:06:59 -0400 Subject: [PATCH 3/5] Don't trace eval cmd --- src/loader.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/loader.ts b/src/loader.ts index d75ac84..d7a64c3 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -65,7 +65,7 @@ sentryInit({ // Ignore Http Breadcrumbs from the blacklisted url if(breadcrumb.category === "http" && - ignoreUrl.filter(url=>breadcrumb.data?.url.startsWith(url)).length > 0) return null; + ignoreUrl.find(url=>breadcrumb.data?.url.startsWith(url))) return null; return breadcrumb; }, @@ -96,6 +96,8 @@ sentryInit({ // This will be messy anyway if(ctx.name === "Chat Reward Points") return 0.2; + if(ctx.name == "Discord Command: eval") // Doesn't make sense to have this sampled lol + return 0; return 1; }, From 8a1008abd9a5d6f69cb2d4601e916895bc588ca2 Mon Sep 17 00:00:00 2001 From: zhiyan114 Date: Sat, 12 Oct 2024 14:54:33 -0400 Subject: [PATCH 4/5] Sentry ignore eventLogger traces --- src/core/helper/eventLogger.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/core/helper/eventLogger.ts b/src/core/helper/eventLogger.ts index 74e7bd7..7ae87dc 100644 --- a/src/core/helper/eventLogger.ts +++ b/src/core/helper/eventLogger.ts @@ -1,5 +1,6 @@ import { ColorResolvable, EmbedBuilder, TextChannel } from "discord.js"; import { DiscordClient } from "../DiscordClient"; +import { suppressTracing } from "@sentry/core"; export interface LogData { @@ -46,17 +47,19 @@ export class eventLogger { this.logQueues = []; } async sendLog(log: LogData) { - // Queue the log if the channel is not initialized - if(!this.channel) { - console.log(`Log channel not initialized, this log will be added to the pre-initialization queue! (Log Message: ${log.message})`); - this.logQueues.push(log); - return; - } + await suppressTracing(async ()=>{ + // Queue the log if the channel is not initialized + if(!this.channel) { + console.log(`Log channel not initialized, this log will be added to the pre-initialization queue! (Log Message: ${log.message})`); + this.logQueues.push(log); + return; + } - // Send the log - await this.channel.send({ - content: log.type === "Error" ? "<@233955058604179457>" : undefined, - embeds: [this.prepareEmbed(log)] + // Send the log + await this.channel.send({ + content: log.type === "Error" ? "<@233955058604179457>" : undefined, + embeds: [this.prepareEmbed(log)] + }); }); } From 3dee186377e42b8000a09839c6f147da7a9500b8 Mon Sep 17 00:00:00 2001 From: zhiyan114 Date: Sat, 12 Oct 2024 14:57:45 -0400 Subject: [PATCH 5/5] PKG Update --- package-lock.json | 116 +++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bf6089..c27b677 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,9 +76,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "license": "MIT", "peer": true, @@ -87,9 +87,9 @@ } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "license": "MIT", "peer": true, @@ -100,10 +100,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -378,14 +378,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -698,9 +698,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "license": "MIT", "peer": true, @@ -834,9 +834,9 @@ "license": "MIT" }, "node_modules/@emnapi/runtime": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.0.tgz", - "integrity": "sha512-XMBySMuNZs3DM96xcJmLW4EfGnf+uGmFNjzpehMjuX5PLB5j87ar2Zc4e3PVeZ3I5g3tYtAqskB28manlF69Zw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "license": "MIT", "optional": true, "dependencies": { @@ -3241,22 +3241,22 @@ } }, "node_modules/@sentry/core": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.33.1.tgz", - "integrity": "sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.34.0.tgz", + "integrity": "sha512-adrXCTK/zsg5pJ67lgtZqdqHvyx6etMjQW3P82NgWdj83c8fb+zH+K79Z47pD4zQjX0ou2Ws5nwwi4wJbz4bfA==", "license": "MIT", "dependencies": { - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/node": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.33.1.tgz", - "integrity": "sha512-0Xmlrl5nU5Bx6YybaIfztyOIiIXW5X64vcK0u94Sg4uHcDO7YvEbhflKjp669ds2I6ZQ/czqxnaAY8gM6P2SCA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.34.0.tgz", + "integrity": "sha512-Q7BPp7Y8yCcwD620xoziWSOuPi/PCIdttkczvB0BGzBRYh2s702h+qNusRijRpVNZmzmYOo9m1x7Y1O/b8/v2A==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -3289,10 +3289,10 @@ "@opentelemetry/sdk-trace-base": "^1.26.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@prisma/instrumentation": "5.19.1", - "@sentry/core": "8.33.1", - "@sentry/opentelemetry": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1", + "@sentry/core": "8.34.0", + "@sentry/opentelemetry": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0", "import-in-the-middle": "^1.11.0" }, "engines": { @@ -3300,14 +3300,14 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.33.1.tgz", - "integrity": "sha512-D2aE2G0DUHLLnfbOXrTjiNJKAs/RZfOBJMidI4fC2AIwqCmrp55Aex4dRq4hxd8MPLR92Kt/ikHeJxlzWB15KA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.34.0.tgz", + "integrity": "sha512-WS91L+HVKGVIzOgt0szGp+24iKOs86BZsAHGt0HWnMR4kqWP6Ak+TLvqWDCxnuzniZMxdewDGA8p5hrBAPsmsA==", "license": "MIT", "dependencies": { - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" @@ -3321,21 +3321,21 @@ } }, "node_modules/@sentry/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.33.1.tgz", - "integrity": "sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.34.0.tgz", + "integrity": "sha512-zLRc60CzohGCo6zNsNeQ9JF3SiEeRE4aDCP9fDDdIVCOKovS+mn1rtSip0qd0Vp2fidOu0+2yY0ALCz1A3PJSQ==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-W1KoRlFUjprlh3t86DZPFxLfM6mzjRzshVfMY7vRlJFymBelJsnJ3A1lPeBZM9nCraOSiw6GtOWu6k5BAkiGIg==", "license": "MIT", "dependencies": { - "@sentry/types": "8.33.1" + "@sentry/types": "8.34.0" }, "engines": { "node": ">=14.18" @@ -4420,9 +4420,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "dev": true, "funding": [ { @@ -4971,9 +4971,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.33", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", - "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==", + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", "dev": true, "license": "ISC", "peer": true @@ -5717,9 +5717,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7547,9 +7547,9 @@ "license": "MIT" }, "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "license": "MIT" }, "node_modules/natural-compare": { @@ -9273,9 +9273,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "license": "Apache-2.0", "bin": {