From 5648d36906201c5931242130b97f05f7d638050e Mon Sep 17 00:00:00 2001 From: Daryl Ronningen Date: Mon, 1 Nov 2021 21:06:31 -0700 Subject: [PATCH] feat: redone code to my framework & slash cmds --- config/default.json.example | 12 +++ package.json | 9 +- src/commands/utils/vm.ts | 102 ++++++++++++++++++++++ src/index.ts | 65 ++++++++++++++ src/lib/utils/utils.ts | 61 +++++++++++++ yarn.lock | 167 ++++++++++++++++++++++-------------- 6 files changed, 347 insertions(+), 69 deletions(-) create mode 100644 config/default.json.example create mode 100644 src/commands/utils/vm.ts create mode 100644 src/index.ts create mode 100644 src/lib/utils/utils.ts diff --git a/config/default.json.example b/config/default.json.example new file mode 100644 index 0000000..3428fc2 --- /dev/null +++ b/config/default.json.example @@ -0,0 +1,12 @@ +{ + "db": { + "host": "", + "port": "0000", + "user": "", + "password": "", + "database": "" + }, + "logLevel": "", + "ownerId": "", + "token": "", +} diff --git a/package.json b/package.json index 5db20f3..fa58737 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "scripts": { "clean": "rimraf dist", "compile": "tsc", - "commit": "commit", + "commit": "cz", "lint": "eslint --format=pretty src/**/*.ts", "lint:save": "eslint --format=pretty --save src/**/*.ts", "migrate": "node-pg-migrate", @@ -31,7 +31,7 @@ }, "dependencies": { "@discordjs/rest": "^0.1.0-canary.0", - "@neonjs/framework": "^0.0.1-778b0e3813ed61dfb931f042511e1e1f681adefc.1635794341", + "@neonjs/framework": "^1.0.0", "bufferutil": "^4.0.5", "config": "^3.3.6", "discord-api-types": "^0.24.0", @@ -46,6 +46,7 @@ "sql-template-strings": "^2.2.2", "terminal-link": "^3.0.0", "tslib": "^2.3.1", + "typescript": "^4.4.4", "utf-8-validate": "^5.0.7", "vm2": "^3.9.5", "zlib-sync": "^0.1.7" @@ -54,11 +55,14 @@ "@commitlint/cli": "^14.1.0", "@commitlint/config-conventional": "^14.1.0", "@commitlint/cz-commitlint": "^14.1.0", + "@types/config": "^0.0.40", "@types/figlet": "^1.5.4", "@types/gradient-string": "^1.1.2", + "@types/i18next-fs-backend": "^1.1.2", "@types/inquirer": "^8.1.3", "@types/luxon": "^2.0.5", "@types/pg": "^8.6.1", + "@types/pino": "^6.3.12", "@types/rimraf": "^3.0.2", "@types/source-map-support": "^0.5.4", "@typescript-eslint/eslint-plugin": "^5.3.0", @@ -78,7 +82,6 @@ "source-map-support": "^0.5.20", "standard-version": "^9.3.2", "ts-sql-plugin": "^0.10.0", - "typescript": "^4.4.4", "typescript-eslint-language-service": "^4.1.5" }, "lint-staged": { diff --git a/src/commands/utils/vm.ts b/src/commands/utils/vm.ts new file mode 100644 index 0000000..3908839 --- /dev/null +++ b/src/commands/utils/vm.ts @@ -0,0 +1,102 @@ +/* + * This file is part of ArgonBot + * + * ArgonBot is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ArgonBot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ArgonBot. If not, see . + */ +import Command from '@neonjs/framework/dist/lib/structures/command'; +import type { CacheType, Client, CommandInteraction } from 'discord.js'; +import { transpile } from 'typescript'; +import { NodeVM } from 'vm2'; + +export default class extends Command { + public constructor(client: Client, file: string) { + super(client, file, { + args: [ + { + name: 'language', + description: 'The language to use', + autocomplete: true, + type: 'STRING', + required: true, + choices: [ + { + name: 'javascript', + value: 'javascript', + }, + { + name: 'typescript', + value: 'typescript', + }, + ], + }, + { + name: 'code', + description: 'The code to run', + autocomplete: true, + type: 'STRING', + required: true, + }, + ], + cooldown: 5, + extendedDescription: 'Runs Vanilla JavaScript/TypeScript code direct from Discord in a secure VM', + group: 'utils', + name: 'vm', + shortDescription: 'Runs JavaScript/TypeScript code direct from Discord.', + usage: 'js const test = \'test\'; return test;', + }); + } + + public async run(interaction: CommandInteraction): Promise { + const code = interaction.options.getString('code', true); + const javascriptVM = new NodeVM({ eval: false, timeout: 1000, wasm: false, console: 'off' }); + const vmLang = interaction.options.getString('language', true); + + switch (vmLang.toLowerCase()) { + case 'javascript': + await interaction.reply('Computing JavaScript Code...'); + + try { + let returnVal: string; + if (!code.includes('module.exports = ')) + returnVal = await javascriptVM.run(`module.exports = (() => {${code}})();`); + else + returnVal = await javascriptVM.run(`(() => {${code}})()`); + + await interaction.editReply(`\`\`\`\n${returnVal}\`\`\``); + } catch (err) { + await interaction.editReply(`An error has occurred! \`\`\`${(err as Error).message}\`\`\``); + } + break; + case 'typescript': + await interaction.reply('Computing TypeScript Code...'); + + try { + const jsCode = transpile(code); + let returnVal: string; + + if (!jsCode.includes('module.exports = ')) + returnVal = await javascriptVM.run(`module.exports = (() => {${jsCode}}()`); + else + returnVal = await javascriptVM.run(`(() => {${jsCode}}()`); + + await interaction.editReply(`\`\`\`\n${returnVal}\`\`\``); + } catch (err) { + await interaction.editReply(`An error has occurred! \`\`\`${(err as Error).message}\`\`\``); + } + break; + default: + await interaction.reply('This should not happen tf'); + } + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..4514030 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,65 @@ +/* + * This file is part of ArgonBot + * + * ArgonBot is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ArgonBot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ArgonBot. If not, see . + */ +import { NeonClient } from '@neonjs/framework'; +import config from 'config'; +import figlet from 'figlet'; +import gradient from 'gradient-string'; +import i18next from 'i18next'; +import Backend from 'i18next-chained-backend'; +import FSBackend from 'i18next-fs-backend'; +import { connectToDB } from './lib/utils/utils'; + +const client = new NeonClient(config.get('ownerId'), { + intents: ['GUILDS'], +}); + +figlet('Argon Bot', (err, data) => { + if (err) client.logger.error(`Figlet encountered an error!\n${err.message}`); + + client.logger.info(gradient.rainbow.multiline(`\n${data}`)); +}); + +client.on('ready', async () => { + client.logger.info('Loading translations...'); + + await i18next.use(Backend).init({ + supportedLngs: ['en-US'], + lng: 'en-US', + fallbackLng: 'en-US', + defaultNS: 'common', + fallbackNS: 'common', + ns: ['common', 'commands'], + backend: { + backends: [FSBackend], + backendOptions: [ + { + loadPath: `${process.cwd()}/translations/{{lng}}/{{ns}}.json`, + }, + ], + }, + }); + + client.logger.info('Finished loading translations'); + + client.logger.info('Creating Database Pool...'); + await connectToDB(config.get('db')); + client.logger.info('Finished creating Database Pool'); + + client.logger.info('Bot is ready!'); +}); + +client.login(config.get('token')); diff --git a/src/lib/utils/utils.ts b/src/lib/utils/utils.ts new file mode 100644 index 0000000..8b8cd34 --- /dev/null +++ b/src/lib/utils/utils.ts @@ -0,0 +1,61 @@ +/* + * This file is part of ArgonBot + * + * ArgonBot is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ArgonBot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ArgonBot. If not, see . + */ +import { NeonClient } from '@neonjs/framework'; +import pg, { QueryResult } from 'pg'; +import type { SQLStatement } from 'sql-template-strings'; + +let pool: pg.Pool; + +export const connectToDB = async (connectionData: pg.PoolConfig): Promise => { + pool = new pg.Pool(connectionData); + + pool.on('connect', () => { + NeonClient.logger.info('Connected to the Postgres Database!'); + }); + + pool.on('error', (err) => { + NeonClient.logger.error(`An error has occurred with node-postgres!\n${err.message}`); + }); +}; + +export const query = async (query: SQLStatement): Promise | void> => { + if (!pool) return NeonClient.logger.error('Attempted to query to the Database when a connection has not been made yet... Discarding request.'); + else { + const client = await pool.connect(); + + try { + NeonClient.logger.info('DB: BEGIN'); + await client.query('BEGIN'); + + NeonClient.logger.info(query.text); + const result = await client.query(query); + + NeonClient.logger.info('DB: COMMIT'); + await client.query('COMMIT'); + + return result; + } catch (e) { + NeonClient.logger.error(`An error has occurred while attempting to query "${query}"... Rolling back changes`); + NeonClient.logger.info('DB: ROLLBACK'); + await client.query('ROLLBACK'); + + throw e; + } finally { + client.release(); + } + } +}; diff --git a/yarn.lock b/yarn.lock index e8f111e..765af4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -222,11 +222,11 @@ __metadata: linkType: hard "@babel/parser@npm:^7.16.0": - version: 7.16.0 - resolution: "@babel/parser@npm:7.16.0" + version: 7.16.2 + resolution: "@babel/parser@npm:7.16.2" bin: parser: ./bin/babel-parser.js - checksum: dac5feeaf03ec9bc075af5c2bd1a401e4123b45a6e4ef7a123d242b16a5cf18cc4bc80b0579327ed1a6c8dcb0e078fff8d66e71e77260a3c0abc236cf2606e16 + checksum: e8ceef8214adf55beaae80fff1647ae6535e17af592749a6f3fd3ed1081bbb1474fd88bf4d3470ec8bc0082843a6d23445e9e08b03e91831458acc6fd37d7bc9 languageName: node linkType: hard @@ -585,18 +585,18 @@ __metadata: languageName: node linkType: hard -"@neonjs/framework@npm:^0.0.1-778b0e3813ed61dfb931f042511e1e1f681adefc.1635794341": - version: 0.0.1 - resolution: "@neonjs/framework@npm:0.0.1" +"@neonjs/framework@npm:^1.0.0": + version: 1.0.0 + resolution: "@neonjs/framework@npm:1.0.0" dependencies: "@discordjs/rest": ^0.1.0-canary.0 - discord-api-types: ^0.23.1 - discord.js: ^13.2.0 + discord-api-types: ^0.24.0 + discord.js: ^13.3.1 lodash: ^4.17.21 node-fetch: ^3.0.0 - pino: ^6.13.3 - pino-pretty: ^7.0.1 - checksum: 643cd080e313febe4c1e916092e989461f6821467409be16d388189bdd8da81eb28a2f444e07da94f3bee56574cfc603b8188cbde0d8a48bfa367e8445eaa9da + pino: ^7.0.5 + pino-pretty: ^7.1.0 + checksum: 79d51bf9b429a9c69d3b97b292c806d183c172cdccc43c571b64361d100cea791a0c8569fa5e19947c319d0faf60e9a7d2cb91c3562870f0752c6502945c1c23 languageName: node linkType: hard @@ -691,6 +691,13 @@ __metadata: languageName: node linkType: hard +"@types/config@npm:^0.0.40": + version: 0.0.40 + resolution: "@types/config@npm:0.0.40" + checksum: 94e52288d26895c25c6a00cb553f6a19d71e9edd7ecfe0a3f0689c486f559be6cbf400362f14fa0daac5b12bd30e876b8c6aafc5fbd37580c2c3270464c4af59 + languageName: node + linkType: hard + "@types/eslint@npm:^7.2.13": version: 7.28.2 resolution: "@types/eslint@npm:7.28.2" @@ -734,6 +741,15 @@ __metadata: languageName: node linkType: hard +"@types/i18next-fs-backend@npm:^1.1.2": + version: 1.1.2 + resolution: "@types/i18next-fs-backend@npm:1.1.2" + dependencies: + i18next: ^21.0.1 + checksum: 567ab61f65231490b272d15311e7eb127cb069743284d3e0527e7cc75671038dcb70feb5da9964b218a3bb28435365179c18bab721c94ed765f28263662e6de0 + languageName: node + linkType: hard + "@types/inquirer@npm:^8.1.3": version: 8.1.3 resolution: "@types/inquirer@npm:8.1.3" @@ -823,6 +839,36 @@ __metadata: languageName: node linkType: hard +"@types/pino-pretty@npm:*": + version: 4.7.1 + resolution: "@types/pino-pretty@npm:4.7.1" + dependencies: + "@types/pino": "*" + checksum: 5a8a80bd42eda30c4aa0a322cdc55e8dd88d768b84d2e549802a3f6a2d822824364598ba4e24b3db701d87b0478568b5fe4d036f4146d0a3691fb751ccc83d50 + languageName: node + linkType: hard + +"@types/pino-std-serializers@npm:*": + version: 2.4.1 + resolution: "@types/pino-std-serializers@npm:2.4.1" + dependencies: + "@types/node": "*" + checksum: a156e25882db9aade2576dbe6414379efcdd4fad24211d3f22f20e0cd4bee569215799ee5cd9b2b15282f18461a8a54573ff42bf6bee5d35b72513be2f78bdec + languageName: node + linkType: hard + +"@types/pino@npm:*, @types/pino@npm:^6.3.12": + version: 6.3.12 + resolution: "@types/pino@npm:6.3.12" + dependencies: + "@types/node": "*" + "@types/pino-pretty": "*" + "@types/pino-std-serializers": "*" + sonic-boom: ^2.1.0 + checksum: 801735146669312d02459781e5180220630eaef643da36dc5a9a97520e7ecc3da7270f31a86fcdcb1dc835073c9143fc628024ba5e3a0ea7cbb86aada4897709 + languageName: node + linkType: hard + "@types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" @@ -1209,12 +1255,15 @@ __metadata: "@commitlint/config-conventional": ^14.1.0 "@commitlint/cz-commitlint": ^14.1.0 "@discordjs/rest": ^0.1.0-canary.0 - "@neonjs/framework": ^0.0.1-778b0e3813ed61dfb931f042511e1e1f681adefc.1635794341 + "@neonjs/framework": ^1.0.0 + "@types/config": ^0.0.40 "@types/figlet": ^1.5.4 "@types/gradient-string": ^1.1.2 + "@types/i18next-fs-backend": ^1.1.2 "@types/inquirer": ^8.1.3 "@types/luxon": ^2.0.5 "@types/pg": ^8.6.1 + "@types/pino": ^6.3.12 "@types/rimraf": ^3.0.2 "@types/source-map-support": ^0.5.4 "@typescript-eslint/eslint-plugin": ^5.3.0 @@ -2309,20 +2358,13 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:6.0.0": +"detect-indent@npm:6.0.0, detect-indent@npm:^6.0.0": version: 6.0.0 resolution: "detect-indent@npm:6.0.0" checksum: 0c38f362016e2d07af1c65b1ecd6ad8a91f06bfdd11383887c867a495ad286d04be2ab44027ac42444704d523982013115bd748c1541df7c9396ad76b22aaf5d languageName: node linkType: hard -"detect-indent@npm:^6.0.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - "detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -2353,13 +2395,6 @@ __metadata: languageName: node linkType: hard -"discord-api-types@npm:^0.23.1": - version: 0.23.1 - resolution: "discord-api-types@npm:0.23.1" - checksum: e2ea574d51bff9f74770194338ba2b981072c6814a4da4c1e9a6b09b5b6bcf4ecf9044397fd4d2d3bf245f7573f22f1c25ff3f57cfc23ed87dfee4629091c29d - languageName: node - linkType: hard - "discord-api-types@npm:^0.24.0": version: 0.24.0 resolution: "discord-api-types@npm:0.24.0" @@ -2367,7 +2402,7 @@ __metadata: languageName: node linkType: hard -"discord.js@npm:^13.2.0": +"discord.js@npm:^13.3.1": version: 13.3.1 resolution: "discord.js@npm:13.3.1" dependencies: @@ -2842,7 +2877,7 @@ __metadata: languageName: node linkType: hard -"fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.0.8": +"fast-safe-stringify@npm:^2.0.7": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d @@ -2994,13 +3029,6 @@ __metadata: languageName: node linkType: hard -"flatstr@npm:^1.0.12": - version: 1.0.12 - resolution: "flatstr@npm:1.0.12" - checksum: e1bb562c94b119e958bf37e55738b172b5f8aaae6532b9660ecd877779f8559dbbc89613ba6b29ccc13447e14c59277d41450f785cf75c30df9fce62f459e9a8 - languageName: node - linkType: hard - "flatted@npm:^3.1.0": version: 3.2.2 resolution: "flatted@npm:3.2.2" @@ -3250,7 +3278,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.4": +"glob@npm:7.1.4, glob@npm:^7.1.3": version: 7.1.4 resolution: "glob@npm:7.1.4" dependencies: @@ -3264,7 +3292,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^7.1.4": version: 7.2.0 resolution: "glob@npm:7.2.0" dependencies: @@ -3542,7 +3570,7 @@ __metadata: languageName: node linkType: hard -"i18next@npm:^21.3.3": +"i18next@npm:^21.0.1, i18next@npm:^21.3.3": version: 21.3.3 resolution: "i18next@npm:21.3.3" dependencies: @@ -4606,14 +4634,14 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": +"ms@npm:2.1.2, ms@npm:^2.1.1": version: 2.1.2 resolution: "ms@npm:2.1.2" checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -4866,6 +4894,13 @@ __metadata: languageName: node linkType: hard +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: d22b0f0538069110626b578db6e68b6ee0e85b1ee9cc5ef9b4de1bba431431d6a8da91a61e09d2ad46f22a96f968e5237833cb9d0b69bc4d294f7ec82f609b05 + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -5246,7 +5281,7 @@ __metadata: languageName: node linkType: hard -"pino-abstract-transport@npm:^0.4.0": +"pino-abstract-transport@npm:^0.4.0, pino-abstract-transport@npm:v0.4.0": version: 0.4.0 resolution: "pino-abstract-transport@npm:0.4.0" dependencies: @@ -5256,7 +5291,7 @@ __metadata: languageName: node linkType: hard -"pino-pretty@npm:^7.0.1": +"pino-pretty@npm:^7.1.0": version: 7.1.0 resolution: "pino-pretty@npm:7.1.0" dependencies: @@ -5278,27 +5313,30 @@ __metadata: languageName: node linkType: hard -"pino-std-serializers@npm:^3.1.0": - version: 3.2.0 - resolution: "pino-std-serializers@npm:3.2.0" - checksum: 77e29675b116e42ae9fe6d4ef52ef3a082ffc54922b122d85935f93ddcc20277f0b0c873c5c6c5274a67b0409c672aaae3de6bcea10a2d84699718dda55ba95b +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 89d487729b58c9d3273a0ee851ead068d6d2e2ccc1af8e1c1d28f1b3442423679bec7ec04d9a2aba36f94f335e82be9f4de19dc4fbc161e71c136aaa15b85ad3 languageName: node linkType: hard -"pino@npm:^6.13.3": - version: 6.13.3 - resolution: "pino@npm:6.13.3" +"pino@npm:^7.0.5": + version: 7.0.5 + resolution: "pino@npm:7.0.5" dependencies: fast-redact: ^3.0.0 - fast-safe-stringify: ^2.0.8 fastify-warning: ^0.2.0 - flatstr: ^1.0.12 - pino-std-serializers: ^3.1.0 + get-caller-file: ^2.0.5 + json-stringify-safe: ^5.0.1 + on-exit-leak-free: ^0.2.0 + pino-abstract-transport: v0.4.0 + pino-std-serializers: ^4.0.0 quick-format-unescaped: ^4.0.3 - sonic-boom: ^1.0.2 + sonic-boom: ^2.2.1 + thread-stream: ^0.11.1 bin: pino: bin.js - checksum: a580decd47a1c8b32a846ba1cb478087b523636d697bd4c57833d10b3f2b35c7d06739715ad9a291b41caf002b8d1bbf98674bfb3e99989fd41b7d934cca861c + checksum: 569011202351e1ea00e56a776333194fd681608e5a8a908e3bc4f010da8c21c668d1e1cb20acde2575ae5031d0b73064b780c4078a3bcd72d395f313750ee7e8 languageName: node linkType: hard @@ -5938,17 +5976,7 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:^1.0.2": - version: 1.4.1 - resolution: "sonic-boom@npm:1.4.1" - dependencies: - atomic-sleep: ^1.0.0 - flatstr: ^1.0.12 - checksum: 189fa8fe5c2dc05d3513fc1a4926a2f16f132fa6fa0b511745a436010cdcd9c1d3b3cb6a9d7c05bd32a965dc77673a5ac0eb0992e920bdedd16330d95323124f - languageName: node - linkType: hard - -"sonic-boom@npm:^2.2.0": +"sonic-boom@npm:^2.1.0, sonic-boom@npm:^2.2.0, sonic-boom@npm:^2.2.1": version: 2.3.0 resolution: "sonic-boom@npm:2.3.0" dependencies: @@ -6325,6 +6353,13 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.11.1": + version: 0.11.2 + resolution: "thread-stream@npm:0.11.2" + checksum: ca5372b3029ffee24eb928c8d597c5ece114d07c1812a2e2c6a0fc00e4d5f3fad747b84c9a69e8805bfd3c930793378f0c4048a3f5d99ddbb9ee79576e623cdf + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5"