From 0f8e912093aee70017cd8470ffaa13072123f671 Mon Sep 17 00:00:00 2001 From: Badstagram Date: Mon, 9 Dec 2024 12:01:58 +0000 Subject: [PATCH] Initial --- .gitignore | 38 +++ .npmrc | 0 README.md | 81 ++++++ .../.sapphire/templates/arguments/argument.ts | 15 ++ .../commands/context-menu-command.ts | 20 ++ .../templates/commands/message-command.ts | 12 + .../templates/commands/slash-command.ts | 19 ++ .../autocomplete-interaction-handler.ts | 30 +++ .../button-interaction-handler.ts | 22 ++ .../modal-interaction-handler.ts | 21 ++ .../select-menu-interaction-handler.ts | 21 ++ .../.sapphire/templates/listeners/listener.ts | 7 + .../templates/preconditions/precondition.ts | 22 ++ apps/bot/.sapphire/templates/routes/route.ts | 15 ++ apps/bot/README.md | 32 +++ apps/bot/package.json | 71 +++++ apps/bot/sapphire.toml | 38 +++ apps/bot/src/commands/Admin/Admin.ts | 24 ++ .../bot/src/commands/Admin/_adminErrorTest.ts | 7 + .../src/commands/Admin/_adminSyncDatabase.ts | 44 ++++ apps/bot/src/commands/Admin/_index.ts | 2 + apps/bot/src/commands/Info/ping.ts | 64 +++++ apps/bot/src/commands/Mod/Report.ts | 81 ++++++ apps/bot/src/commands/Settings/Settings.ts | 137 ++++++++++ apps/bot/src/commands/Settings/_index.ts | 12 + .../src/commands/Settings/autoRole/_create.ts | 27 ++ .../src/commands/Settings/autoRole/_remove.ts | 27 ++ .../commands/Settings/reportChannel/_set.ts | 28 ++ .../commands/Settings/reportChannel/_unset.ts | 16 ++ .../Settings/welcomeMessage/_disable.ts | 2 + .../Settings/welcomeMessage/_enable.ts | 2 + .../Settings/welcomeMessage/_preview.ts | 26 ++ .../Settings/welcomeMessage/_setColor.ts | 2 + .../Settings/welcomeMessage/_setMessage.ts | 2 + .../Settings/welcomeMessage/_setTitle.ts | 2 + apps/bot/src/commands/Tag/Tag.ts | 23 ++ apps/bot/src/commands/Tag/_createTag.ts | 44 ++++ apps/bot/src/commands/Tag/_index.ts | 1 + apps/bot/src/commands/Urban/Urban.ts | 29 +++ apps/bot/src/commands/Urban/_define.ts | 26 ++ apps/bot/src/commands/Urban/_index.ts | 2 + apps/bot/src/commands/Urban/_random.ts | 24 ++ apps/bot/src/index.ts | 45 ++++ .../interaction-handlers/modal/createTag.ts | 40 +++ apps/bot/src/lib/constants.ts | 16 ++ .../lib/customIdParams/baseCustomIdParams.ts | 3 + apps/bot/src/lib/customIdParams/index.ts | 2 + apps/bot/src/lib/customIdParams/report.ts | 10 + apps/bot/src/lib/errors/CommandFailedError.ts | 8 + apps/bot/src/lib/errors/InternalError.ts | 8 + apps/bot/src/lib/errors/index.ts | 2 + apps/bot/src/lib/setup.ts | 46 ++++ apps/bot/src/lib/utils.ts | 185 +++++++++++++ .../chatInputCommandDenied.ts | 23 ++ .../chatInputCommandSuccess.ts | 14 + .../contextMenuCommandDenied.ts | 23 ++ .../contextMenuCommandSuccess.ts | 14 + .../messageCommands/messageCommandDenied.ts | 12 + .../messageCommands/messageCommandSuccess.ts | 15 ++ .../commands/subcommands/subcommandError.ts | 59 +++++ apps/bot/src/listeners/guildMemberJoin.ts | 48 ++++ apps/bot/src/listeners/message.ts | 59 +++++ apps/bot/src/listeners/ready.ts | 53 ++++ apps/bot/src/preconditions/OwnerOnly.ts | 30 +++ apps/bot/src/preconditions/RequiredSetting.ts | 40 +++ apps/bot/src/routes/hello-world.ts | 13 + apps/bot/src/routes/main.ts | 13 + apps/bot/tsconfig.json | 63 +++++ apps/bot/tsup.config.ts | 18 ++ bun.lockb | Bin 0 -> 405412 bytes docker-compose.yaml | 46 ++++ package.json | 43 ++++ packages/config/package.json | 29 +++ packages/config/src/configs/debug.ts | 11 + packages/config/src/configs/global.ts | 20 ++ packages/config/src/index.ts | 2 + packages/config/tsconfig.json | 9 + packages/config/tsconfig.tsbuildinfo | 1 + packages/database/.gitignore | 3 + packages/database/package.json | 37 +++ .../20241130142822_initial/migration.sql | 78 ++++++ .../migration.sql | 5 + .../20241208190233_auto_carbon/migration.sql | 2 + .../prisma/migrations/migration_lock.toml | 3 + packages/database/prisma/schema.prisma | 83 ++++++ .../database/prisma/sql/createAutoRole.sql | 8 + packages/database/prisma/sql/createTag.sql | 27 ++ .../database/prisma/sql/findTagByTitle.sql | 11 + .../database/prisma/sql/removeAutoRole.sql | 8 + packages/database/src/helpers/getGuild.ts | 10 + packages/database/src/helpers/index.ts | 1 + packages/database/src/index.ts | 53 ++++ packages/database/tsconfig.json | 9 + packages/error-handler/package.json | 21 ++ .../error-handler/src/WyvernErrorHandler.ts | 53 ++++ packages/error-handler/src/index.ts | 1 + packages/error-handler/tsconfig.json | 9 + packages/error-handler/tsconfig.tsbuildinfo | 1 + packages/eslint-config/README.md | 3 + packages/eslint-config/library.js | 34 +++ packages/eslint-config/next.js | 35 +++ packages/eslint-config/package.json | 19 ++ packages/eslint-config/react-internal.js | 39 +++ packages/markdown/jest.config.js | 7 + packages/markdown/package.json | 29 +++ packages/markdown/src/formatters/bold.ts | 5 + packages/markdown/src/formatters/codeblock.ts | 12 + packages/markdown/src/formatters/heading.ts | 15 ++ packages/markdown/src/formatters/italic.ts | 5 + packages/markdown/src/formatters/mention.ts | 27 ++ packages/markdown/src/formatters/quote.ts | 10 + packages/markdown/src/formatters/spoiler.ts | 5 + .../markdown/src/formatters/strikethrough.ts | 7 + packages/markdown/src/formatters/underline.ts | 5 + packages/markdown/src/index.ts | 10 + packages/markdown/tests/markdown.test.ts | 44 ++++ packages/markdown/tsconfig.json | 9 + packages/markdown/tsconfig.tsbuildinfo | 1 + packages/plugin-custom-logger/package.json | 31 +++ packages/plugin-custom-logger/src/foo.ts | 3 + packages/plugin-custom-logger/src/index.ts | 12 + .../plugin-custom-logger/src/lib/Logger.ts | 243 ++++++++++++++++++ .../src/lib/LoggerLevel.ts | 72 ++++++ .../src/lib/LoggerStyle.ts | 128 +++++++++ .../src/lib/LoggerTimestamp.ts | 100 +++++++ packages/plugin-custom-logger/src/register.ts | 13 + packages/plugin-custom-logger/tsconfig.json | 9 + .../plugin-custom-logger/tsconfig.tsbuildinfo | 1 + packages/typescript-config/base.json | 7 + packages/typescript-config/nextjs.json | 12 + packages/typescript-config/package.json | 9 + packages/typescript-config/react-library.json | 7 + packages/urban-dictionary/package.json | 21 ++ .../urban-dictionary/src/UrbanDictionary.ts | 42 +++ packages/urban-dictionary/src/index.ts | 1 + packages/urban-dictionary/tsconfig.json | 9 + .../urban-dictionary/tsconfig.tsbuildinfo | 1 + turbo.json | 51 ++++ 138 files changed, 3657 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 README.md create mode 100644 apps/bot/.sapphire/templates/arguments/argument.ts create mode 100644 apps/bot/.sapphire/templates/commands/context-menu-command.ts create mode 100644 apps/bot/.sapphire/templates/commands/message-command.ts create mode 100644 apps/bot/.sapphire/templates/commands/slash-command.ts create mode 100644 apps/bot/.sapphire/templates/interaction-handlers/autocomplete-interaction-handler.ts create mode 100644 apps/bot/.sapphire/templates/interaction-handlers/button-interaction-handler.ts create mode 100644 apps/bot/.sapphire/templates/interaction-handlers/modal-interaction-handler.ts create mode 100644 apps/bot/.sapphire/templates/interaction-handlers/select-menu-interaction-handler.ts create mode 100644 apps/bot/.sapphire/templates/listeners/listener.ts create mode 100644 apps/bot/.sapphire/templates/preconditions/precondition.ts create mode 100644 apps/bot/.sapphire/templates/routes/route.ts create mode 100644 apps/bot/README.md create mode 100644 apps/bot/package.json create mode 100644 apps/bot/sapphire.toml create mode 100644 apps/bot/src/commands/Admin/Admin.ts create mode 100644 apps/bot/src/commands/Admin/_adminErrorTest.ts create mode 100644 apps/bot/src/commands/Admin/_adminSyncDatabase.ts create mode 100644 apps/bot/src/commands/Admin/_index.ts create mode 100644 apps/bot/src/commands/Info/ping.ts create mode 100644 apps/bot/src/commands/Mod/Report.ts create mode 100644 apps/bot/src/commands/Settings/Settings.ts create mode 100644 apps/bot/src/commands/Settings/_index.ts create mode 100644 apps/bot/src/commands/Settings/autoRole/_create.ts create mode 100644 apps/bot/src/commands/Settings/autoRole/_remove.ts create mode 100644 apps/bot/src/commands/Settings/reportChannel/_set.ts create mode 100644 apps/bot/src/commands/Settings/reportChannel/_unset.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_disable.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_enable.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_preview.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_setColor.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_setMessage.ts create mode 100644 apps/bot/src/commands/Settings/welcomeMessage/_setTitle.ts create mode 100644 apps/bot/src/commands/Tag/Tag.ts create mode 100644 apps/bot/src/commands/Tag/_createTag.ts create mode 100644 apps/bot/src/commands/Tag/_index.ts create mode 100644 apps/bot/src/commands/Urban/Urban.ts create mode 100644 apps/bot/src/commands/Urban/_define.ts create mode 100644 apps/bot/src/commands/Urban/_index.ts create mode 100644 apps/bot/src/commands/Urban/_random.ts create mode 100644 apps/bot/src/index.ts create mode 100644 apps/bot/src/interaction-handlers/modal/createTag.ts create mode 100644 apps/bot/src/lib/constants.ts create mode 100644 apps/bot/src/lib/customIdParams/baseCustomIdParams.ts create mode 100644 apps/bot/src/lib/customIdParams/index.ts create mode 100644 apps/bot/src/lib/customIdParams/report.ts create mode 100644 apps/bot/src/lib/errors/CommandFailedError.ts create mode 100644 apps/bot/src/lib/errors/InternalError.ts create mode 100644 apps/bot/src/lib/errors/index.ts create mode 100644 apps/bot/src/lib/setup.ts create mode 100644 apps/bot/src/lib/utils.ts create mode 100644 apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandDenied.ts create mode 100644 apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandSuccess.ts create mode 100644 apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandDenied.ts create mode 100644 apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandSuccess.ts create mode 100644 apps/bot/src/listeners/commands/messageCommands/messageCommandDenied.ts create mode 100644 apps/bot/src/listeners/commands/messageCommands/messageCommandSuccess.ts create mode 100644 apps/bot/src/listeners/commands/subcommands/subcommandError.ts create mode 100644 apps/bot/src/listeners/guildMemberJoin.ts create mode 100644 apps/bot/src/listeners/message.ts create mode 100644 apps/bot/src/listeners/ready.ts create mode 100644 apps/bot/src/preconditions/OwnerOnly.ts create mode 100644 apps/bot/src/preconditions/RequiredSetting.ts create mode 100644 apps/bot/src/routes/hello-world.ts create mode 100644 apps/bot/src/routes/main.ts create mode 100644 apps/bot/tsconfig.json create mode 100644 apps/bot/tsup.config.ts create mode 100644 bun.lockb create mode 100644 docker-compose.yaml create mode 100644 package.json create mode 100644 packages/config/package.json create mode 100644 packages/config/src/configs/debug.ts create mode 100644 packages/config/src/configs/global.ts create mode 100644 packages/config/src/index.ts create mode 100644 packages/config/tsconfig.json create mode 100644 packages/config/tsconfig.tsbuildinfo create mode 100644 packages/database/.gitignore create mode 100644 packages/database/package.json create mode 100644 packages/database/prisma/migrations/20241130142822_initial/migration.sql create mode 100644 packages/database/prisma/migrations/20241130180637_make_welcome_channelid_nullable/migration.sql create mode 100644 packages/database/prisma/migrations/20241208190233_auto_carbon/migration.sql create mode 100644 packages/database/prisma/migrations/migration_lock.toml create mode 100644 packages/database/prisma/schema.prisma create mode 100644 packages/database/prisma/sql/createAutoRole.sql create mode 100644 packages/database/prisma/sql/createTag.sql create mode 100644 packages/database/prisma/sql/findTagByTitle.sql create mode 100644 packages/database/prisma/sql/removeAutoRole.sql create mode 100644 packages/database/src/helpers/getGuild.ts create mode 100644 packages/database/src/helpers/index.ts create mode 100644 packages/database/src/index.ts create mode 100644 packages/database/tsconfig.json create mode 100644 packages/error-handler/package.json create mode 100644 packages/error-handler/src/WyvernErrorHandler.ts create mode 100644 packages/error-handler/src/index.ts create mode 100644 packages/error-handler/tsconfig.json create mode 100644 packages/error-handler/tsconfig.tsbuildinfo create mode 100644 packages/eslint-config/README.md create mode 100644 packages/eslint-config/library.js create mode 100644 packages/eslint-config/next.js create mode 100644 packages/eslint-config/package.json create mode 100644 packages/eslint-config/react-internal.js create mode 100644 packages/markdown/jest.config.js create mode 100644 packages/markdown/package.json create mode 100644 packages/markdown/src/formatters/bold.ts create mode 100644 packages/markdown/src/formatters/codeblock.ts create mode 100644 packages/markdown/src/formatters/heading.ts create mode 100644 packages/markdown/src/formatters/italic.ts create mode 100644 packages/markdown/src/formatters/mention.ts create mode 100644 packages/markdown/src/formatters/quote.ts create mode 100644 packages/markdown/src/formatters/spoiler.ts create mode 100644 packages/markdown/src/formatters/strikethrough.ts create mode 100644 packages/markdown/src/formatters/underline.ts create mode 100644 packages/markdown/src/index.ts create mode 100644 packages/markdown/tests/markdown.test.ts create mode 100644 packages/markdown/tsconfig.json create mode 100644 packages/markdown/tsconfig.tsbuildinfo create mode 100644 packages/plugin-custom-logger/package.json create mode 100644 packages/plugin-custom-logger/src/foo.ts create mode 100644 packages/plugin-custom-logger/src/index.ts create mode 100644 packages/plugin-custom-logger/src/lib/Logger.ts create mode 100644 packages/plugin-custom-logger/src/lib/LoggerLevel.ts create mode 100644 packages/plugin-custom-logger/src/lib/LoggerStyle.ts create mode 100644 packages/plugin-custom-logger/src/lib/LoggerTimestamp.ts create mode 100644 packages/plugin-custom-logger/src/register.ts create mode 100644 packages/plugin-custom-logger/tsconfig.json create mode 100644 packages/plugin-custom-logger/tsconfig.tsbuildinfo create mode 100644 packages/typescript-config/base.json create mode 100644 packages/typescript-config/nextjs.json create mode 100644 packages/typescript-config/package.json create mode 100644 packages/typescript-config/react-library.json create mode 100644 packages/urban-dictionary/package.json create mode 100644 packages/urban-dictionary/src/UrbanDictionary.ts create mode 100644 packages/urban-dictionary/src/index.ts create mode 100644 packages/urban-dictionary/tsconfig.json create mode 100644 packages/urban-dictionary/tsconfig.tsbuildinfo create mode 100644 turbo.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96fab4f --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# Dependencies +node_modules +.pnp +.pnp.js + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage + +# Turbo +.turbo + +# Vercel +.vercel + +# Build Outputs +.next/ +out/ +build +dist + + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Misc +.DS_Store +*.pem diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..675ffc2 --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +# Turborepo starter + +This is an official starter Turborepo. + +## Using this example + +Run the following command: + +```sh +npx create-turbo@latest +``` + +## What's inside? + +This Turborepo includes the following packages/apps: + +### Apps and Packages + +- `docs`: a [Next.js](https://nextjs.org/) app +- `web`: another [Next.js](https://nextjs.org/) app +- `@wyvern/ui`: a stub React component library shared by both `web` and `docs` applications +- `@wyvern/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@wyvern/typescript-config`: `tsconfig.json`s used throughout the monorepo + +Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). + +### Utilities + +This Turborepo has some additional tools already setup for you: + +- [TypeScript](https://www.typescriptlang.org/) for static type checking +- [ESLint](https://eslint.org/) for code linting +- [Prettier](https://prettier.io) for code formatting + +### Build + +To build all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm build +``` + +### Develop + +To develop all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm dev +``` + +### Remote Caching + +Turborepo can use a technique known as [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. + +By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands: + +``` +cd my-turborepo +npx turbo login +``` + +This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). + +Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: + +``` +npx turbo link +``` + +## Useful Links + +Learn more about the power of Turborepo: + +- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) +- [Caching](https://turbo.build/repo/docs/core-concepts/caching) +- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) +- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) +- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) +- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) diff --git a/apps/bot/.sapphire/templates/arguments/argument.ts b/apps/bot/.sapphire/templates/arguments/argument.ts new file mode 100644 index 0000000..5493fc0 --- /dev/null +++ b/apps/bot/.sapphire/templates/arguments/argument.ts @@ -0,0 +1,15 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Argument } from '@sapphire/framework'; + +@ApplyOptions({}) +export class UserArgument extends Argument { + public override run(parameter: string) { + return this.ok(parameter); + } +} + +declare module '@sapphire/framework' { + interface ArgType { + /*{{name}}*/: string; + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/commands/context-menu-command.ts b/apps/bot/.sapphire/templates/commands/context-menu-command.ts new file mode 100644 index 0000000..73e2e17 --- /dev/null +++ b/apps/bot/.sapphire/templates/commands/context-menu-command.ts @@ -0,0 +1,20 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { ApplicationCommandType } from 'discord.js'; + +@ApplyOptions({ + description: 'A basic contextMenu command' +}) +export class UserCommand extends Command { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerContextMenuCommand((builder) => + builder // + .setName(this.name) + .setType(ApplicationCommandType.Message) + ); + } + + public override async contextMenuRun(interaction: Command.ContextMenuCommandInteraction) { + return interaction.reply({ content: 'Hello world!' }); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/commands/message-command.ts b/apps/bot/.sapphire/templates/commands/message-command.ts new file mode 100644 index 0000000..9e5f549 --- /dev/null +++ b/apps/bot/.sapphire/templates/commands/message-command.ts @@ -0,0 +1,12 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import type { Message } from 'discord.js'; + +@ApplyOptions({ + description: 'A basic command' +}) +export class UserCommand extends Command { + public override async messageRun(message: Message) { + return message.channel.send('Hello world!'); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/commands/slash-command.ts b/apps/bot/.sapphire/templates/commands/slash-command.ts new file mode 100644 index 0000000..df1e49a --- /dev/null +++ b/apps/bot/.sapphire/templates/commands/slash-command.ts @@ -0,0 +1,19 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; + +@ApplyOptions({ + description: 'A basic slash command' +}) +export class UserCommand extends Command { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand((builder) => + builder // + .setName(this.name) + .setDescription(this.description) + ); + } + + public override async chatInputRun(interaction: Command.ChatInputCommandInteraction) { + return interaction.reply({ content: 'Hello world!' }); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/interaction-handlers/autocomplete-interaction-handler.ts b/apps/bot/.sapphire/templates/interaction-handlers/autocomplete-interaction-handler.ts new file mode 100644 index 0000000..377f825 --- /dev/null +++ b/apps/bot/.sapphire/templates/interaction-handlers/autocomplete-interaction-handler.ts @@ -0,0 +1,30 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { InteractionHandler, InteractionHandlerTypes } from '@sapphire/framework'; +import { AutocompleteInteraction, type ApplicationCommandOptionChoiceData } from 'discord.js'; + +@ApplyOptions({ + interactionHandlerType: InteractionHandlerTypes.Autocomplete +}) +export class AutocompleteHandler extends InteractionHandler { + public override async run(interaction: AutocompleteInteraction, result: ApplicationCommandOptionChoiceData[]) { + return interaction.respond(result); + } + + public override async parse(interaction: AutocompleteInteraction) { + // Only run this interaction for the command with ID '1000000000000000000' + if (interaction.commandId !== '1000000000000000000') return this.none(); + // Get the focussed (current) option + const focusedOption = interaction.options.getFocused(true); + // Ensure that the option name is one that can be autocompleted, or return none if not. + switch (focusedOption.name) { + case 'search': { + // Search your API or similar. This is example code! + const searchResult = await myApi.searchForSomething(focusedOption.value); + // Map the search results to the structure required for Autocomplete + return this.some(searchResult.map((match) => ({ name: match.name, value: match.key }))); + } + default: + return this.none(); + } + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/interaction-handlers/button-interaction-handler.ts b/apps/bot/.sapphire/templates/interaction-handlers/button-interaction-handler.ts new file mode 100644 index 0000000..f98d51a --- /dev/null +++ b/apps/bot/.sapphire/templates/interaction-handlers/button-interaction-handler.ts @@ -0,0 +1,22 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { InteractionHandler, InteractionHandlerTypes } from '@sapphire/framework'; +import type { ButtonInteraction } from 'discord.js'; + +@ApplyOptions({ + interactionHandlerType: InteractionHandlerTypes.Button +}) +export class ButtonHandler extends InteractionHandler { + public async run(interaction: ButtonInteraction) { + await interaction.reply({ + content: 'Hello from a button interaction handler!', + // Let's make it so only the person who pressed the button can see this message! + ephemeral: true + }); + } + + public override parse(interaction: ButtonInteraction) { + if (interaction.customId !== 'my-awesome-button') return this.none(); + + return this.some(); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/interaction-handlers/modal-interaction-handler.ts b/apps/bot/.sapphire/templates/interaction-handlers/modal-interaction-handler.ts new file mode 100644 index 0000000..7ba93ac --- /dev/null +++ b/apps/bot/.sapphire/templates/interaction-handlers/modal-interaction-handler.ts @@ -0,0 +1,21 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { InteractionHandler, InteractionHandlerTypes } from '@sapphire/framework'; +import type { ModalSubmitInteraction } from 'discord.js'; + +@ApplyOptions({ + interactionHandlerType: InteractionHandlerTypes.ModalSubmit +}) +export class ModalHandler extends InteractionHandler { + public async run(interaction: ModalSubmitInteraction) { + await interaction.reply({ + content: 'Thank you for submitting the form!', + ephemeral: true + }); + } + + public override parse(interaction: ModalSubmitInteraction) { + if (interaction.customId !== 'hello-popup') return this.none(); + + return this.some(); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/interaction-handlers/select-menu-interaction-handler.ts b/apps/bot/.sapphire/templates/interaction-handlers/select-menu-interaction-handler.ts new file mode 100644 index 0000000..fe8359f --- /dev/null +++ b/apps/bot/.sapphire/templates/interaction-handlers/select-menu-interaction-handler.ts @@ -0,0 +1,21 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { InteractionHandler, InteractionHandlerTypes } from '@sapphire/framework'; +import type { StringSelectMenuInteraction } from 'discord.js'; + +@ApplyOptions({ + interactionHandlerType: InteractionHandlerTypes.SelectMenu +}) +export class MenuHandler extends InteractionHandler { + public override async run(interaction: StringSelectMenuInteraction) { + await interaction.reply({ + // Remember how we can have multiple values? Let's get the first one! + content: `You selected: ${interaction.values[0]}` + }); + } + + public override parse(interaction: StringSelectMenuInteraction) { + if (interaction.customId !== 'my-echo-select') return this.none(); + + return this.some(); + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/listeners/listener.ts b/apps/bot/.sapphire/templates/listeners/listener.ts new file mode 100644 index 0000000..93bcdc1 --- /dev/null +++ b/apps/bot/.sapphire/templates/listeners/listener.ts @@ -0,0 +1,7 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Listener } from '@sapphire/framework'; + +@ApplyOptions({}) +export class UserEvent extends Listener { + public override run() {} +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/preconditions/precondition.ts b/apps/bot/.sapphire/templates/preconditions/precondition.ts new file mode 100644 index 0000000..3c8b8fb --- /dev/null +++ b/apps/bot/.sapphire/templates/preconditions/precondition.ts @@ -0,0 +1,22 @@ +import { Precondition } from '@sapphire/framework'; +import type { ChatInputCommandInteraction, ContextMenuCommandInteraction, Message } from 'discord.js'; + +export class UserPrecondition extends Precondition { + public override messageRun(message: Message) { + return this.ok(); + } + + public override chatInputRun(interaction: ChatInputCommandInteraction) { + return this.ok(); + } + + public override contextMenuRun(interaction: ContextMenuCommandInteraction) { + return this.ok(); + } +} + +declare module '@sapphire/framework' { + interface Preconditions { + /*{{name}}*/: never; + } +} \ No newline at end of file diff --git a/apps/bot/.sapphire/templates/routes/route.ts b/apps/bot/.sapphire/templates/routes/route.ts new file mode 100644 index 0000000..cd932e9 --- /dev/null +++ b/apps/bot/.sapphire/templates/routes/route.ts @@ -0,0 +1,15 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { methods, Route, type ApiRequest, type ApiResponse } from '@sapphire/plugin-api'; + +@ApplyOptions({ + route: '/*{{name}}*/' +}) +export class UserRoute extends Route { + public [methods.GET](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Hello World' }); + } + + public [methods.POST](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Hello World' }); + } +} \ No newline at end of file diff --git a/apps/bot/README.md b/apps/bot/README.md new file mode 100644 index 0000000..73ffd03 --- /dev/null +++ b/apps/bot/README.md @@ -0,0 +1,32 @@ +# TypeScript Complete Sapphire Bot example + +This is a more complete setup of a Discord bot using the [sapphire framework][sapphire] written in TypeScript. + +It is similar to the [starter setup](../with-typescript-starter/), but adds more data structures and a more complete setup. + +## How to use it? + +### Prerequisite + +```sh +npm install +``` + +### Development + +This example can be run with `tsc-watch` to watch the files and automatically restart your bot. + +```sh +npm run watch:start +``` + +### Production + +You can also run the bot with `npm dev`, this will first build your code and then run `node ./dist/index.js`. But this is not the recommended way to run a bot in production. + +## License + +Dedicated to the public domain via the [Unlicense], courtesy of the Sapphire Community and its contributors. + +[sapphire]: https://github.com/sapphiredev/framework +[unlicense]: https://github.com/sapphiredev/examples/blob/main/LICENSE.md diff --git a/apps/bot/package.json b/apps/bot/package.json new file mode 100644 index 0000000..9d65d52 --- /dev/null +++ b/apps/bot/package.json @@ -0,0 +1,71 @@ +{ + "name": "@wyvern/bot", + "version": "1.0.0", + "main": "dist/index.js", + "author": "@sapphire", + "license": "UNLICENSE", + "type": "module", + "dependencies": { + "@wyvern/config": "*", + "@wyvern/database": "*", + "@wyvern/plugin-custom-logger": "*", + "@wyvern/urban-dictionary": "*", + "@wyvern/error-handler": "*", + "@sapphire/decorators": "^6.0.4", + "@sapphire/discord-utilities": "^3.2.2", + "@sapphire/discord.js-utilities": "7.1.6", + "@sapphire/fetch": "^3.0.2", + "@sapphire/framework": "^5.0.7", + "@sapphire/plugin-api": "^6.1.1", + "@sapphire/plugin-editable-commands": "^4.0.2", + "@sapphire/plugin-logger": "^4.0.2", + "@sapphire/plugin-subcommands": "^6.0.3", + "@sapphire/string-store": "^1.0.1", + "@sapphire/time-utilities": "^1.7.12", + "@sapphire/type": "^2.4.4", + "@sapphire/utilities": "^3.15.3", + "@skyra/env-utilities": "^1.3.0", + "colorette": "^2.0.20", + "discord.js": "^14.14.1" + }, + "devDependencies": { + "@sapphire/cli": "^1.9.3", + "@sapphire/prettier-config": "^2.0.0", + "@sapphire/ts-config": "^5.0.0", + "@types/node": "^20.11.5", + "@types/ws": "^8.5.10", + "npm-run-all2": "^6.1.1", + "prettier": "^3.2.4", + "tsc-watch": "^6.0.4", + "typescript": "~5.4.5", + "tsup": "latest" + }, + "scripts": { + "sapphire": "sapphire", + "generate": "sapphire generate", + "build": "tsup", + "watch": "tsup --watch", + "start": "node dist/index.js", + "dev": "tsup --watch --onSuccess \"node ./dist/index.js\"", + "watch:start": "tsc-watch --onSuccess \"node ./dist/index.js\"", + "format": "prettier --write \"src/**/*.ts\"", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "imports": { + "#lib/structures": "./dist/lib/structures/index.js", + "#lib/interfaces": "./dist/lib/interfaces/index.js", + "#lib/parsers": "./dist/lib/parsers/index.js", + "#lib/errors": "./dist/lib/errors/index.js", + "#lib/managers": "./dist/lib/managers/index.js", + "#lib/utils": "./dist/lib/utils.js", + "#lib/config": "./dist/lib/config.js", + "#lib/constants": "./dist/lib/constants.js", + "#lib/types": "./dist/lib/types.js", + "#lib/customIds": "./dist/lib/customIdTypes/index.js", + "#lib/markdown": "./dist/lib/markdown/index.js", + "#drizzle": "./dist/drizzle/schema.js", + "#prisma": "./dist/lib/prisma.js", + "#stringFormatters": "./dist/lib/stringFormatters/index.js" + }, + "prettier": "@sapphire/prettier-config" +} diff --git a/apps/bot/sapphire.toml b/apps/bot/sapphire.toml new file mode 100644 index 0000000..3c2d0e7 --- /dev/null +++ b/apps/bot/sapphire.toml @@ -0,0 +1,38 @@ +[project] +language = "ts" +module_system = "cjs" +base = "src" + +[variables] + +[categories] +arguments = { source_path = "arguments", target_path = "arguments" } +commands = { source_path = "commands", target_path = "commands" } +interaction-handlers = { source_path = "interaction-handlers", target_path = "interaction-handlers" } +listeners = { source_path = "listeners", target_path = "listeners" } +preconditions = { source_path = "preconditions", target_path = "preconditions" } +routes = { source_path = "routes", target_path = "routes" } + +[templates.arguments] +argument = { aliases = ["a", "arg"] } + +[templates.commands] +context-menu-command = { aliases = ["cmc", "context", "contextmenu", "contextmenucommand"] } +message-command = { aliases = ["mc", "message", "messagecommand"] } +slash-command = { aliases = ["sc", "command", "slash", "slashcommand"] } + +[templates.interaction-handlers] +autocomplete-interaction-handler = { aliases = ["aih", "auto", "autocomplete"] } +button-interaction-handler = { aliases = ["bih", "button"] } +modal-interaction-handler = { aliases = ["mih", "modal"] } +select-menu-interaction-handler = { aliases = ["smih", "select"] } + +[templates.listeners] +listener = { aliases = ["l"] } + +[templates.preconditions] +precondition = { aliases = ["p"] } + +[templates.routes] +route = { aliases = ["r"] } + diff --git a/apps/bot/src/commands/Admin/Admin.ts b/apps/bot/src/commands/Admin/Admin.ts new file mode 100644 index 0000000..3fde311 --- /dev/null +++ b/apps/bot/src/commands/Admin/Admin.ts @@ -0,0 +1,24 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { adminErrorTest, adminSyncDatabase } from './_index.js'; + +@ApplyOptions({ + description: 'Admin commands', + preconditions: ['OwnerOnly'], + subcommands: [ + { name: 'error_test', chatInputRun: adminErrorTest }, + { name: 'sync_database', chatInputRun: adminSyncDatabase } + ] +}) +export class UserCommand extends Subcommand { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand((builder) => + builder // + .setName(this.name) + .setDescription(this.description) + .addSubcommand((b) => b.setName('error_test').setDescription('Throw an error')) + .addSubcommand((b) => b.setName('sync_database').setDescription('Sync the database')) + ); + } +} diff --git a/apps/bot/src/commands/Admin/_adminErrorTest.ts b/apps/bot/src/commands/Admin/_adminErrorTest.ts new file mode 100644 index 0000000..89b0bc1 --- /dev/null +++ b/apps/bot/src/commands/Admin/_adminErrorTest.ts @@ -0,0 +1,7 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; + +export function adminErrorTest(_i: Subcommand.ChatInputCommandInteraction) { + const a: string = null!; + + a!.charAt(1); +} diff --git a/apps/bot/src/commands/Admin/_adminSyncDatabase.ts b/apps/bot/src/commands/Admin/_adminSyncDatabase.ts new file mode 100644 index 0000000..b85a131 --- /dev/null +++ b/apps/bot/src/commands/Admin/_adminSyncDatabase.ts @@ -0,0 +1,44 @@ +import { InternalError } from '#lib/errors'; +import { container, Result } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { prismaClient } from '@wyvern/database'; + +export async function adminSyncDatabase(i: Subcommand.ChatInputCommandInteraction) { + const res = await Result.fromAsync(container.client.guilds.fetch()); + const guildIds = res.match({ + ok: (x) => x.map((g) => g.id), + err: (e) => { + throw new InternalError(`${e}`); + } + }); + + const guildCreateManyArgs = guildIds.map((id) => { + return { guildId: id }; + }); + + const welcomeMessageCreateManyArgs = guildIds.map((id) => { + return { guildId: id }; + }); + + const leaveMessageCreateManyArgs = guildIds.map((id) => { + return { guildId: id }; + }); + + await prismaClient.guild.createMany({ + data: guildCreateManyArgs, + skipDuplicates: true + }); + + await prismaClient.guildWelcomeMessage.createMany({ + data: welcomeMessageCreateManyArgs + }); + + await prismaClient.guildLeaveMessage.createMany({ + data: leaveMessageCreateManyArgs + }); + + await i.reply({ + content: 'Synced database', + ephemeral: true + }); +} diff --git a/apps/bot/src/commands/Admin/_index.ts b/apps/bot/src/commands/Admin/_index.ts new file mode 100644 index 0000000..177a390 --- /dev/null +++ b/apps/bot/src/commands/Admin/_index.ts @@ -0,0 +1,2 @@ +export * from './_adminErrorTest.js'; +export * from './_adminSyncDatabase.js'; diff --git a/apps/bot/src/commands/Info/ping.ts b/apps/bot/src/commands/Info/ping.ts new file mode 100644 index 0000000..e093322 --- /dev/null +++ b/apps/bot/src/commands/Info/ping.ts @@ -0,0 +1,64 @@ +import { createEmbed } from '#lib/utils'; + +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { prismaClient } from '@wyvern/database'; +import { codeBlock, Status } from 'discord.js'; + +@ApplyOptions({ + description: 'ping pong' +}) +export class UserCommand extends Command { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand({ + name: this.name, + description: this.description + }); + } + + public override async chatInputRun(i: Command.ChatInputCommandInteraction) { + const { client } = this.container; + const dbTime = performance.now(); + await prismaClient.$queryRaw`SELECT 1`; + const dbTiming = performance.now() - dbTime; + + const waitEmbed = createEmbed(i.user).setDescription('🏓 Pong!...'); + const message = await i.reply({ embeds: [waitEmbed] }); + const thisServerShard = client.ws.shards.get(i.guild!.shardId); + + if (!thisServerShard) throw 'Unable to get server shard'; + + const pingMessage = createEmbed(i.user).addFields([ + { + name: 'Host Latency', + value: codeBlock('yaml', client.ws.ping > 0 ? `${Math.floor(client.ws.ping)}ms` : 'Calculating...'), + inline: true + }, + { + name: 'Client Latency', + value: codeBlock('yaml', `${Math.floor(message.createdTimestamp - i.createdTimestamp)}ms`), + inline: true + }, + { + name: 'Database Latency', + value: codeBlock('yaml', `${Math.floor(dbTiming)}ms`), + inline: true + }, + { + name: 'Websocket', + value: codeBlock('yaml', `${Status[thisServerShard.status]}`), + inline: true + }, + { + name: 'Shard', + value: codeBlock( + 'yaml', + `${thisServerShard.id}/${client.ws.shards.size} (${thisServerShard.ping > 0 ? `${Math.floor(thisServerShard.ping)}ms` : 'Calculating...'})` + ), + inline: true + } + ]); + + await message.edit({ embeds: [pingMessage] }); + } +} diff --git a/apps/bot/src/commands/Mod/Report.ts b/apps/bot/src/commands/Mod/Report.ts new file mode 100644 index 0000000..fda2027 --- /dev/null +++ b/apps/bot/src/commands/Mod/Report.ts @@ -0,0 +1,81 @@ +import { InternalError } from '#lib/errors'; +import { compressCustomId } from '#lib/utils'; +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; + +import { + ActionRowBuilder, + InteractionContextType, + Message, + MessageContextMenuCommandInteraction, + ModalBuilder, + TextInputBuilder, + User, + UserContextMenuCommandInteraction +} from 'discord.js'; +import { ReportMessageCustomIdParams, ReportUserCustomIdParams } from 'src/lib/customIdParams/report.js'; + +@ApplyOptions({ + description: 'Report', + preconditions: [{ name: 'RequiredSetting', context: { setting: 'reportChannel' } }] +}) +export class UserCommand extends Command { + public override registerApplicationCommands(registry: Command.Registry) { + // register user context menu + registry.registerContextMenuCommand((b) => + b // + .setName('Report User') + .setType(2) // User context menu - idk why i cant use ApplicationCommandType.User here + .setContexts(InteractionContextType.Guild) + ); + + // register message context menu + registry.registerContextMenuCommand((b) => + b // + .setName('Report Message') + .setType(3) // Message context menu - idk why i cant use ApplicationCommandType.Message here + .setContexts(InteractionContextType.Guild) + ); + } + + public override async contextMenuRun(i: Command.ContextMenuCommandInteraction) { + if (i.isMessageContextMenuCommand()) this._messageReport(i.targetMessage, i); + else if (i.isUserContextMenuCommand()) this._userReport(i.targetUser, i); + else throw new InternalError('Interaction was an unexpected type'); + } + + private async _messageReport(msg: Message, i: MessageContextMenuCommandInteraction) { + const row = new ActionRowBuilder().setComponents([ + new TextInputBuilder().setLabel('Reason').setPlaceholder('Why are you reporting this message').setRequired(true).setCustomId('reason') + ]); + + const idRes = compressCustomId({ + name: 'report-msg', + channelId: msg.channelId, + messageId: msg.id + }); + + if (idRes.isErr()) throw new InternalError(idRes.unwrapErr()); + + const modal = new ModalBuilder().setTitle('Report Message').setComponents(row).setCustomId(idRes.unwrap()); + + await i.showModal(modal); + } + + private async _userReport(user: User, i: UserContextMenuCommandInteraction) { + const row = new ActionRowBuilder().setComponents([ + new TextInputBuilder().setLabel('Reason').setPlaceholder('Why are you reporting this user').setRequired(true).setCustomId('reason') + ]); + + const idRes = compressCustomId({ + name: 'report-user', + userId: user.id + }); + + if (idRes.isErr()) throw new InternalError(idRes.unwrapErr()); + + const modal = new ModalBuilder().setTitle('Report User').setComponents(row).setCustomId(idRes.unwrap()); + + await i.showModal(modal); + } +} diff --git a/apps/bot/src/commands/Settings/Settings.ts b/apps/bot/src/commands/Settings/Settings.ts new file mode 100644 index 0000000..5811620 --- /dev/null +++ b/apps/bot/src/commands/Settings/Settings.ts @@ -0,0 +1,137 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { + autoRole_create, + autoRole_remove, + reportChannel_set, + reportChannel_unset, + welcomeMessage_disable, + welcomeMessage_enable, + welcomeMessage_preview, + welcomeMessage_setColor, + welcomeMessage_setMessage, + welcomeMessage_setTitle +} from './_index.js'; +import { ChannelType } from 'discord.js'; + +@ApplyOptions({ + description: 'Tag commands', + requiredUserPermissions: ['ManageGuild'], + subcommands: [ + { + name: 'auto_role', + type: 'group', + entries: [ + { name: 'create', chatInputRun: autoRole_create }, + { name: 'remove', chatInputRun: autoRole_remove } + ] + }, + { + name: 'report_channel', + type: 'group', + entries: [ + { name: 'set', chatInputRun: reportChannel_set }, + { name: 'unset', chatInputRun: reportChannel_unset } + ] + }, + { + name: 'welcome_message', + type: 'group', + entries: [ + { name: 'enable', chatInputRun: welcomeMessage_enable }, + { name: 'disable', chatInputRun: welcomeMessage_disable }, + { name: 'preview', chatInputRun: welcomeMessage_preview }, + + { name: 'set_title', chatInputRun: welcomeMessage_setTitle }, + { name: 'set_message', chatInputRun: welcomeMessage_setMessage }, + { name: 'set_color', chatInputRun: welcomeMessage_setColor } + ] + } + ] +}) +export class UserCommand extends Subcommand { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand((builder) => + builder // + .setName(this.name) + .setDescription(this.description) + .addSubcommandGroup((b) => + b // + .setName('auto_role') + .setDescription('Auto Role commands') + .addSubcommand((b) => + b // + .setName('create') + .setDescription('Create an auto role') + .addRoleOption((b) => b.setName('role').setDescription('The role to create').setRequired(true)) + ) + .addSubcommand((b) => + b // + .setName('remove') + .setDescription('Remove an auto role') + .addRoleOption((b) => b.setName('role').setDescription('The role to remove').setRequired(true)) + ) + ) + .addSubcommandGroup((b) => + b // + .setName('report_channel') + .setDescription('report channel commands') + .addSubcommand((b) => + b // + .setName('set') + .setDescription('Set the report channel') + .addChannelOption((b) => + b.setName('channel').setDescription('The channel to set').setRequired(true).addChannelTypes(ChannelType.GuildText) + ) + ) + .addSubcommand((b) => + b // + .setName('unset') + .setDescription('Unset the report channel') + ) + ) + .addSubcommandGroup((b) => + b // + .setName('welcome_message') + .setDescription('Welcome message commands') + .addSubcommand((b) => b.setName('enable').setDescription('Enable the welcome message')) + .addSubcommand((b) => b.setName('disable').setDescription('Disable the welcome message')) + .addSubcommand((b) => b.setName('preview').setDescription('Preview the welcome message')) + .addSubcommand((b) => + b // + .setName('set_title') + .setDescription('Set the title of the welcome message') + .addStringOption((b) => + b // + .setName('title') + .setDescription('The title') + .setRequired(true) + ) + ) + .addSubcommand((b) => + b // + .setName('set_message') + .setDescription('Set the message of the welcome message') + .addStringOption((b) => + b // + .setName('message') + .setDescription('The message') + .setRequired(true) + ) + ) + .addSubcommand((b) => + b // + .setName('set_color') + .setDescription('Set the color of the welcome message') + .addStringOption((b) => + b // + .setName('color') + .setDescription('The color') + .setRequired(true) + ) + ) + ) + ); + } +} diff --git a/apps/bot/src/commands/Settings/_index.ts b/apps/bot/src/commands/Settings/_index.ts new file mode 100644 index 0000000..8bcbf6e --- /dev/null +++ b/apps/bot/src/commands/Settings/_index.ts @@ -0,0 +1,12 @@ +export * from './autoRole/_create.js'; +export * from './autoRole/_remove.js'; + +export * from './reportChannel/_set.js'; +export * from './reportChannel/_unset.js'; + +export * from './welcomeMessage/_enable.js'; +export * from './welcomeMessage/_disable.js'; +export * from './welcomeMessage/_setTitle.js'; +export * from './welcomeMessage/_setMessage.js'; +export * from './welcomeMessage/_setColor.js'; +export * from './welcomeMessage/_preview.js'; diff --git a/apps/bot/src/commands/Settings/autoRole/_create.ts b/apps/bot/src/commands/Settings/autoRole/_create.ts new file mode 100644 index 0000000..ef42c26 --- /dev/null +++ b/apps/bot/src/commands/Settings/autoRole/_create.ts @@ -0,0 +1,27 @@ +import { CommandFailedError, InternalError } from '#lib/errors'; +import { createEmbed } from '#lib/utils'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { createAutoRole, getGuild, prismaClient } from '@wyvern/database'; +import { mention } from '@wyvern/markdown'; + +export async function autoRole_create(i: Subcommand.ChatInputCommandInteraction) { + const role = i.options.getRole('role', true); + + const guildRes = await getGuild(i.guild!.id); + + if (guildRes.isErr()) { + throw new InternalError(guildRes.unwrapErr().message); + } + + const { autoRoles: existingRoles } = guildRes.unwrap(); + + if (existingRoles.includes(role.id)) throw new CommandFailedError('That role already exists'); + + await prismaClient.$queryRawTyped(createAutoRole(role.id, i.guild!.id)); + + const embed = createEmbed(i.user) + .setTitle('Auto Role Created') + .setDescription(`${mention('role', role.id)} will now be given to new members!`); + + await i.reply({ embeds: [embed] }); +} diff --git a/apps/bot/src/commands/Settings/autoRole/_remove.ts b/apps/bot/src/commands/Settings/autoRole/_remove.ts new file mode 100644 index 0000000..61524cb --- /dev/null +++ b/apps/bot/src/commands/Settings/autoRole/_remove.ts @@ -0,0 +1,27 @@ +import { CommandFailedError, InternalError } from '#lib/errors'; +import { createEmbed } from '#lib/utils'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { removeAutoRole, getGuild, prismaClient } from '@wyvern/database'; +import { mention } from '@wyvern/markdown'; + +export async function autoRole_remove(i: Subcommand.ChatInputCommandInteraction) { + const role = i.options.getRole('role', true); + + const guildRes = await getGuild(i.guild!.id); + + if (guildRes.isErr()) { + throw new InternalError(guildRes.unwrapErr().message); + } + + const { autoRoles: existingRoles } = guildRes.unwrap(); + + if (!existingRoles.includes(role.id)) throw new CommandFailedError("That role isn't configured as an auto role"); + + await prismaClient.$queryRawTyped(removeAutoRole(role.id, i.guild!.id)); + + const embed = createEmbed(i.user, 'error') + .setTitle('Auto Role Removed') + .setDescription(`${mention('role', role.id)} will no longer be given to new members!`); + + await i.reply({ embeds: [embed] }); +} diff --git a/apps/bot/src/commands/Settings/reportChannel/_set.ts b/apps/bot/src/commands/Settings/reportChannel/_set.ts new file mode 100644 index 0000000..3ba740e --- /dev/null +++ b/apps/bot/src/commands/Settings/reportChannel/_set.ts @@ -0,0 +1,28 @@ +import { CommandFailedError } from '#lib/errors'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { prismaClient } from '@wyvern/database'; +import { TextChannel } from 'discord.js'; +import { mention } from '@wyvern/markdown'; + +export async function reportChannel_set(i: Subcommand.ChatInputCommandInteraction) { + const channel = i.options.getChannel('channel', true); + const guild = i.guild!; + + if (!(channel instanceof TextChannel)) throw new CommandFailedError('Channel is not a text channel'); + + const perms = channel.permissionsFor(guild.members.me!); + + if (!perms.any(['SendMessages', 'EmbedLinks'])) throw new CommandFailedError("I don't have the required permissions for that channel"); + + await prismaClient.guild.update({ + data: { + reportChannel: channel.id + }, + where: { id: guild.id } + }); + + await i.reply({ + content: `User reports will now be sent to ${mention('channel', channel.id)}`, + ephemeral: true + }); +} diff --git a/apps/bot/src/commands/Settings/reportChannel/_unset.ts b/apps/bot/src/commands/Settings/reportChannel/_unset.ts new file mode 100644 index 0000000..85ed87f --- /dev/null +++ b/apps/bot/src/commands/Settings/reportChannel/_unset.ts @@ -0,0 +1,16 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { prismaClient } from '@wyvern/database'; + +export async function reportChannel_unset(i: Subcommand.ChatInputCommandInteraction) { + await prismaClient.guild.update({ + data: { + reportChannel: null + }, + where: { id: i.guild!.id } + }); + + await i.reply({ + content: `User reports will no longer be sent`, + ephemeral: true + }); +} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_disable.ts b/apps/bot/src/commands/Settings/welcomeMessage/_disable.ts new file mode 100644 index 0000000..2f23825 --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_disable.ts @@ -0,0 +1,2 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +export async function welcomeMessage_disable(i: Subcommand.ChatInputCommandInteraction) {} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_enable.ts b/apps/bot/src/commands/Settings/welcomeMessage/_enable.ts new file mode 100644 index 0000000..bff23c7 --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_enable.ts @@ -0,0 +1,2 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +export async function welcomeMessage_enable(i: Subcommand.ChatInputCommandInteraction) {} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_preview.ts b/apps/bot/src/commands/Settings/welcomeMessage/_preview.ts new file mode 100644 index 0000000..2d8c329 --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_preview.ts @@ -0,0 +1,26 @@ +import { InternalError } from '#lib/errors'; +import { createEmbed, formatWelcomeLeaveMessage } from '#lib/utils'; +import { Result } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { isNullish } from '@sapphire/utilities'; +import { getGuild, Prisma, prismaClient } from '@wyvern/database'; +import { ColorResolvable, GuildMember } from 'discord.js'; +export async function welcomeMessage_preview(i: Subcommand.ChatInputCommandInteraction) { + await i.deferReply({ ephemeral: true }); + + const res = await prismaClient.guild.findFirstOrThrow({ + where: { guildId: i.guild!.id }, + include: { guildWelcomeMessage: true } + }); + + const { title, description, embedColor } = res!.guildWelcomeMessage!; + + const embed = createEmbed(i.user) + .setTitle(formatWelcomeLeaveMessage(title, i.member as GuildMember, i.guild!)) + .setDescription(formatWelcomeLeaveMessage(description, i.member as GuildMember, i.guild!)) + .setColor(embedColor as ColorResolvable); + + await i.editReply({ + embeds: [embed] + }); +} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_setColor.ts b/apps/bot/src/commands/Settings/welcomeMessage/_setColor.ts new file mode 100644 index 0000000..1b93fda --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_setColor.ts @@ -0,0 +1,2 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +export async function welcomeMessage_setColor(i: Subcommand.ChatInputCommandInteraction) {} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_setMessage.ts b/apps/bot/src/commands/Settings/welcomeMessage/_setMessage.ts new file mode 100644 index 0000000..8f4c1ee --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_setMessage.ts @@ -0,0 +1,2 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +export async function welcomeMessage_setMessage(i: Subcommand.ChatInputCommandInteraction) {} diff --git a/apps/bot/src/commands/Settings/welcomeMessage/_setTitle.ts b/apps/bot/src/commands/Settings/welcomeMessage/_setTitle.ts new file mode 100644 index 0000000..13a9973 --- /dev/null +++ b/apps/bot/src/commands/Settings/welcomeMessage/_setTitle.ts @@ -0,0 +1,2 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +export async function welcomeMessage_setTitle(i: Subcommand.ChatInputCommandInteraction) {} diff --git a/apps/bot/src/commands/Tag/Tag.ts b/apps/bot/src/commands/Tag/Tag.ts new file mode 100644 index 0000000..e400c89 --- /dev/null +++ b/apps/bot/src/commands/Tag/Tag.ts @@ -0,0 +1,23 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { createTag } from './_index.js'; + +@ApplyOptions({ + description: 'Tag commands', + subcommands: [{ name: 'create', chatInputRun: createTag }] +}) +export class UserCommand extends Subcommand { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand((builder) => + builder // + .setName(this.name) + .setDescription(this.description) + .addSubcommand((b) => + b // + .setName('create') + .setDescription('Create a tag') + ) + ); + } +} diff --git a/apps/bot/src/commands/Tag/_createTag.ts b/apps/bot/src/commands/Tag/_createTag.ts new file mode 100644 index 0000000..95cee3a --- /dev/null +++ b/apps/bot/src/commands/Tag/_createTag.ts @@ -0,0 +1,44 @@ +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { ActionRowBuilder, ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; + +export async function createTag(i: Subcommand.ChatInputCommandInteraction) { + const row1 = new ActionRowBuilder().setComponents([ + new TextInputBuilder() // + .setCustomId('name') + .setPlaceholder('The tag name') + .setLabel('Name') + .setMinLength(1) + .setMaxLength(255) + .setStyle(TextInputStyle.Short) + .setRequired(true) + ]); + + const row2 = new ActionRowBuilder().setComponents([ + new TextInputBuilder() // + .setCustomId('content') + .setLabel('Content') + .setPlaceholder('The tag content') + .setMinLength(1) + .setMaxLength(255) + .setStyle(TextInputStyle.Paragraph) + .setRequired(true) + ]); + + const row3 = new ActionRowBuilder().setComponents([ + new TextInputBuilder() // + .setCustomId('image') + .setLabel('Image') + .setPlaceholder('An image Url') + .setMinLength(1) + .setMaxLength(255) + .setStyle(TextInputStyle.Short) + .setRequired(false) + ]); + + const modal = new ModalBuilder() // + .setCustomId('create-tag') + .setTitle('Create Tag') + .setComponents([row1, row2, row3]); + + await i.showModal(modal); +} diff --git a/apps/bot/src/commands/Tag/_index.ts b/apps/bot/src/commands/Tag/_index.ts new file mode 100644 index 0000000..f5597bd --- /dev/null +++ b/apps/bot/src/commands/Tag/_index.ts @@ -0,0 +1 @@ +export * from './_createTag.js'; diff --git a/apps/bot/src/commands/Urban/Urban.ts b/apps/bot/src/commands/Urban/Urban.ts new file mode 100644 index 0000000..cc8969c --- /dev/null +++ b/apps/bot/src/commands/Urban/Urban.ts @@ -0,0 +1,29 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Command } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { urbanDefine, urbanRandom } from './_index.js'; + +@ApplyOptions({ + description: 'Tag commands', + nsfw: true, + subcommands: [ + { name: 'define', chatInputRun: urbanDefine }, + { name: 'random', chatInputRun: urbanRandom } + ] +}) +export class UserCommand extends Subcommand { + public override registerApplicationCommands(registry: Command.Registry) { + registry.registerChatInputCommand((builder) => + builder // + .setName(this.name) + .setDescription(this.description) + .addSubcommand((b) => + b // + .setName('define') + .setDescription('Define a term on Urban Dictionary') + .addStringOption((b) => b.setName('term').setDescription('The term').setRequired(true)) + ) + .addSubcommand((b) => b.setName('random').setDescription('Define a random term')) + ); + } +} diff --git a/apps/bot/src/commands/Urban/_define.ts b/apps/bot/src/commands/Urban/_define.ts new file mode 100644 index 0000000..3ba7bce --- /dev/null +++ b/apps/bot/src/commands/Urban/_define.ts @@ -0,0 +1,26 @@ +import { container } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { PaginatedMessage } from '@sapphire/discord.js-utilities'; +import { createEmbed } from '#lib/utils'; + +export async function urbanDefine(i: Subcommand.ChatInputCommandInteraction) { + const { urban } = container; + + const term = i.options.getString('term', true); + + const { list } = await urban.defineWord(term); + + const pMsg = new PaginatedMessage(); + + list.forEach(({ definition, word, written_on, thumbs_down, thumbs_up, author }) => { + pMsg.addPageEmbed( + createEmbed(i.user) + .setTimestamp(new Date(written_on)) + .setTitle(urban.removeBrackets(word)) + .setDescription(urban.removeBrackets(definition)) + .setFooter({ text: `👍 ${thumbs_up} | 👎 ${thumbs_down} | Written by ${author}` }) + ); + }); + + await pMsg.run(i); +} diff --git a/apps/bot/src/commands/Urban/_index.ts b/apps/bot/src/commands/Urban/_index.ts new file mode 100644 index 0000000..cc0ef80 --- /dev/null +++ b/apps/bot/src/commands/Urban/_index.ts @@ -0,0 +1,2 @@ +export * from './_define.js'; +export * from './_random.js'; diff --git a/apps/bot/src/commands/Urban/_random.ts b/apps/bot/src/commands/Urban/_random.ts new file mode 100644 index 0000000..e65d966 --- /dev/null +++ b/apps/bot/src/commands/Urban/_random.ts @@ -0,0 +1,24 @@ +import { createEmbed } from '#lib/utils'; +import { container } from '@sapphire/framework'; +import { Subcommand } from '@sapphire/plugin-subcommands'; +import { pickRandom } from '@sapphire/utilities'; + +export async function urbanRandom(i: Subcommand.ChatInputCommandInteraction) { + const { urban } = container; + + + + const { list } = await urban.randomDefinition(); + + + + const { definition, word, written_on, thumbs_down, thumbs_up, author } = pickRandom(list) + + const embed = createEmbed(i.user) + .setTimestamp(new Date(written_on)) + .setTitle(urban.removeBrackets(word)) + .setDescription(urban.removeBrackets(definition)) + .setFooter({ text: `👍 ${thumbs_up} | 👎 ${thumbs_down} | Written by ${author}` }) + + await i.reply({ embeds: [embed] }) +} \ No newline at end of file diff --git a/apps/bot/src/index.ts b/apps/bot/src/index.ts new file mode 100644 index 0000000..9c4edc5 --- /dev/null +++ b/apps/bot/src/index.ts @@ -0,0 +1,45 @@ +import { UrbanDictionary } from '@wyvern/urban-dictionary'; +import './lib/setup.js'; + +import { container, LogLevel, SapphireClient } from '@sapphire/framework'; +import { GatewayIntentBits, Partials } from 'discord.js'; + +const client = new SapphireClient({ + defaultPrefix: '!', + regexPrefix: /^(hey +)?bot[,! ]/i, + caseInsensitiveCommands: true, + logger: { + level: LogLevel.Debug + }, + shards: 'auto', + intents: [ + GatewayIntentBits.DirectMessageReactions, + GatewayIntentBits.DirectMessages, + GatewayIntentBits.GuildModeration, + GatewayIntentBits.GuildEmojisAndStickers, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessageReactions, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildVoiceStates, + GatewayIntentBits.MessageContent + ], + partials: [Partials.Channel], + loadMessageCommandListeners: true +}); + +const main = async () => { + try { + client.logger.info('Logging in'); + await client.login(); + client.logger.info('logged in'); + + container.urban = new UrbanDictionary(); + } catch (error) { + client.logger.fatal(error); + await client.destroy(); + process.exit(1); + } +}; + +void main(); diff --git a/apps/bot/src/interaction-handlers/modal/createTag.ts b/apps/bot/src/interaction-handlers/modal/createTag.ts new file mode 100644 index 0000000..6e9a9bb --- /dev/null +++ b/apps/bot/src/interaction-handlers/modal/createTag.ts @@ -0,0 +1,40 @@ +import { createEmbed, validateUrl } from '#lib/utils'; +import { createTag, prismaClient } from '@wyvern/database'; +import { ApplyOptions } from '@sapphire/decorators'; +import { InteractionHandler, InteractionHandlerTypes } from '@sapphire/framework'; +import { inlineCode, ModalSubmitInteraction } from 'discord.js'; +import { createId } from '@paralleldrive/cuid2'; + +@ApplyOptions({ + interactionHandlerType: InteractionHandlerTypes.ModalSubmit +}) +export class ModalHandler extends InteractionHandler { + override async run(i: ModalSubmitInteraction, { content, image, name }: InteractionHandler.ParseResult) { + const imageUrl = validateUrl(image).match({ + ok: (url) => url.href, + err: (_) => '' + }); + + await prismaClient.$queryRawTyped(createTag(content, imageUrl, name, i.guildId!, i.user.id, createId())); + + const embed = createEmbed(i.user) // + .setTitle('Tag Created') + .setDescription(`Created a tag with title ${inlineCode(name)}`); + + await i.reply({ + embeds: [embed] + }); + } + + override parse(i: ModalSubmitInteraction) { + if (i.customId !== 'create-tag') return this.none(); + + const fields = i.fields; + + const name = fields.getTextInputValue('name'); + const content = fields.getTextInputValue('content'); + const image = fields.getTextInputValue('image'); + + return this.some({ name, content, image }); + } +} diff --git a/apps/bot/src/lib/constants.ts b/apps/bot/src/lib/constants.ts new file mode 100644 index 0000000..71b4a77 --- /dev/null +++ b/apps/bot/src/lib/constants.ts @@ -0,0 +1,16 @@ +import { join } from 'path'; + +console.log(import.meta.dirname); + +const up = (count: number) => { + const foo: Array = []; + for (let i = 0; i < count; i++) { + foo.push('..'); + } + return foo; +}; + +export const rootDir = join(import.meta.dirname, ...up(4)); +export const srcDir = join(rootDir, 'src'); + +export const RandomLoadingMessage = ['Computing...', 'Thinking...', 'Cooking some food', 'Give me a moment', 'Loading...']; diff --git a/apps/bot/src/lib/customIdParams/baseCustomIdParams.ts b/apps/bot/src/lib/customIdParams/baseCustomIdParams.ts new file mode 100644 index 0000000..4350963 --- /dev/null +++ b/apps/bot/src/lib/customIdParams/baseCustomIdParams.ts @@ -0,0 +1,3 @@ +export interface BaseCustomIdParams { + name: string; +} diff --git a/apps/bot/src/lib/customIdParams/index.ts b/apps/bot/src/lib/customIdParams/index.ts new file mode 100644 index 0000000..eaffbce --- /dev/null +++ b/apps/bot/src/lib/customIdParams/index.ts @@ -0,0 +1,2 @@ +export * from './baseCustomIdParams.js'; +export * from './report.js'; diff --git a/apps/bot/src/lib/customIdParams/report.ts b/apps/bot/src/lib/customIdParams/report.ts new file mode 100644 index 0000000..e4da45f --- /dev/null +++ b/apps/bot/src/lib/customIdParams/report.ts @@ -0,0 +1,10 @@ +import { BaseCustomIdParams } from './index.js'; + +export interface ReportMessageCustomIdParams extends BaseCustomIdParams { + channelId: string; + messageId: string; +} + +export interface ReportUserCustomIdParams extends BaseCustomIdParams { + userId: string; +} diff --git a/apps/bot/src/lib/errors/CommandFailedError.ts b/apps/bot/src/lib/errors/CommandFailedError.ts new file mode 100644 index 0000000..66675cb --- /dev/null +++ b/apps/bot/src/lib/errors/CommandFailedError.ts @@ -0,0 +1,8 @@ +export class CommandFailedError extends Error { + /** + * + */ + constructor(msg: string) { + super(msg); + } +} diff --git a/apps/bot/src/lib/errors/InternalError.ts b/apps/bot/src/lib/errors/InternalError.ts new file mode 100644 index 0000000..fecab08 --- /dev/null +++ b/apps/bot/src/lib/errors/InternalError.ts @@ -0,0 +1,8 @@ +export class InternalError extends Error { + /** + * + */ + constructor(msg: string) { + super(msg); + } +} diff --git a/apps/bot/src/lib/errors/index.ts b/apps/bot/src/lib/errors/index.ts new file mode 100644 index 0000000..0a6dcae --- /dev/null +++ b/apps/bot/src/lib/errors/index.ts @@ -0,0 +1,2 @@ +export * from './CommandFailedError.js'; +export * from './InternalError.js'; diff --git a/apps/bot/src/lib/setup.ts b/apps/bot/src/lib/setup.ts new file mode 100644 index 0000000..ede5abd --- /dev/null +++ b/apps/bot/src/lib/setup.ts @@ -0,0 +1,46 @@ +// Unless explicitly defined, set NODE_ENV as development: +process.env.NODE_ENV ??= 'development'; + +import { ApplicationCommandRegistries, RegisterBehavior } from '@sapphire/framework'; +import '@sapphire/plugin-api/register'; +import '@sapphire/plugin-editable-commands/register'; +// import '@sapphire/plugin-logger/register'; + +import '@wyvern/plugin-custom-logger/register'; + +import '@sapphire/plugin-subcommands/register'; +import { setup, type ArrayString } from '@skyra/env-utilities'; +import * as colorette from 'colorette'; +import { join } from 'path'; +import { inspect } from 'util'; +import { rootDir } from './constants.js'; + +import { UrbanDictionary } from '@wyvern/urban-dictionary'; + +// Set default behavior to bulk overwrite +ApplicationCommandRegistries.setDefaultBehaviorWhenNotIdentical(RegisterBehavior.BulkOverwrite); + +ApplicationCommandRegistries.setDefaultGuildIds(['1072895701970858026', '739115569311383634']); + +// Read env var +console.log(join(rootDir, '.env')); + +setup({ path: join(rootDir, '.env') }); + +// Set default inspection depth +inspect.defaultOptions.depth = 1; + +// Enable colorette +colorette.createColors({ useColor: true }); + +declare module '@skyra/env-utilities' { + interface Env { + OWNERS: ArrayString; + } +} + +declare module '@sapphire/pieces' { + interface Container { + urban: UrbanDictionary; + } +} diff --git a/apps/bot/src/lib/utils.ts b/apps/bot/src/lib/utils.ts new file mode 100644 index 0000000..79ea669 --- /dev/null +++ b/apps/bot/src/lib/utils.ts @@ -0,0 +1,185 @@ +import { + ChatInputCommandSuccessPayload, + Command, + ContextMenuCommandSuccessPayload, + err, + MessageCommandSuccessPayload, + ok, + Result +} from '@sapphire/framework'; +import { container } from '@sapphire/framework'; +import { send } from '@sapphire/plugin-editable-commands'; +import { cyan } from 'colorette'; +import { + ChatInputCommandInteraction, + EmbedBuilder, + GuildMember, + Role, + RoleResolvable, + type APIUser, + type Guild, + type Message, + type User +} from 'discord.js'; +import { RandomLoadingMessage } from '#lib/constants'; +import { globalConfig } from '@wyvern/config'; + +import { isNullish } from '@sapphire/utilities'; +import { brotliCompressSync, brotliDecompressSync } from 'node:zlib'; +import { serialize, deserialize } from 'binarytf'; + +/** + * Picks a random item from an array + * @param array The array to pick a random item from + * @example + * const randomEntry = pickRandom([1, 2, 3, 4]) // 1 + */ +export function pickRandom(array: readonly T[]): T { + const { length } = array; + return array[Math.floor(Math.random() * length)]; +} + +/** + * Sends a loading message to the current channel + * @param message The message data for which to send the loading message + */ +export function sendLoadingMessage(message: Message): Promise { + return send(message, { embeds: [new EmbedBuilder().setDescription(pickRandom(RandomLoadingMessage)).setColor('#FF0000')] }); +} + +export function logSuccessCommand(payload: ContextMenuCommandSuccessPayload | ChatInputCommandSuccessPayload | MessageCommandSuccessPayload): void { + let successLoggerData: ReturnType; + + if ('interaction' in payload) { + successLoggerData = getSuccessLoggerData(payload.interaction.guild, payload.interaction.user, payload.command); + } else { + successLoggerData = getSuccessLoggerData(payload.message.guild, payload.message.author, payload.command); + } + + container.logger.debug(`${successLoggerData.shard} - ${successLoggerData.commandName} ${successLoggerData.author} ${successLoggerData.sentAt}`); +} + +export function getSuccessLoggerData(guild: Guild | null, user: User, command: Command) { + const shard = getShardInfo(guild?.shardId ?? 0); + const commandName = getCommandInfo(command); + const author = getAuthorInfo(user); + const sentAt = getGuildInfo(guild); + + return { shard, commandName, author, sentAt }; +} + +function getShardInfo(id: number) { + return `[${cyan(id.toString())}]`; +} + +function getCommandInfo(command: Command) { + return cyan(command.name); +} + +function getAuthorInfo(author: User | APIUser) { + return `${author.username}[${cyan(author.id)}]`; +} + +function getGuildInfo(guild: Guild | null) { + if (guild === null) return 'Direct Messages'; + return `${guild.name}[${cyan(guild.id)}]`; +} + +export function createEmbed(userOrMember: User | GuildMember, type: keyof typeof globalConfig.colors = 'success'): EmbedBuilder { + const color = globalConfig.colors[type]; + + const user = userOrMember instanceof GuildMember ? userOrMember.user : userOrMember; + + return new EmbedBuilder() // + .setAuthor({ + name: user.username, + iconURL: user.avatarURL({ forceStatic: false }) ?? '' + }) + .setColor(color) + .setTimestamp(new Date()); +} + +export function validateUrl(url: string): Result { + return Result.from(() => new URL(url)); +} + +export function getFullCommandName(i: ChatInputCommandInteraction) { + const opts = i.options; + + const baseName = i.commandName; + const subcommandGroup = opts.getSubcommandGroup(false); + const subcommand = opts.getSubcommand(false); + + const parts: string[] = [baseName]; + + if (!isNullish(subcommandGroup)) parts.push(subcommandGroup); + if (!isNullish(subcommand)) parts.push(subcommand); + + return parts.join(' '); +} + +export function isEmpty(arr: T[]) { + return arr.length > 0; +} + +export async function tryAddRole(role: RoleResolvable, member: GuildMember): Promise> { + const a = await member.roles + .add(role) + .then((r) => r) + .catch((e) => e as string); + + return a instanceof GuildMember ? ok(a) : err(a); +} + +export async function bulkAddRoles(roles: RoleResolvable[], member: GuildMember) { + const failed: string[] = []; + const successful: string[] = []; + + roles.forEach(async (role) => { + const res = await tryAddRole(role, member); + + res.match({ + ok: () => successful.push(role instanceof Role ? role.id : role), + err: () => failed.push(role instanceof Role ? role.id : role) + }); + }); + + return { failed, successful }; +} + +export function compressCustomId(params: T, customMessagePart?: string): Result { + const serializedId = brotliCompressSync(serialize(params)).toString('binary'); + + if (serializedId.length > 80) { + const resolvedCustomMessagePart = customMessagePart ?? ''; + return err( + `Due to Discord API limitations I was unable to resolve that request. ${resolvedCustomMessagePart}This issue will be fixed in the future.` + ); + } + + return ok(serializedId); +} + +export function decompressCustomId(content: string): Result { + const result = Result.from(() => + // + deserialize(brotliDecompressSync(Buffer.from(content, 'binary'))) + ); + + return result; +} + +export function formatWelcomeLeaveMessage(msg: string, member: GuildMember, guild: Guild) { + return msg // + .replaceAll(/{user}/g, member.user.username) + .replaceAll(/{guild}/g, guild.name); +} + +export function isJson(x: any): boolean { + try { + JSON.parse(x); + return true; + } catch (_) { + return false; + } +} diff --git a/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandDenied.ts b/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandDenied.ts new file mode 100644 index 0000000..f835357 --- /dev/null +++ b/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandDenied.ts @@ -0,0 +1,23 @@ +import type { ChatInputCommandDeniedPayload, Events } from '@sapphire/framework'; +import { Listener, UserError } from '@sapphire/framework'; + +export class UserEvent extends Listener { + public override async run({ context, message: content }: UserError, { interaction }: ChatInputCommandDeniedPayload) { + // `context: { silent: true }` should make UserError silent: + // Use cases for this are for example permissions error when running the `eval` command. + if (Reflect.get(Object(context), 'silent')) return; + + if (interaction.deferred || interaction.replied) { + return interaction.editReply({ + content, + allowedMentions: { users: [interaction.user.id], roles: [] } + }); + } + + return interaction.reply({ + content, + allowedMentions: { users: [interaction.user.id], roles: [] }, + ephemeral: true + }); + } +} diff --git a/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandSuccess.ts b/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandSuccess.ts new file mode 100644 index 0000000..2e88190 --- /dev/null +++ b/apps/bot/src/listeners/commands/chatInputCommands/chatInputCommandSuccess.ts @@ -0,0 +1,14 @@ +import { Listener, LogLevel, type ChatInputCommandSuccessPayload } from '@sapphire/framework'; +import type { Logger } from '@sapphire/plugin-logger'; +import { logSuccessCommand } from '#lib/utils'; + +export class UserListener extends Listener { + public override run(payload: ChatInputCommandSuccessPayload) { + logSuccessCommand(payload); + } + + public override onLoad() { + this.enabled = (this.container.logger as Logger).level <= LogLevel.Debug; + return super.onLoad(); + } +} diff --git a/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandDenied.ts b/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandDenied.ts new file mode 100644 index 0000000..c9741eb --- /dev/null +++ b/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandDenied.ts @@ -0,0 +1,23 @@ +import type { ContextMenuCommandDeniedPayload, Events } from '@sapphire/framework'; +import { Listener, UserError } from '@sapphire/framework'; + +export class UserEvent extends Listener { + public override async run({ context, message: content }: UserError, { interaction }: ContextMenuCommandDeniedPayload) { + // `context: { silent: true }` should make UserError silent: + // Use cases for this are for example permissions error when running the `eval` command. + if (Reflect.get(Object(context), 'silent')) return; + + if (interaction.deferred || interaction.replied) { + return interaction.editReply({ + content, + allowedMentions: { users: [interaction.user.id], roles: [] } + }); + } + + return interaction.reply({ + content, + allowedMentions: { users: [interaction.user.id], roles: [] }, + ephemeral: true + }); + } +} diff --git a/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandSuccess.ts b/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandSuccess.ts new file mode 100644 index 0000000..b7f386f --- /dev/null +++ b/apps/bot/src/listeners/commands/contextMenuCommands/contextMenuCommandSuccess.ts @@ -0,0 +1,14 @@ +import { Listener, LogLevel, type ContextMenuCommandSuccessPayload } from '@sapphire/framework'; +import type { Logger } from '@sapphire/plugin-logger'; +import { logSuccessCommand } from '#lib/utils'; + +export class UserListener extends Listener { + public override run(payload: ContextMenuCommandSuccessPayload) { + logSuccessCommand(payload); + } + + public override onLoad() { + this.enabled = (this.container.logger as Logger).level <= LogLevel.Debug; + return super.onLoad(); + } +} diff --git a/apps/bot/src/listeners/commands/messageCommands/messageCommandDenied.ts b/apps/bot/src/listeners/commands/messageCommands/messageCommandDenied.ts new file mode 100644 index 0000000..5fd15d0 --- /dev/null +++ b/apps/bot/src/listeners/commands/messageCommands/messageCommandDenied.ts @@ -0,0 +1,12 @@ +import type { Events, MessageCommandDeniedPayload } from '@sapphire/framework'; +import { Listener, type UserError } from '@sapphire/framework'; + +export class UserEvent extends Listener { + public override async run({ context, message: content }: UserError, { message }: MessageCommandDeniedPayload) { + // `context: { silent: true }` should make UserError silent: + // Use cases for this are for example permissions error when running the `eval` command. + if (Reflect.get(Object(context), 'silent')) return; + + return message.reply({ content, allowedMentions: { users: [message.author.id], roles: [] } }); + } +} diff --git a/apps/bot/src/listeners/commands/messageCommands/messageCommandSuccess.ts b/apps/bot/src/listeners/commands/messageCommands/messageCommandSuccess.ts new file mode 100644 index 0000000..c05e6f2 --- /dev/null +++ b/apps/bot/src/listeners/commands/messageCommands/messageCommandSuccess.ts @@ -0,0 +1,15 @@ +import type { MessageCommandSuccessPayload } from '@sapphire/framework'; +import { Listener, LogLevel } from '@sapphire/framework'; +import type { Logger } from '@sapphire/plugin-logger'; +import { logSuccessCommand } from '#lib/utils'; + +export class UserEvent extends Listener { + public override run(payload: MessageCommandSuccessPayload) { + logSuccessCommand(payload); + } + + public override onLoad() { + this.enabled = (this.container.logger as Logger).level <= LogLevel.Debug; + return super.onLoad(); + } +} diff --git a/apps/bot/src/listeners/commands/subcommands/subcommandError.ts b/apps/bot/src/listeners/commands/subcommands/subcommandError.ts new file mode 100644 index 0000000..c2b38c4 --- /dev/null +++ b/apps/bot/src/listeners/commands/subcommands/subcommandError.ts @@ -0,0 +1,59 @@ +import { ChatInputCommand, Listener } from '@sapphire/framework'; +import { createEmbed, getFullCommandName } from '#lib/utils'; +import { ApplyOptions } from '@sapphire/decorators'; +import { ChatInputSubcommandErrorPayload, SubcommandPluginEvents } from '@sapphire/plugin-subcommands'; +import { WyvernErrorHandler } from '@wyvern/error-handler'; +import { CommandFailedError } from '#lib/errors'; +import { codeblock } from '@wyvern/markdown'; + +@ApplyOptions({ + event: SubcommandPluginEvents.ChatInputSubcommandError +}) +export class UserListener extends Listener { + public override async run(error: Error, payload: ChatInputSubcommandErrorPayload) { + const { interaction, context } = payload; + + if (error instanceof CommandFailedError) { + await this.handleCommandFailedError(error, interaction); + return; + } + + if (error instanceof CommandFailedError) { + await this.handleCommandFailedError(error, interaction); + return; + } + + const handler = new WyvernErrorHandler(); + + handler.handleCommandError({ + error, + + commandId: context.commandId, + commandName: getFullCommandName(interaction), + + guildId: interaction.guildId!, + guildName: interaction.guild!.name!, + + userId: interaction.user.id, + username: interaction.user.username + }); + + const embed = createEmbed(interaction.user, 'error') // + .setTitle('This is embarrassing') + .setDescription(codeblock(error.message)); + + const method = interaction.deferred || interaction.replied ? 'editReply' : 'reply'; + + await interaction[method]({ embeds: [embed] }); + } + + private async handleCommandFailedError(error: CommandFailedError, interaction: ChatInputCommand.Interaction) { + const embed = createEmbed(interaction.user, 'error') // + .setTitle('Something went wrong') + .setDescription(error.message); + + const method = interaction.deferred || interaction.replied ? 'editReply' : 'reply'; + + await interaction[method]({ embeds: [embed] }); + } +} diff --git a/apps/bot/src/listeners/guildMemberJoin.ts b/apps/bot/src/listeners/guildMemberJoin.ts new file mode 100644 index 0000000..e25155a --- /dev/null +++ b/apps/bot/src/listeners/guildMemberJoin.ts @@ -0,0 +1,48 @@ +import { bulkAddRoles, createEmbed, formatWelcomeLeaveMessage } from '#lib/utils'; +import { ApplyOptions } from '@sapphire/decorators'; +import { Events } from '@sapphire/framework'; +import { Listener } from '@sapphire/framework'; +import { isNullish } from '@sapphire/utilities'; +import { getGuild, prismaClient } from '@wyvern/database'; +import type { ColorResolvable, GuildMember } from 'discord.js'; + +@ApplyOptions({ + event: Events.GuildMemberAdd +}) +export class UserEvent extends Listener { + public override async run(member: GuildMember) { + this.autoRole(member); + this.welcome(member); + } + + private async autoRole(member: GuildMember) { + const { autoRoles: roles } = await prismaClient.guild.findFirstOrThrow({ + where: { guildId: member.guild.id }, + select: { autoRoles: true } + }); + + await bulkAddRoles(roles, member); + } + + private async welcome(member: GuildMember) { + const res = await prismaClient.guild.findFirstOrThrow({ + where: { guildId: member.guild!.id }, + include: { guildWelcomeMessage: true } + }); + + const { title, description, embedColor, channelId } = res!.guildWelcomeMessage!; + + if (isNullish(channelId)) return; + + const channel = await member.guild.channels.fetch(channelId); + + if (isNullish(channel) || channel?.isTextBased() || !channel.isSendable()) return; + + const embed = createEmbed(member) + .setTitle(formatWelcomeLeaveMessage(title, member, member.guild)) + .setDescription(formatWelcomeLeaveMessage(description, member, member.guild)) + .setColor(embedColor as ColorResolvable); + + await channel.send({ embeds: [embed] }); + } +} diff --git a/apps/bot/src/listeners/message.ts b/apps/bot/src/listeners/message.ts new file mode 100644 index 0000000..45cb7bd --- /dev/null +++ b/apps/bot/src/listeners/message.ts @@ -0,0 +1,59 @@ +import { InternalError } from '#lib/errors'; +import { ApplyOptions } from '@sapphire/decorators'; +import { Events, Listener } from '@sapphire/framework'; +import { getGuild } from '@wyvern/database'; +import { Message } from 'discord.js'; +import { fetch, FetchResultTypes } from '@sapphire/fetch'; + +@ApplyOptions({ + event: Events.MessageCreate +}) +export class UserEvent extends Listener { + override async run(msg: Message) { + await this._autoCarbon(msg); + } + + private async _autoCarbon(msg: Message) { + const guild = await getGuild(msg.guild!.id); + + const autoCarbonEnabled = guild.match({ + ok: (g) => g.autoCarbon, + err: (e) => { + throw new InternalError(e.message); + } + }); + + if (!autoCarbonEnabled) return; + + const re = /^```(?\w+)?\n(?.+?)(?:\n)?```$/s; + + if (!re.test(msg.content)) return; + + const groups = re.exec(msg.content)!.groups!; + + const result = await fetch( + 'https://carbonara.aero.bot/api/cook', + { + body: JSON.stringify({ + code: groups.code, + language: 'auto', + theme: 'one-dark', + backgroundColor: 'rgb(54, 57, 63)', + fontFamily: 'JetBrains Mono', + paddingHorizontal: '20px', + paddingVertical: '20px', + windowControls: 'false', + dropShadowBlurRadius: '10px', + dropShadowOffsetY: '0px' + }), + method: 'POST', + headers: [['Content-Type', 'application/json']] + }, + FetchResultTypes.Buffer + ); + + const body = null; + + this.container.logger.debug(body); + } +} diff --git a/apps/bot/src/listeners/ready.ts b/apps/bot/src/listeners/ready.ts new file mode 100644 index 0000000..13c5673 --- /dev/null +++ b/apps/bot/src/listeners/ready.ts @@ -0,0 +1,53 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Listener } from '@sapphire/framework'; +import type { StoreRegistryValue } from '@sapphire/pieces'; + +import { blue, green, magenta, magentaBright, white } from 'colorette'; + +const dev = process.env.NODE_ENV !== 'production'; + +@ApplyOptions({ once: true }) +export class UserEvent extends Listener { + // private readonly style = dev ? yellow : blue; + + public override async run() { + this.printBanner(); + this.printStoreDebugInformation(); + } + + private printBanner() { + const success = green('+'); + + const llc = dev ? magentaBright : white; + const blc = dev ? magenta : blue; + + const line01 = llc(''); + const line02 = llc(''); + const line03 = llc(''); + + // Offset Pad + const pad = ' '.repeat(7); + + console.log( + String.raw` +${line01} ${pad}${blc('1.0.0')} +${line02} ${pad}[${success}] Gateway +${line03}${dev ? ` ${pad}${blc('<')}${llc('/')}${blc('>')} ${llc('DEVELOPMENT MODE')}` : ''} + `.trim() + ); + } + + private printStoreDebugInformation() { + const { client, logger } = this.container; + const stores = [...client.stores.values()]; + const last = stores.pop()!; + + for (const store of stores) logger.info(this.styleStore(store, false)); + logger.info(this.styleStore(last, true)); + } + + private styleStore(store: StoreRegistryValue, last: boolean) { + return `${last ? '└─' : '├─'} Loaded ${store.size.toString().padEnd(3, ' ')} ${store.name}.`; + // return gray(`${last ? '└─' : '├─'} Loaded ${this.style(store.size.toString().padEnd(3, ' '))} ${store.name}.`); + } +} diff --git a/apps/bot/src/preconditions/OwnerOnly.ts b/apps/bot/src/preconditions/OwnerOnly.ts new file mode 100644 index 0000000..f58fa70 --- /dev/null +++ b/apps/bot/src/preconditions/OwnerOnly.ts @@ -0,0 +1,30 @@ +import { AllFlowsPrecondition } from '@sapphire/framework'; +import type { CommandInteraction, ContextMenuCommandInteraction, Message, Snowflake } from 'discord.js'; + +const OWNERS = ['424239181296959507']; + +export class UserPrecondition extends AllFlowsPrecondition { + #message = 'This command can only be used by the owner.'; + + public override chatInputRun(interaction: CommandInteraction) { + return this.doOwnerCheck(interaction.user.id); + } + + public override contextMenuRun(interaction: ContextMenuCommandInteraction) { + return this.doOwnerCheck(interaction.user.id); + } + + public override messageRun(message: Message) { + return this.doOwnerCheck(message.author.id); + } + + private doOwnerCheck(userId: Snowflake) { + return OWNERS.includes(userId) ? this.ok() : this.error({ message: this.#message }); + } +} + +declare module '@sapphire/framework' { + interface Preconditions { + OwnerOnly: never; + } +} diff --git a/apps/bot/src/preconditions/RequiredSetting.ts b/apps/bot/src/preconditions/RequiredSetting.ts new file mode 100644 index 0000000..981f337 --- /dev/null +++ b/apps/bot/src/preconditions/RequiredSetting.ts @@ -0,0 +1,40 @@ +import { AllFlowsPrecondition, Command } from '@sapphire/framework'; +import { isNullish } from '@sapphire/utilities'; +import { getGuild, Guild } from '@wyvern/database'; +import type { ChatInputCommandInteraction, ContextMenuCommandInteraction, Message, Snowflake } from 'discord.js'; + +export interface RequiredSettingPreconditionContext extends AllFlowsPrecondition.Context { + setting: keyof Omit; +} + +export class UserPrecondition extends AllFlowsPrecondition { + public override chatInputRun(interaction: ChatInputCommandInteraction, _: Command, context: RequiredSettingPreconditionContext) { + return this.sharedRun(interaction.user.id, context); + } + + public override contextMenuRun(interaction: ContextMenuCommandInteraction, _: Command, context: RequiredSettingPreconditionContext) { + return this.sharedRun(interaction.user.id, context); + } + + public override messageRun(message: Message, _: Command, context: RequiredSettingPreconditionContext) { + return this.sharedRun(message.author.id, context); + } + + private async sharedRun(guildId: Snowflake, { setting }: RequiredSettingPreconditionContext) { + const guildRes = await getGuild(guildId); + + if (guildRes.isErr()) return this.error({ identifier: 'NO_SERVER_SETTING' }); + + const guild = guildRes.unwrap(); + + const value = guild[setting]; + + return isNullish(value) ? this.error({ message: 'A required server setting is unset', context: { setting } }) : this.ok(); + } +} + +declare module '@sapphire/framework' { + interface Preconditions { + RequiredSetting: RequiredSettingPreconditionContext; + } +} diff --git a/apps/bot/src/routes/hello-world.ts b/apps/bot/src/routes/hello-world.ts new file mode 100644 index 0000000..30b4acd --- /dev/null +++ b/apps/bot/src/routes/hello-world.ts @@ -0,0 +1,13 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Route, methods, type ApiRequest, type ApiResponse } from '@sapphire/plugin-api'; + +@ApplyOptions({ route: 'hello-world' }) +export class UserRoute extends Route { + public override [methods.GET](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Hello World' }); + } + + public override [methods.POST](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Hello World' }); + } +} diff --git a/apps/bot/src/routes/main.ts b/apps/bot/src/routes/main.ts new file mode 100644 index 0000000..e2e59ac --- /dev/null +++ b/apps/bot/src/routes/main.ts @@ -0,0 +1,13 @@ +import { ApplyOptions } from '@sapphire/decorators'; +import { Route, methods, type ApiRequest, type ApiResponse } from '@sapphire/plugin-api'; + +@ApplyOptions({ route: `` }) +export class UserRoute extends Route { + public override [methods.GET](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Landing Page!' }); + } + + public override [methods.POST](_request: ApiRequest, response: ApiResponse) { + response.json({ message: 'Landing Page!' }); + } +} diff --git a/apps/bot/tsconfig.json b/apps/bot/tsconfig.json new file mode 100644 index 0000000..209205e --- /dev/null +++ b/apps/bot/tsconfig.json @@ -0,0 +1,63 @@ +{ + "extends": [ + "@sapphire/ts-config", + "@sapphire/ts-config/extra-strict", + "@sapphire/ts-config/decorators" + ], + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "baseUrl": ".", + "tsBuildInfoFile": "dist/.tsbuildinfo", + "allowJs": true, + "moduleDetection": "auto", + "esModuleInterop": true, + "paths": { + "#lib/structures": [ + "src/lib/structures/index.ts" + ], + "#lib/interfaces": [ + "src/lib/interfaces/index.ts" + ], + "#lib/parsers": [ + "src/lib/parsers/index.ts" + ], + "#lib/utils": [ + "src/lib/utils.ts" + ], + "#lib/config": [ + "src/lib/config.ts" + ], + "#lib/types": [ + "src/lib/types.ts" + ], + "#lib/constants": [ + "src/lib/constants.ts" + ], + "#lib/errors": [ + "src/lib/errors/index.ts" + ], + "#lib/managers": [ + "src/lib/managers/index.ts" + ], + "#lib/customIds": [ + "src/lib/customIdTypes/index.ts" + ], + "#lib/markdown": [ + "src/lib/markdown/index.ts" + ], + "#drizzle": [ + "src/drizzle/schema.ts" + ], + "#prisma": [ + "src/lib/prisma.ts" + ], + "#stringFormatters": [ + "src/lib/stringFormatters/index.ts" + ] + }, + }, + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/apps/bot/tsup.config.ts b/apps/bot/tsup.config.ts new file mode 100644 index 0000000..ce0a0ba --- /dev/null +++ b/apps/bot/tsup.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + clean: true, + bundle: false, + dts: false, + entry: ['src/**/*.ts', '!src/**/*.d.ts'], + format: ['esm'], + minify: false, + tsconfig: 'tsconfig.json', + // target: 'es2020', + target: 'esnext', + splitting: false, + skipNodeModulesBundle: true, + sourcemap: true, + shims: false, + keepNames: true +}); diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..4087f14b9e924780b79979b51e52397158070e96 GIT binary patch literal 405412 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

VX@um2x7(h$ z{mMJPJn-G?Z~i=W{n*pje*B`*{_W5Um!ACV+jC1(OCLUZX=mr?=Z9~cJoxhE_paZV zI`YG(+aLY;+0~^JS6+SWwVmDNufMwX_6H}w-~0HsX;tJWHT9iX$odWVUV`YFrgilc zSp9i*5$*KkTp1}s@=c~L|9}4zE%1}>@8fmT@B0olsn0((-Zpi4d$!z?@pfK}$ozpn zV+X!&U7Q4ExS29Ig!ml?4!m+dzIWk!7T?484)pg8oxX?feMtWU-+S?$#(+J-e9z_Q z2TwfS{9V&?&qKC7PRwG!+o?BKq~O<;XLdKBeYyVD-Cw?c=dnl5+`M~r``|5S LUqTW8s=vPh*5^eu literal 0 HcmV?d00001 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..8fd4aa0 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,46 @@ +services: + db: + image: postgres:latest + container_name: majoexe-db + restart: always + user: postgres + environment: + - POSTGRES_DB=majoexe + - POSTGRES_PASSWORD=0ce267bcae32edcb51e257d0f4439e7fb1e3df3c6577782468550d7cd5a531ea + volumes: + - database:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - app_network + healthcheck: + test: ["CMD", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + + seq: + image: datalust/seq:latest + container_name: seq + restart: always + networks: + - app_network + environment: + - ACCEPT_EULA=Y + - SEQ_FIRSTRUN_ADMINPASSWORDHASH=QJklU79+04hywc4hPkuRIDzsDzqhuVQ4aoVfA0IfP/LLEy8HwWWMfhA8YVnCo4gv18+igc70YaUWRnMdKZAzBc/Cms0hL/+hdXNBDYb4daWu + volumes: + - seq_data:/data + ports: + - 5341:80 + +networks: + app_network: + driver: bridge + +volumes: + database: + driver: local + cache: + driver: local + seq_data: + driver: local diff --git a/package.json b/package.json new file mode 100644 index 0000000..2cb9d75 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "@wyvern/monorepo", + "private": true, + "scripts": { + "build": "turbo build", + "dev": "turbo dev", + "lint": "turbo lint", + "format": "prettier --write \"**/*.{ts,tsx,md}\"", + "prisma:generate": "turbo run prisma:generate ", + "prisma:generateSql": "turbo run prisma:generateSql ", + "prisma:push": "turbo run prisma:push", + "prisma:migrate": "turbo run prisma:migrate", + "typecheck": "turbo run typecheck" + }, + "devDependencies": { + "@sapphire/framework": "^5.3.1", + "colorette": "^2.0.20", + "discord.js": "^14.16.3", + "prettier": "^3.2.5", + "turbo": "^2.2.3", + "typescript": "5.5.4" + }, + "engines": { + "node": ">=18" + }, + "packageManager": "bun@1.1.34", + "workspaces": [ + "apps/*", + "packages/*" + ], + "trustedDependencies": [ + "@prisma/client", + "@prisma/engines", + "@sapphire/type", + "core-js-pure", + "esbuild", + "prisma" + ], + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "binarytf": "^2.1.3" + } +} diff --git a/packages/config/package.json b/packages/config/package.json new file mode 100644 index 0000000..0c42f34 --- /dev/null +++ b/packages/config/package.json @@ -0,0 +1,29 @@ +{ + "name": "@wyvern/config", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + }, + "./debug": { + "default": "./dist/src/configs/debug.js", + "types": "./src/configs/debug.ts" + }, + "./global": { + "default": "./dist/src/configs/global.js", + "types": "./src/configs/global.ts" + } + } +} diff --git a/packages/config/src/configs/debug.ts b/packages/config/src/configs/debug.ts new file mode 100644 index 0000000..8c3618d --- /dev/null +++ b/packages/config/src/configs/debug.ts @@ -0,0 +1,11 @@ +export const debugConfig: DebugConfig = { + displayDatabaseLogs: false, + logLevel: "", +}; + +type LogLevel = ""; +interface DebugConfig { + displayDatabaseLogs: boolean; + + logLevel: LogLevel; +} diff --git a/packages/config/src/configs/global.ts b/packages/config/src/configs/global.ts new file mode 100644 index 0000000..42986be --- /dev/null +++ b/packages/config/src/configs/global.ts @@ -0,0 +1,20 @@ +export const globalConfig: GlobalConfig = { + guildIds: ["1072895701970858026", "739115569311383634"], + colors: { + success: "#f5c931", + warning: "#d7d1b5", + error: "#ffadad", + }, +}; + +interface GlobalConfig { + colors: Colors; + guildIds: string[]; +} + +type HexCode = `#${string}`; +interface Colors { + success: HexCode; + warning: HexCode; + error: HexCode; +} diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts new file mode 100644 index 0000000..7accd60 --- /dev/null +++ b/packages/config/src/index.ts @@ -0,0 +1,2 @@ +export * from "./configs/debug.js"; +export * from "./configs/global.js"; diff --git a/packages/config/tsconfig.json b/packages/config/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/config/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/config/tsconfig.tsbuildinfo b/packages/config/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1ed360d --- /dev/null +++ b/packages/config/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/foo.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36bcced44876ff177efb79cc8662aafc1ae351077eee9e034fd7b036e9d33ab5","signature":"3dee7bbd2b685bdcb66cfc9b45605d6689ea42852231fa79cac9a40643c0fa22","impliedFormat":99},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ca6d304b929748ea15c33f28c1f159df18a94470b424ab78c52d68d40a41e1e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"4d7da7075068195f8f127f41c61e304cdca5aafb1be2d0f4fb67c6b4c3e98d50","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4bdde4e601e9554a844e1e0d0ccfa05e183ef9d82ab3ac25f17c1709033d360","impliedFormat":1},{"version":"ad23fd126ff06e72728dd7bfc84326a8ca8cec2b9d2dac0193d42a777df0e7d8","impliedFormat":1},{"version":"9dd9f50652a176469e85fb65aa081d2e7eb807e2c476f378233de4f1f6604962","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"7edec695cdb707c7146ac34c44ca364469c7ea504344b3206c686e79f61b61a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a20f1e119615bf7632729fd89b6c0b5ffdc2df3b512d6304146294528e3ebe19","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"08353b04a3501d84fc8d7b49de99f6c1cc26026e6d9d697a18315f3bfe92ed03","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"efeedd8bbc5c0d53e760d8b120a010470722982e6ae14de8d1bcff66ebc2ae71","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"9091e564b81e7b4c382a33c62de704a699e10508190547d4f7c1c3e039d2db2b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","impliedFormat":1}],"root":[72],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"importHelpers":false,"module":100,"newLine":1,"noEmitHelpers":false,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":false,"rootDir":"./src","sourceMap":true,"strict":true,"target":7,"useDefineForClassFields":true},"fileIdsList":[[81,123],[81,120,123],[81,122,123],[81,123,128,157],[81,123,124,129,135,136,143,154,165],[81,123,124,125,135,143],[76,77,78,81,123],[81,123,126,166],[81,123,127,128,136,144],[81,123,128,154,162],[81,123,129,131,135,143],[81,122,123,130],[81,123,131,132],[81,123,135],[81,123,133,135],[81,122,123,135],[81,123,135,136,137,154,165],[81,123,135,136,137,150,154,157],[81,118,123,170],[81,123,131,135,138,143,154,165],[81,123,135,136,138,139,143,154,162,165],[81,123,138,140,154,162,165],[81,123,135,141],[81,123,142,165,170],[81,123,131,135,143,154],[81,123,144],[81,123,145],[81,122,123,146],[81,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,148],[81,123,149],[81,123,135,150,151],[81,123,150,152,166,168],[81,123,135,154,155,156,157],[81,123,154,156],[81,123,154,155],[81,123,157],[81,123,158],[81,120,123,154],[81,123,135,160,161],[81,123,160,161],[81,123,128,143,154,162],[81,123,163],[123],[79,80,81,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,143,164],[81,123,138,149,165],[81,123,128,166],[81,123,154,167],[81,123,142,168],[81,123,169],[81,123,128,135,137,146,154,165,168,170],[81,123,154,171],[81,123,174,213],[81,123,174,198,213],[81,123,213],[81,123,174],[81,123,174,199,213],[81,123,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212],[81,123,199,213],[81,123,135,138,140,154,162,165,171,172],[81,90,94,123,165],[81,90,123,154,165],[81,85,123],[81,87,90,123,162,165],[81,123,143,162],[81,123,172],[81,85,123,172],[81,87,90,123,143,165],[81,82,83,86,89,123,135,154,165],[81,90,97,123],[81,82,88,123],[81,90,111,112,123],[81,86,90,123,157,165,172],[81,111,123,172],[81,84,85,123,172],[81,90,123],[81,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,123],[81,90,105,123],[81,90,97,98,123],[81,88,90,98,99,123],[81,89,123],[81,82,85,90,123],[81,90,94,98,99,123],[81,94,123],[81,88,90,93,123,165],[81,82,87,90,97,123],[81,123,154],[81,85,90,111,123,170,172]],"referencedMap":[[73,1],[74,1],[75,1],[120,2],[121,2],[122,3],[123,4],[124,5],[125,6],[76,1],[79,7],[77,1],[78,1],[126,8],[127,9],[128,10],[129,11],[130,12],[131,13],[132,13],[134,14],[133,15],[135,16],[136,17],[137,18],[119,19],[138,20],[139,21],[140,22],[141,23],[142,24],[143,25],[144,26],[145,27],[146,28],[147,29],[148,30],[149,31],[150,32],[151,32],[152,33],[153,1],[154,34],[156,35],[155,36],[157,37],[158,38],[159,39],[160,40],[161,41],[162,42],[163,43],[81,44],[80,1],[172,45],[164,46],[165,47],[166,48],[167,49],[168,50],[169,51],[170,52],[171,53],[173,1],[198,54],[199,55],[174,56],[177,56],[196,54],[197,54],[187,54],[186,57],[184,54],[179,54],[192,54],[190,54],[194,54],[178,54],[191,54],[195,54],[180,54],[181,54],[193,54],[175,54],[182,54],[183,54],[185,54],[189,54],[200,58],[188,54],[176,54],[213,59],[212,1],[207,58],[209,60],[208,58],[201,58],[202,58],[204,58],[206,58],[210,60],[211,60],[203,60],[205,60],[214,61],[70,1],[71,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[59,1],[10,1],[60,1],[1,1],[61,1],[62,1],[11,1],[67,1],[64,1],[63,1],[68,1],[66,1],[69,1],[65,1],[97,62],[107,63],[96,62],[117,64],[88,65],[87,66],[116,67],[110,68],[115,69],[90,70],[104,71],[89,72],[113,73],[85,74],[84,67],[114,75],[86,76],[91,77],[92,1],[95,77],[82,1],[118,78],[108,79],[99,80],[100,81],[102,82],[98,83],[101,84],[111,67],[93,85],[94,86],[103,87],[83,88],[106,79],[105,77],[109,1],[112,89],[72,1]]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/database/.gitignore b/packages/database/.gitignore new file mode 100644 index 0000000..11ddd8d --- /dev/null +++ b/packages/database/.gitignore @@ -0,0 +1,3 @@ +node_modules +# Keep environment variables out of version control +.env diff --git a/packages/database/package.json b/packages/database/package.json new file mode 100644 index 0000000..559e584 --- /dev/null +++ b/packages/database/package.json @@ -0,0 +1,37 @@ +{ + "name": "@wyvern/database", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "prisma:generate": "prisma generate", + "prisma:generateSql": "prisma generate --sql", + "prisma:push": "prisma db push", + "prisma:migrate": "prisma migrate dev", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + } + }, + "dependencies": { + "@prisma/client": "^5.22.0", + "@wyvern/config": "*", + "@wyvern/plugin-custom-logger": "*" + }, + "devDependencies": { + "client": "^0.0.1", + "prisma": "^5.22.0" + }, + "trustedDependencies": [ + "ws" + ] +} diff --git a/packages/database/prisma/migrations/20241130142822_initial/migration.sql b/packages/database/prisma/migrations/20241130142822_initial/migration.sql new file mode 100644 index 0000000..0eb5938 --- /dev/null +++ b/packages/database/prisma/migrations/20241130142822_initial/migration.sql @@ -0,0 +1,78 @@ +-- CreateTable +CREATE TABLE "user" ( + "id" TEXT NOT NULL, + + CONSTRAINT "user_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Guild" ( + "id" TEXT NOT NULL, + "guild_id" TEXT NOT NULL, + "auto_roles" TEXT[], + "report_channel" TEXT, + + CONSTRAINT "Guild_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "guild_welcome_message" ( + "id" TEXT NOT NULL, + "guild_id" TEXT NOT NULL, + "channel_id" TEXT NOT NULL, + "title" TEXT NOT NULL DEFAULT '🎉 Welcome to the server {user}!', + "description" TEXT NOT NULL DEFAULT '> Welcome to **{guild}** We hope you enjoy your stay here!', + "embed_color" TEXT NOT NULL DEFAULT '#5865F2', + "enabled" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "guild_welcome_message_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "guild_leave_message" ( + "id" TEXT NOT NULL, + "guild_id" TEXT NOT NULL, + "channel_id" TEXT NOT NULL, + "title" TEXT NOT NULL DEFAULT '👋 Goodbye {user}!', + "description" TEXT NOT NULL DEFAULT '> We''re sorry to see you go!', + "embed_color" TEXT NOT NULL DEFAULT '#5865F2', + "enabled" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "guild_leave_message_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Tag" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "content" TEXT NOT NULL, + "usages" INTEGER NOT NULL DEFAULT 0, + "image" TEXT, + "ownerId" TEXT NOT NULL, + "guildId" TEXT NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Guild_guild_id_key" ON "Guild"("guild_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "guild_welcome_message_guild_id_key" ON "guild_welcome_message"("guild_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "guild_leave_message_guild_id_key" ON "guild_leave_message"("guild_id"); + +-- AddForeignKey +ALTER TABLE "guild_welcome_message" ADD CONSTRAINT "guild_welcome_message_guild_id_fkey" FOREIGN KEY ("guild_id") REFERENCES "Guild"("guild_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "guild_leave_message" ADD CONSTRAINT "guild_leave_message_guild_id_fkey" FOREIGN KEY ("guild_id") REFERENCES "Guild"("guild_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Tag" ADD CONSTRAINT "Tag_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Tag" ADD CONSTRAINT "Tag_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/packages/database/prisma/migrations/20241130180637_make_welcome_channelid_nullable/migration.sql b/packages/database/prisma/migrations/20241130180637_make_welcome_channelid_nullable/migration.sql new file mode 100644 index 0000000..91eeab0 --- /dev/null +++ b/packages/database/prisma/migrations/20241130180637_make_welcome_channelid_nullable/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "guild_leave_message" ALTER COLUMN "channel_id" DROP NOT NULL; + +-- AlterTable +ALTER TABLE "guild_welcome_message" ALTER COLUMN "channel_id" DROP NOT NULL; diff --git a/packages/database/prisma/migrations/20241208190233_auto_carbon/migration.sql b/packages/database/prisma/migrations/20241208190233_auto_carbon/migration.sql new file mode 100644 index 0000000..9206968 --- /dev/null +++ b/packages/database/prisma/migrations/20241208190233_auto_carbon/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Guild" ADD COLUMN "auto_carbon" BOOLEAN NOT NULL DEFAULT false; diff --git a/packages/database/prisma/migrations/migration_lock.toml b/packages/database/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/packages/database/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma new file mode 100644 index 0000000..cef0dc9 --- /dev/null +++ b/packages/database/prisma/schema.prisma @@ -0,0 +1,83 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" + previewFeatures = ["typedSql"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id + ownedTags Tag[] + + @@map("user") +} + +model Guild { + id String @id @default(cuid()) + guildId String @unique @map("guild_id") + + tags Tag[] + + // Settings + autoRoles String[] @map("auto_roles") + reportChannel String? @map("report_channel") + guildWelcomeMessage GuildWelcomeMessage? + guildLeaveMessage GuildLeaveMessage? + autoCarbon Boolean @default(false) @map("auto_carbon") +} + +// Guild welcome message +model GuildWelcomeMessage { + id String @id @default(cuid()) + guildId String @unique @map(name: "guild_id") + channelId String? @map(name: "channel_id") + + title String @default("🎉 Welcome to the server {user}!") + description String @default("> Welcome to **{guild}** We hope you enjoy your stay here!") + embedColor String @default("#5865F2") @map(name: "embed_color") + enabled Boolean @default(false) + createdAt DateTime @default(now()) @map(name: "created_at") + + guild Guild @relation(fields: [guildId], references: [guildId], onDelete: Cascade) + + @@map(name: "guild_welcome_message") +} + +// Guild leave message +model GuildLeaveMessage { + id String @id @default(cuid()) + guildId String @unique @map(name: "guild_id") + channelId String? @map(name: "channel_id") + title String @default("👋 Goodbye {user}!") + description String @default("> We're sorry to see you go!") + embedColor String @default("#5865F2") @map(name: "embed_color") + enabled Boolean @default(false) + createdAt DateTime @default(now()) @map(name: "created_at") + guild Guild @relation(fields: [guildId], references: [guildId], onDelete: Cascade) + + @@map(name: "guild_leave_message") +} + +model Tag { + id String @id @default(cuid()) + + owner User @relation(fields: [ownerId], references: [id]) + guild Guild @relation(fields: [guildId], references: [id]) + + name String + content String + usages Int @default(0) + image String? + + ownerId String + guildId String +} diff --git a/packages/database/prisma/sql/createAutoRole.sql b/packages/database/prisma/sql/createAutoRole.sql new file mode 100644 index 0000000..db25c8d --- /dev/null +++ b/packages/database/prisma/sql/createAutoRole.sql @@ -0,0 +1,8 @@ +-- @param {String} $1:role_id +-- @param {String} $2:guild_id +UPDATE + "public"."Guild" +SET + "AutoRoles" = array_append("AutoRoles", $1) +WHERE + "id" = $2; \ No newline at end of file diff --git a/packages/database/prisma/sql/createTag.sql b/packages/database/prisma/sql/createTag.sql new file mode 100644 index 0000000..248e0f0 --- /dev/null +++ b/packages/database/prisma/sql/createTag.sql @@ -0,0 +1,27 @@ + +-- @param {String} $1:content +-- @param {String} $2:image +-- @param {String} $3:name +-- @param {String} $4:guildId +-- @param {String} $5:ownerId +-- @param {String} $6:id +INSERT INTO + "Tag" ( + "Content", + "Image", + "Name", + + "guildId", + "ownerId", + + "Id" + ) +VALUES ( + $1, + $2, + $3, + + $4, + $5, + $6 +) \ No newline at end of file diff --git a/packages/database/prisma/sql/findTagByTitle.sql b/packages/database/prisma/sql/findTagByTitle.sql new file mode 100644 index 0000000..6b17d39 --- /dev/null +++ b/packages/database/prisma/sql/findTagByTitle.sql @@ -0,0 +1,11 @@ +-- @param {String} $1:guildId +-- @param {String} $2:name +SELECT + * +FROM + "Tag" +WHERE + "guildId" = $1 + AND "Name" = $2 +LIMIT + 1 \ No newline at end of file diff --git a/packages/database/prisma/sql/removeAutoRole.sql b/packages/database/prisma/sql/removeAutoRole.sql new file mode 100644 index 0000000..b0746da --- /dev/null +++ b/packages/database/prisma/sql/removeAutoRole.sql @@ -0,0 +1,8 @@ +-- @param {String} $1:role_id +-- @param {String} $2:guild_id +UPDATE + "public"."Guild" +SET + "AutoRoles" = array_remove("AutoRoles", $1) +WHERE + "id" = $2; \ No newline at end of file diff --git a/packages/database/src/helpers/getGuild.ts b/packages/database/src/helpers/getGuild.ts new file mode 100644 index 0000000..2e12bc8 --- /dev/null +++ b/packages/database/src/helpers/getGuild.ts @@ -0,0 +1,10 @@ +import { Guild, Prisma, prismaClient } from "../index.js"; +import { Result } from "@sapphire/framework"; + +export async function getGuild(id: string) { + return Result.fromAsync( + prismaClient.guild.findFirstOrThrow({ + where: { guildId: id }, + }) + ); +} diff --git a/packages/database/src/helpers/index.ts b/packages/database/src/helpers/index.ts new file mode 100644 index 0000000..96b3cce --- /dev/null +++ b/packages/database/src/helpers/index.ts @@ -0,0 +1 @@ +export * from "./getGuild.js"; diff --git a/packages/database/src/index.ts b/packages/database/src/index.ts new file mode 100644 index 0000000..da48b91 --- /dev/null +++ b/packages/database/src/index.ts @@ -0,0 +1,53 @@ +import { PrismaClient } from "@prisma/client"; +import { wyvernLogger } from "@wyvern/plugin-custom-logger"; +import { debugConfig } from "@wyvern/config/debug"; + +const log = wyvernLogger.child({ activity: "database" }); + +const pris = new PrismaClient({ + log: [ + { emit: "event", level: "query" }, + { emit: "event", level: "warn" }, + { emit: "event", level: "error" }, + ], +}); + +const prismaClientWrapper = (): PrismaClient => { + if (debugConfig.displayDatabaseLogs) { + pris.$on("query", ({ duration, query }) => { + log.info("Query: %s", query); + log.info("Duration: %dms", duration); + }); + + pris.$on("warn", ({ message }) => { + wyvernLogger.warn(`Prisma Warning: %s`, message); + }); + + pris.$on("error", ({ message }) => { + wyvernLogger.warn(`Prisma Error: %s`, message); + }); + } + + return pris; +}; + +const prismaClientSingleton = () => { + return prismaClientWrapper(); +}; + +declare const globalThis: { + prismaGlobal: ReturnType; +} & typeof global; + +// const prisma: PrismaClient = globalThis.prismaGlobal ?? prismaClientSingleton(); + +export const prismaClient = globalThis.prismaGlobal ?? prismaClientSingleton(); + +if (process.env.NODE_ENV !== "production") globalThis.prismaGlobal = pris; + +// also export types +export * from "@prisma/client"; +export * from "@prisma/client/sql"; + +// export helper funcs +export * from "./helpers/index.js"; diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/database/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/error-handler/package.json b/packages/error-handler/package.json new file mode 100644 index 0000000..3d9e272 --- /dev/null +++ b/packages/error-handler/package.json @@ -0,0 +1,21 @@ +{ + "name": "@wyvern/error-handler", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + } + } +} diff --git a/packages/error-handler/src/WyvernErrorHandler.ts b/packages/error-handler/src/WyvernErrorHandler.ts new file mode 100644 index 0000000..2654630 --- /dev/null +++ b/packages/error-handler/src/WyvernErrorHandler.ts @@ -0,0 +1,53 @@ +import * as Sentry from "@sentry/node"; + +export class WyvernErrorHandler { + constructor() { + const dsn = process.env.SENTRY_DSN; + + if (dsn == undefined) { + throw new Error("process.env.SENTRY_DSN is undefined"); + } + + if (!Sentry.isInitialized()) { + Sentry.init({ + dsn, + }); + } + } + + public async handleCommandError(options: CommandErrorOptions) { + if (process.env.NODE_ENV != "production") return; + + Sentry.captureException(options.error, (scope) => { + scope.setContext("Command", { + commandName: options.commandName, + commandId: options.commandId, + }); + + scope.setContext("Guild", { + commandName: options.guildName, + commandId: options.guildId, + }); + + scope.setUser({ + username: options.username, + id: options.userId, + }); + + return scope; + }); + } +} + +interface CommandErrorOptions { + error: Error; + + commandName: string; + commandId: string; + + username: string; + userId: string; + + guildName: string; + guildId: string; +} diff --git a/packages/error-handler/src/index.ts b/packages/error-handler/src/index.ts new file mode 100644 index 0000000..c37f56f --- /dev/null +++ b/packages/error-handler/src/index.ts @@ -0,0 +1 @@ +export * from "./WyvernErrorHandler.js"; diff --git a/packages/error-handler/tsconfig.json b/packages/error-handler/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/error-handler/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/error-handler/tsconfig.tsbuildinfo b/packages/error-handler/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1ed360d --- /dev/null +++ b/packages/error-handler/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/foo.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36bcced44876ff177efb79cc8662aafc1ae351077eee9e034fd7b036e9d33ab5","signature":"3dee7bbd2b685bdcb66cfc9b45605d6689ea42852231fa79cac9a40643c0fa22","impliedFormat":99},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ca6d304b929748ea15c33f28c1f159df18a94470b424ab78c52d68d40a41e1e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"4d7da7075068195f8f127f41c61e304cdca5aafb1be2d0f4fb67c6b4c3e98d50","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4bdde4e601e9554a844e1e0d0ccfa05e183ef9d82ab3ac25f17c1709033d360","impliedFormat":1},{"version":"ad23fd126ff06e72728dd7bfc84326a8ca8cec2b9d2dac0193d42a777df0e7d8","impliedFormat":1},{"version":"9dd9f50652a176469e85fb65aa081d2e7eb807e2c476f378233de4f1f6604962","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"7edec695cdb707c7146ac34c44ca364469c7ea504344b3206c686e79f61b61a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a20f1e119615bf7632729fd89b6c0b5ffdc2df3b512d6304146294528e3ebe19","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"08353b04a3501d84fc8d7b49de99f6c1cc26026e6d9d697a18315f3bfe92ed03","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"efeedd8bbc5c0d53e760d8b120a010470722982e6ae14de8d1bcff66ebc2ae71","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"9091e564b81e7b4c382a33c62de704a699e10508190547d4f7c1c3e039d2db2b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","impliedFormat":1}],"root":[72],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"importHelpers":false,"module":100,"newLine":1,"noEmitHelpers":false,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":false,"rootDir":"./src","sourceMap":true,"strict":true,"target":7,"useDefineForClassFields":true},"fileIdsList":[[81,123],[81,120,123],[81,122,123],[81,123,128,157],[81,123,124,129,135,136,143,154,165],[81,123,124,125,135,143],[76,77,78,81,123],[81,123,126,166],[81,123,127,128,136,144],[81,123,128,154,162],[81,123,129,131,135,143],[81,122,123,130],[81,123,131,132],[81,123,135],[81,123,133,135],[81,122,123,135],[81,123,135,136,137,154,165],[81,123,135,136,137,150,154,157],[81,118,123,170],[81,123,131,135,138,143,154,165],[81,123,135,136,138,139,143,154,162,165],[81,123,138,140,154,162,165],[81,123,135,141],[81,123,142,165,170],[81,123,131,135,143,154],[81,123,144],[81,123,145],[81,122,123,146],[81,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,148],[81,123,149],[81,123,135,150,151],[81,123,150,152,166,168],[81,123,135,154,155,156,157],[81,123,154,156],[81,123,154,155],[81,123,157],[81,123,158],[81,120,123,154],[81,123,135,160,161],[81,123,160,161],[81,123,128,143,154,162],[81,123,163],[123],[79,80,81,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,143,164],[81,123,138,149,165],[81,123,128,166],[81,123,154,167],[81,123,142,168],[81,123,169],[81,123,128,135,137,146,154,165,168,170],[81,123,154,171],[81,123,174,213],[81,123,174,198,213],[81,123,213],[81,123,174],[81,123,174,199,213],[81,123,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212],[81,123,199,213],[81,123,135,138,140,154,162,165,171,172],[81,90,94,123,165],[81,90,123,154,165],[81,85,123],[81,87,90,123,162,165],[81,123,143,162],[81,123,172],[81,85,123,172],[81,87,90,123,143,165],[81,82,83,86,89,123,135,154,165],[81,90,97,123],[81,82,88,123],[81,90,111,112,123],[81,86,90,123,157,165,172],[81,111,123,172],[81,84,85,123,172],[81,90,123],[81,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,123],[81,90,105,123],[81,90,97,98,123],[81,88,90,98,99,123],[81,89,123],[81,82,85,90,123],[81,90,94,98,99,123],[81,94,123],[81,88,90,93,123,165],[81,82,87,90,97,123],[81,123,154],[81,85,90,111,123,170,172]],"referencedMap":[[73,1],[74,1],[75,1],[120,2],[121,2],[122,3],[123,4],[124,5],[125,6],[76,1],[79,7],[77,1],[78,1],[126,8],[127,9],[128,10],[129,11],[130,12],[131,13],[132,13],[134,14],[133,15],[135,16],[136,17],[137,18],[119,19],[138,20],[139,21],[140,22],[141,23],[142,24],[143,25],[144,26],[145,27],[146,28],[147,29],[148,30],[149,31],[150,32],[151,32],[152,33],[153,1],[154,34],[156,35],[155,36],[157,37],[158,38],[159,39],[160,40],[161,41],[162,42],[163,43],[81,44],[80,1],[172,45],[164,46],[165,47],[166,48],[167,49],[168,50],[169,51],[170,52],[171,53],[173,1],[198,54],[199,55],[174,56],[177,56],[196,54],[197,54],[187,54],[186,57],[184,54],[179,54],[192,54],[190,54],[194,54],[178,54],[191,54],[195,54],[180,54],[181,54],[193,54],[175,54],[182,54],[183,54],[185,54],[189,54],[200,58],[188,54],[176,54],[213,59],[212,1],[207,58],[209,60],[208,58],[201,58],[202,58],[204,58],[206,58],[210,60],[211,60],[203,60],[205,60],[214,61],[70,1],[71,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[59,1],[10,1],[60,1],[1,1],[61,1],[62,1],[11,1],[67,1],[64,1],[63,1],[68,1],[66,1],[69,1],[65,1],[97,62],[107,63],[96,62],[117,64],[88,65],[87,66],[116,67],[110,68],[115,69],[90,70],[104,71],[89,72],[113,73],[85,74],[84,67],[114,75],[86,76],[91,77],[92,1],[95,77],[82,1],[118,78],[108,79],[99,80],[100,81],[102,82],[98,83],[101,84],[111,67],[93,85],[94,86],[103,87],[83,88],[106,79],[105,77],[109,1],[112,89],[72,1]]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md new file mode 100644 index 0000000..8b42d90 --- /dev/null +++ b/packages/eslint-config/README.md @@ -0,0 +1,3 @@ +# `@turbo/eslint-config` + +Collection of internal eslint configurations. diff --git a/packages/eslint-config/library.js b/packages/eslint-config/library.js new file mode 100644 index 0000000..9b59cc0 --- /dev/null +++ b/packages/eslint-config/library.js @@ -0,0 +1,34 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["eslint:recommended", "prettier", "turbo"], + plugins: ["only-warn"], + globals: { + React: true, + JSX: true, + }, + env: { + node: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + { + files: ["*.js?(x)", "*.ts?(x)"], + }, + ], +}; diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js new file mode 100644 index 0000000..88445be --- /dev/null +++ b/packages/eslint-config/next.js @@ -0,0 +1,35 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: [ + "eslint:recommended", + "prettier", + require.resolve("@vercel/style-guide/eslint/next"), + "turbo", + ], + globals: { + React: true, + JSX: true, + }, + env: { + node: true, + browser: true, + }, + plugins: ["only-warn"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + ], + overrides: [{ files: ["*.js?(x)", "*.ts?(x)"] }], +}; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 0000000..65874ab --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,19 @@ +{ + "name": "@wyvern/eslint-config", + "version": "0.0.0", + "private": true, + "files": [ + "library.js", + "next.js", + "react-internal.js" + ], + "devDependencies": { + "@vercel/style-guide": "^5.2.0", + "eslint-config-turbo": "^2.0.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-only-warn": "^1.1.0", + "@typescript-eslint/parser": "^7.1.0", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "typescript": "5.5.4" + } +} diff --git a/packages/eslint-config/react-internal.js b/packages/eslint-config/react-internal.js new file mode 100644 index 0000000..bf0a208 --- /dev/null +++ b/packages/eslint-config/react-internal.js @@ -0,0 +1,39 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use with + * internal (bundled by their consumer) libraries + * that utilize React. + */ + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["eslint:recommended", "prettier", "turbo"], + plugins: ["only-warn"], + globals: { + React: true, + JSX: true, + }, + env: { + browser: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + // Force ESLint to detect .tsx files + { files: ["*.js?(x)", "*.ts?(x)"] }, + ], +}; diff --git a/packages/markdown/jest.config.js b/packages/markdown/jest.config.js new file mode 100644 index 0000000..afa4723 --- /dev/null +++ b/packages/markdown/jest.config.js @@ -0,0 +1,7 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} **/ +export default { + testEnvironment: "node", + transform: { + "^.+.tsx?$": ["ts-jest",{}], + }, +}; \ No newline at end of file diff --git a/packages/markdown/package.json b/packages/markdown/package.json new file mode 100644 index 0000000..0676120 --- /dev/null +++ b/packages/markdown/package.json @@ -0,0 +1,29 @@ +{ + "name": "@wyvern/markdown", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "test": "vitest", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + } + }, + "devDependencies": { + "@jest/globals": "^29.7.0", + "@types/jest": "^29.5.14", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "vitest": "^2.1.6" + } +} diff --git a/packages/markdown/src/formatters/bold.ts b/packages/markdown/src/formatters/bold.ts new file mode 100644 index 0000000..7381df0 --- /dev/null +++ b/packages/markdown/src/formatters/bold.ts @@ -0,0 +1,5 @@ +type Bold = `**${Text}**`; + +export function bold(text: Text): Bold { + return `**${text}**`; +} diff --git a/packages/markdown/src/formatters/codeblock.ts b/packages/markdown/src/formatters/codeblock.ts new file mode 100644 index 0000000..39add23 --- /dev/null +++ b/packages/markdown/src/formatters/codeblock.ts @@ -0,0 +1,12 @@ +type CodeBlock< + Text extends string, + Lang extends string | undefined = "", +> = `\`\`\`${Lang}\n${Text}\n\`\`\``; + +export function codeblock< + Text extends string, + Lang extends string | undefined = "", +>(text: Text, lang?: Lang): CodeBlock { + lang ??= "" as Lang; + return `\`\`\`${lang}\n${text}\n\`\`\``; +} diff --git a/packages/markdown/src/formatters/heading.ts b/packages/markdown/src/formatters/heading.ts new file mode 100644 index 0000000..89825d6 --- /dev/null +++ b/packages/markdown/src/formatters/heading.ts @@ -0,0 +1,15 @@ +type H1 = `# ${Text}`; +type H2 = `## ${Text}`; +type H3 = `### ${Text}`; + +export function h1(text: Text): H1 { + return `# ${text}`; +} + +export function h2(text: Text): H2 { + return `## ${text}`; +} + +export function h3(text: Text): H3 { + return `### ${text}`; +} diff --git a/packages/markdown/src/formatters/italic.ts b/packages/markdown/src/formatters/italic.ts new file mode 100644 index 0000000..d8bad5f --- /dev/null +++ b/packages/markdown/src/formatters/italic.ts @@ -0,0 +1,5 @@ +type Itaic = `_${Text}_`; + +export function italic(text: Text): Itaic { + return `_${text}_`; +} diff --git a/packages/markdown/src/formatters/mention.ts b/packages/markdown/src/formatters/mention.ts new file mode 100644 index 0000000..b25a3df --- /dev/null +++ b/packages/markdown/src/formatters/mention.ts @@ -0,0 +1,27 @@ +type Mentionable = "user" | "channel" | "role"; + +// prettier-ignore +type Mention = + Type extends "user" + ? `<@${Id}>` + : Type extends "channel" + ? `<#${Id}>` + : Type extends "role" + ? `<@&${Id}>` + : never; + +export function mention( + type: Type, + id: Id +): Mention { + switch (type) { + case "channel": + return `<#${id}>` as Mention; + case "role": + return `<@&${id}>` as Mention; + case "user": + return `<@${id}>` as Mention; + default: + throw `Invalid mentionable type: ${type}`; + } +} diff --git a/packages/markdown/src/formatters/quote.ts b/packages/markdown/src/formatters/quote.ts new file mode 100644 index 0000000..3bf454f --- /dev/null +++ b/packages/markdown/src/formatters/quote.ts @@ -0,0 +1,10 @@ +type Quote = `> ${Text}`; +type BlockQuote = `>>> ${Text}`; + +export function quote(text: Text): Quote { + return `> ${text}`; +} + +export function blockQuote(text: Text): BlockQuote { + return `>>> ${text}`; +} diff --git a/packages/markdown/src/formatters/spoiler.ts b/packages/markdown/src/formatters/spoiler.ts new file mode 100644 index 0000000..d8ab696 --- /dev/null +++ b/packages/markdown/src/formatters/spoiler.ts @@ -0,0 +1,5 @@ +type Spoiler = `||${Text}||`; + +export function spoiler(text: Text): Spoiler { + return `||${text}||`; +} diff --git a/packages/markdown/src/formatters/strikethrough.ts b/packages/markdown/src/formatters/strikethrough.ts new file mode 100644 index 0000000..0bb6a29 --- /dev/null +++ b/packages/markdown/src/formatters/strikethrough.ts @@ -0,0 +1,7 @@ +type Underline = `~~${Text}~~`; + +export function strikethrough( + text: Text +): Underline { + return `~~${text}~~`; +} diff --git a/packages/markdown/src/formatters/underline.ts b/packages/markdown/src/formatters/underline.ts new file mode 100644 index 0000000..91ebcea --- /dev/null +++ b/packages/markdown/src/formatters/underline.ts @@ -0,0 +1,5 @@ +type Underline = `__${Text}__`; + +export function underline(text: Text): Underline { + return `__${text}__`; +} diff --git a/packages/markdown/src/index.ts b/packages/markdown/src/index.ts new file mode 100644 index 0000000..cb8da8e --- /dev/null +++ b/packages/markdown/src/index.ts @@ -0,0 +1,10 @@ +export * from "./formatters/bold.js"; +export * from "./formatters/codeblock.js"; +export * from "./formatters/heading.js"; +export * from "./formatters/italic.js"; +export * from "./formatters/quote.js"; +export * from "./formatters/spoiler.js"; +export * from "./formatters/strikethrough.js"; +export * from "./formatters/underline.js"; + +export * from "./formatters/mention.js"; diff --git a/packages/markdown/tests/markdown.test.ts b/packages/markdown/tests/markdown.test.ts new file mode 100644 index 0000000..51f17f6 --- /dev/null +++ b/packages/markdown/tests/markdown.test.ts @@ -0,0 +1,44 @@ +import { expect, test } from "vitest"; +import * as md from "@wyvern/markdown"; + +test("Bold", () => { + expect(md.bold("foo")).toEqual("**foo**"); +}); + +test("Codeblock", () => { + expect(md.codeblock("foo")).toEqual("```\nfoo\n```"); + expect(md.codeblock("foo", "js")).toEqual("```js\nfoo\n```"); +}); + +test("Heading", () => { + expect(md.h1("foo")).toEqual("# foo"); + expect(md.h2("foo")).toEqual("## foo"); + expect(md.h3("foo")).toEqual("### foo"); +}); + +test("Italic", () => { + expect(md.italic("foo")).toEqual("_foo_"); +}); + +test("Mention", () => { + expect(md.mention("channel", "123")).toEqual("<#123>"); + expect(md.mention("role", "123")).toEqual("<@&123>"); + expect(md.mention("user", "123")).toEqual("<@123>"); +}); + +test("Quote", () => { + expect(md.quote("foo")).toEqual("> foo"); + expect(md.blockQuote("foo")).toEqual(">>> foo"); +}); + +test("Spoiler", () => { + expect(md.spoiler("foo")).toEqual("||foo||"); +}); + +test("Strikethrough", () => { + expect(md.strikethrough("foo")).toEqual("~~foo~~"); +}); + +test("Underline", () => { + expect(md.strikethrough("foo")).toEqual("~~foo~~"); +}); diff --git a/packages/markdown/tsconfig.json b/packages/markdown/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/markdown/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/markdown/tsconfig.tsbuildinfo b/packages/markdown/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1ed360d --- /dev/null +++ b/packages/markdown/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/foo.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36bcced44876ff177efb79cc8662aafc1ae351077eee9e034fd7b036e9d33ab5","signature":"3dee7bbd2b685bdcb66cfc9b45605d6689ea42852231fa79cac9a40643c0fa22","impliedFormat":99},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ca6d304b929748ea15c33f28c1f159df18a94470b424ab78c52d68d40a41e1e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"4d7da7075068195f8f127f41c61e304cdca5aafb1be2d0f4fb67c6b4c3e98d50","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4bdde4e601e9554a844e1e0d0ccfa05e183ef9d82ab3ac25f17c1709033d360","impliedFormat":1},{"version":"ad23fd126ff06e72728dd7bfc84326a8ca8cec2b9d2dac0193d42a777df0e7d8","impliedFormat":1},{"version":"9dd9f50652a176469e85fb65aa081d2e7eb807e2c476f378233de4f1f6604962","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"7edec695cdb707c7146ac34c44ca364469c7ea504344b3206c686e79f61b61a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a20f1e119615bf7632729fd89b6c0b5ffdc2df3b512d6304146294528e3ebe19","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"08353b04a3501d84fc8d7b49de99f6c1cc26026e6d9d697a18315f3bfe92ed03","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"efeedd8bbc5c0d53e760d8b120a010470722982e6ae14de8d1bcff66ebc2ae71","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"9091e564b81e7b4c382a33c62de704a699e10508190547d4f7c1c3e039d2db2b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","impliedFormat":1}],"root":[72],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"importHelpers":false,"module":100,"newLine":1,"noEmitHelpers":false,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":false,"rootDir":"./src","sourceMap":true,"strict":true,"target":7,"useDefineForClassFields":true},"fileIdsList":[[81,123],[81,120,123],[81,122,123],[81,123,128,157],[81,123,124,129,135,136,143,154,165],[81,123,124,125,135,143],[76,77,78,81,123],[81,123,126,166],[81,123,127,128,136,144],[81,123,128,154,162],[81,123,129,131,135,143],[81,122,123,130],[81,123,131,132],[81,123,135],[81,123,133,135],[81,122,123,135],[81,123,135,136,137,154,165],[81,123,135,136,137,150,154,157],[81,118,123,170],[81,123,131,135,138,143,154,165],[81,123,135,136,138,139,143,154,162,165],[81,123,138,140,154,162,165],[81,123,135,141],[81,123,142,165,170],[81,123,131,135,143,154],[81,123,144],[81,123,145],[81,122,123,146],[81,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,148],[81,123,149],[81,123,135,150,151],[81,123,150,152,166,168],[81,123,135,154,155,156,157],[81,123,154,156],[81,123,154,155],[81,123,157],[81,123,158],[81,120,123,154],[81,123,135,160,161],[81,123,160,161],[81,123,128,143,154,162],[81,123,163],[123],[79,80,81,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,143,164],[81,123,138,149,165],[81,123,128,166],[81,123,154,167],[81,123,142,168],[81,123,169],[81,123,128,135,137,146,154,165,168,170],[81,123,154,171],[81,123,174,213],[81,123,174,198,213],[81,123,213],[81,123,174],[81,123,174,199,213],[81,123,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212],[81,123,199,213],[81,123,135,138,140,154,162,165,171,172],[81,90,94,123,165],[81,90,123,154,165],[81,85,123],[81,87,90,123,162,165],[81,123,143,162],[81,123,172],[81,85,123,172],[81,87,90,123,143,165],[81,82,83,86,89,123,135,154,165],[81,90,97,123],[81,82,88,123],[81,90,111,112,123],[81,86,90,123,157,165,172],[81,111,123,172],[81,84,85,123,172],[81,90,123],[81,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,123],[81,90,105,123],[81,90,97,98,123],[81,88,90,98,99,123],[81,89,123],[81,82,85,90,123],[81,90,94,98,99,123],[81,94,123],[81,88,90,93,123,165],[81,82,87,90,97,123],[81,123,154],[81,85,90,111,123,170,172]],"referencedMap":[[73,1],[74,1],[75,1],[120,2],[121,2],[122,3],[123,4],[124,5],[125,6],[76,1],[79,7],[77,1],[78,1],[126,8],[127,9],[128,10],[129,11],[130,12],[131,13],[132,13],[134,14],[133,15],[135,16],[136,17],[137,18],[119,19],[138,20],[139,21],[140,22],[141,23],[142,24],[143,25],[144,26],[145,27],[146,28],[147,29],[148,30],[149,31],[150,32],[151,32],[152,33],[153,1],[154,34],[156,35],[155,36],[157,37],[158,38],[159,39],[160,40],[161,41],[162,42],[163,43],[81,44],[80,1],[172,45],[164,46],[165,47],[166,48],[167,49],[168,50],[169,51],[170,52],[171,53],[173,1],[198,54],[199,55],[174,56],[177,56],[196,54],[197,54],[187,54],[186,57],[184,54],[179,54],[192,54],[190,54],[194,54],[178,54],[191,54],[195,54],[180,54],[181,54],[193,54],[175,54],[182,54],[183,54],[185,54],[189,54],[200,58],[188,54],[176,54],[213,59],[212,1],[207,58],[209,60],[208,58],[201,58],[202,58],[204,58],[206,58],[210,60],[211,60],[203,60],[205,60],[214,61],[70,1],[71,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[59,1],[10,1],[60,1],[1,1],[61,1],[62,1],[11,1],[67,1],[64,1],[63,1],[68,1],[66,1],[69,1],[65,1],[97,62],[107,63],[96,62],[117,64],[88,65],[87,66],[116,67],[110,68],[115,69],[90,70],[104,71],[89,72],[113,73],[85,74],[84,67],[114,75],[86,76],[91,77],[92,1],[95,77],[82,1],[118,78],[108,79],[99,80],[100,81],[102,82],[98,83],[101,84],[111,67],[93,85],[94,86],[103,87],[83,88],[106,79],[105,77],[109,1],[112,89],[72,1]]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/plugin-custom-logger/package.json b/packages/plugin-custom-logger/package.json new file mode 100644 index 0000000..95ccc07 --- /dev/null +++ b/packages/plugin-custom-logger/package.json @@ -0,0 +1,31 @@ +{ + "name": "@wyvern/plugin-custom-logger", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + }, + "./register": { + "default": "./dist/src/register.js", + "types": "./src/register.ts" + } + }, + "dependencies": { + "@datalust/winston-seq": "^2.0.0", + "@wyvern/config": "*", + "winston": "^3.17.0", + "winston-transport-sentry-node": "^3.0.0" + } +} diff --git a/packages/plugin-custom-logger/src/foo.ts b/packages/plugin-custom-logger/src/foo.ts new file mode 100644 index 0000000..73e0ebd --- /dev/null +++ b/packages/plugin-custom-logger/src/foo.ts @@ -0,0 +1,3 @@ +export function foo() { + return "bar" +} \ No newline at end of file diff --git a/packages/plugin-custom-logger/src/index.ts b/packages/plugin-custom-logger/src/index.ts new file mode 100644 index 0000000..eaac632 --- /dev/null +++ b/packages/plugin-custom-logger/src/index.ts @@ -0,0 +1,12 @@ +import { Logger, type LoggerOptions } from "./lib/Logger.js"; + +export * from "./lib/Logger.js"; +export * from "./lib/LoggerLevel.js"; +export * from "./lib/LoggerStyle.js"; +export * from "./lib/LoggerTimestamp.js"; + +export const wyvernLogger = new Logger().logger; + +declare module "@sapphire/framework" { + export interface ClientLoggerOptions extends LoggerOptions {} +} diff --git a/packages/plugin-custom-logger/src/lib/Logger.ts b/packages/plugin-custom-logger/src/lib/Logger.ts new file mode 100644 index 0000000..3e99968 --- /dev/null +++ b/packages/plugin-custom-logger/src/lib/Logger.ts @@ -0,0 +1,243 @@ +import { + Logger as BuiltinLogger, + LogLevel, + type LogMethods, +} from "@sapphire/framework"; +import { + bgRed, + cyan, + gray, + isColorSupported, + magenta, + red, + white, + yellow, + type Color, +} from "colorette"; +import { Console } from "console"; +import { inspect, type InspectOptions } from "util"; +import { LoggerLevel, type LoggerLevelOptions } from "./LoggerLevel.js"; +import { debugConfig } from "@wyvern/config"; +import * as winston from "winston"; +import { SeqTransport } from "@datalust/winston-seq"; + +const { printf, combine, timestamp, colorize, splat } = winston.format; + +export class Logger extends BuiltinLogger { + public readonly console: Console; + + public readonly formats: Map; + + public readonly join: string; + + public readonly depth: number; + + public readonly logger: winston.Logger; + + public constructor(options: LoggerOptions = {}) { + super(options.level ?? LogLevel.Info); + + this.console = new Console( + options.stdout ?? process.stdout, + options.stderr ?? process.stderr + ); + this.formats = Logger.createFormatMap( + options.format, + options.defaultFormat + ); + this.join = options.join ?? " "; + this.depth = options.depth ?? 0; + + const myFormat = printf(({ level, message, timestamp }) => { + return `${timestamp} ${level} - ${message}`; + }); + + const consoleFormat = combine( + splat(), + colorize({ + colors: { + verbose: "bgGrey", + debug: "bgMagenta", + info: "bgCyan", + warn: "bgYellow", + error: "bgRed", + fatal: "bgRed", + }, + level: true, + }), + timestamp({ format: "D/MM/YYYY HH:mm:ss" }), + myFormat + ); + + const transports: winston.transport[] = [ + new winston.transports.Console({ format: consoleFormat }), + ]; + + if (process.env.SEQ_URL && process.env.SEQ_API_KEY) { + transports.push( + new SeqTransport({ + apiKey: process.env.SEQ_URL, + serverUrl: process.env.SEQ_URL, + onError: (e) => console.error(e), + level: "info", + }) + ); + } + + // const SentryTransport = Sentry.default.default // what the fuck + // if (process.env.SENTRY_DSN) { + // transports.push(new SentryTransport({ + // sentry: { dsn: process.env.SENTRY_DSN }, + // level: 'error' + // })) + // } + + this.logger = winston.createLogger({ + level: debugConfig.logLevel, + transports, + }); + } + + // @ts-ignore + public override write(level: LogLevel, ...values: readonly unknown[]): void { + if (level < this.level) return; + + // @ts-ignore + const method = this.levels.get(level) ?? "log"; + + // @ts-ignore + const formatter = + this.formats.get(level) ?? this.formats.get(LogLevel.None)!; + + // const msg = formatter.run(this.preprocess(values)); + const msg = this.preprocess(values); + + switch (level) { + case LogLevel.Trace: + this.logger.verbose(msg); + break; + case LogLevel.Debug: + this.logger.debug(msg); + break; + case LogLevel.Info: + this.logger.info(msg); + break; + case LogLevel.Warn: + this.logger.warn(msg); + break; + case LogLevel.Error: + this.logger.error(msg); + break; + case LogLevel.Fatal: + this.logger.error(msg); + break; + case LogLevel.None: + break; + } + } + + protected preprocess(values: readonly unknown[]) { + const inspectOptions: InspectOptions = { + colors: isColorSupported, + depth: this.depth, + }; + return values + .map((value) => + typeof value === "string" ? value : inspect(value, inspectOptions) + ) + .join(this.join); + } + + private get levels() { + return Reflect.get(BuiltinLogger, "levels") as Map; + } + + public static get stylize() { + return isColorSupported; + } + + private static createFormatMap( + options: LoggerFormatOptions = {}, + defaults: LoggerLevelOptions = options.none ?? {} + ) { + return new Map([ + [ + LogLevel.Trace, + Logger.ensureDefaultLevel(options.trace, defaults, gray, "TRA"), + ], + [ + LogLevel.Debug, + Logger.ensureDefaultLevel(options.debug, defaults, magenta, "DBG"), + ], + [ + LogLevel.Info, + Logger.ensureDefaultLevel(options.info, defaults, cyan, "INF"), + ], + [ + LogLevel.Warn, + Logger.ensureDefaultLevel(options.warn, defaults, yellow, "WRN"), + ], + [ + LogLevel.Error, + Logger.ensureDefaultLevel(options.error, defaults, red, "ERR"), + ], + [ + LogLevel.Fatal, + Logger.ensureDefaultLevel(options.fatal, defaults, bgRed, "FTL"), + ], + [ + LogLevel.None, + Logger.ensureDefaultLevel(options.none, defaults, white, ""), + ], + ]); + } + + private static ensureDefaultLevel( + options: LoggerLevelOptions | undefined, + defaults: LoggerLevelOptions, + color: Color, + name: string + ) { + if (options) return new LoggerLevel(options); + return new LoggerLevel({ + ...defaults, + timestamp: + defaults.timestamp === null + ? null + : { ...(defaults.timestamp ?? {}), color }, + infix: name.length ? `${color(name.padEnd(3, " "))} - ` : "", + }); + } +} + +export interface LoggerOptions { + stdout?: NodeJS.WritableStream; + + stderr?: NodeJS.WritableStream; + + defaultFormat?: LoggerLevelOptions; + + format?: LoggerFormatOptions; + + level?: LogLevel; + + join?: string; + + depth?: number; +} + +export interface LoggerFormatOptions { + trace?: LoggerLevelOptions; + + debug?: LoggerLevelOptions; + + info?: LoggerLevelOptions; + + warn?: LoggerLevelOptions; + + error?: LoggerLevelOptions; + + fatal?: LoggerLevelOptions; + + none?: LoggerLevelOptions; +} diff --git a/packages/plugin-custom-logger/src/lib/LoggerLevel.ts b/packages/plugin-custom-logger/src/lib/LoggerLevel.ts new file mode 100644 index 0000000..58acd6d --- /dev/null +++ b/packages/plugin-custom-logger/src/lib/LoggerLevel.ts @@ -0,0 +1,72 @@ +import { LoggerStyle, type LoggerStyleResolvable } from './LoggerStyle.js'; +import { LoggerTimestamp, type LoggerTimestampOptions } from './LoggerTimestamp.js'; + +/** + * Logger utility that stores and applies a full style into the message. + * @since 1.0.0 + */ +export class LoggerLevel { + /** + * The timestamp formatter. + * @since 1.0.0 + */ + public timestamp: LoggerTimestamp | null; + + /** + * The infix, added between the timestamp and the message. + * @since 1.0.0 + */ + public infix: string; + + /** + * The style formatter for the message. + * @since 1.0.0 + */ + public message: LoggerStyle | null; + + public constructor(options: LoggerLevelOptions = {}) { + this.timestamp = options.timestamp === null ? null : new LoggerTimestamp(options.timestamp); + this.infix = options.infix ?? ''; + this.message = options.message === null ? null : new LoggerStyle(options.message); + } + + public run(content: string) { + const prefix = (this.timestamp?.run() ?? '') + this.infix; + + if (prefix.length) { + const formatter = this.message // + ? (line: string) => prefix + this.message!.run(line) + : (line: string) => prefix + line; + return content.split('\n').map(formatter).join('\n'); + } + + return this.message ? this.message.run(content) : content; + } +} + +/** + * The options for {@link LoggerLevel}. + * @since 1.0.0 + */ +export interface LoggerLevelOptions { + /** + * The timestamp options. Set to `null` to disable timestamp parsing. + * @since 1.0.0 + * @default {} + */ + timestamp?: LoggerTimestampOptions | null; + + /** + * The infix to be included between the timestamp and the message. + * @since 1.0.0 + * @default '' + */ + infix?: string; + + /** + * The style options for the message. + * @since 1.0.0 + * @default colorette.clear + */ + message?: LoggerStyleResolvable | null; +} \ No newline at end of file diff --git a/packages/plugin-custom-logger/src/lib/LoggerStyle.ts b/packages/plugin-custom-logger/src/lib/LoggerStyle.ts new file mode 100644 index 0000000..c7699d5 --- /dev/null +++ b/packages/plugin-custom-logger/src/lib/LoggerStyle.ts @@ -0,0 +1,128 @@ +import * as Colorette from 'colorette'; + +/** + * Logger utility that applies a style to a string. + * @since 1.0.0 + */ +export class LoggerStyle { + public readonly style: Colorette.Color; + + public constructor(resolvable: LoggerStyleResolvable = {}) { + if (typeof resolvable === 'function') { + this.style = resolvable; + } else { + const styles: Colorette.Color[] = []; + if (resolvable.effects) styles.push(...resolvable.effects.map((text) => Colorette[text])); + if (resolvable.text) styles.push(Colorette[resolvable.text]); + if (resolvable.background) styles.push(Colorette[resolvable.background]); + + this.style = styles.length + ? styles.length === 1 + ? styles[0] + : (string) => styles.reduce((out, style) => style(out), string) as string + : Colorette.reset; + } + } + + /** + * Applies the style to a string. + * @since 1.0.0 + * @param string The value to apply the style to. + */ + public run(string: string | number) { + return this.style(string); + } +} + +/** + * The options for {@link LoggerStyle}. + * @since 1.0.0 + */ +export interface LoggerStyleOptions { + /** + * The text effects, e.g. `italic`, `strikethrough`, etc. + * @since 1.0.0 + */ + effects?: LoggerStyleEffect[]; + + /** + * The text color, e.g. `red` or `yellow`. + * @since 1.0.0 + */ + text?: LoggerStyleText; + + /** + * The background color, e.g. `magenta` or `red`. + * @since 1.0.0 + */ + background?: LoggerStyleBackground; +} + +/** + * The value accepted by {@link LoggerStyle}'s constructor. Read `colorette`'s documentation for more information. + * @since 1.0.0 + * @seealso https://www.npmjs.com/package/colorette + */ +export type LoggerStyleResolvable = Colorette.Color | LoggerStyleOptions; + +/** + * The text styles. + * @since 1.0.0 + */ +export enum LoggerStyleEffect { + Reset = 'reset', + Bold = 'bold', + Dim = 'dim', + Italic = 'italic', + Underline = 'underline', + Inverse = 'inverse', + Hidden = 'hidden', + Strikethrough = 'strikethrough' +} + +/** + * The text colors. + * @since 1.0.0 + */ +export enum LoggerStyleText { + Black = 'black', + Red = 'red', + Green = 'green', + Yellow = 'yellow', + Blue = 'blue', + Magenta = 'magenta', + Cyan = 'cyan', + White = 'white', + Gray = 'gray', + BlackBright = 'blackBright', + RedBright = 'redBright', + GreenBright = 'greenBright', + YellowBright = 'yellowBright', + BlueBright = 'blueBright', + MagentaBright = 'magentaBright', + CyanBright = 'cyanBright', + WhiteBright = 'whiteBright' +} + +/** + * The background colors. + * @since 1.0.0 + */ +export enum LoggerStyleBackground { + Black = 'bgBlack', + Red = 'bgRed', + Green = 'bgGreen', + Yellow = 'bgYellow', + Blue = 'bgBlue', + Magenta = 'bgMagenta', + Cyan = 'bgCyan', + White = 'bgWhite', + BlackBright = 'bgBlackBright', + RedBright = 'bgRedBright', + GreenBright = 'bgGreenBright', + YellowBright = 'bgYellowBright', + BlueBright = 'bgBlueBright', + MagentaBright = 'bgMagentaBright', + CyanBright = 'bgCyanBright', + WhiteBright = 'bgWhiteBright' +} \ No newline at end of file diff --git a/packages/plugin-custom-logger/src/lib/LoggerTimestamp.ts b/packages/plugin-custom-logger/src/lib/LoggerTimestamp.ts new file mode 100644 index 0000000..8e4ec5c --- /dev/null +++ b/packages/plugin-custom-logger/src/lib/LoggerTimestamp.ts @@ -0,0 +1,100 @@ +import { Timestamp } from '@sapphire/timestamp'; +import { LoggerStyle, type LoggerStyleResolvable } from './LoggerStyle.js'; + +/** + * Logger utility that formats a timestamp. + * @since 1.0.0 + */ +export class LoggerTimestamp { + /** + * The timestamp used to format the current date. + * @since 1.0.0 + */ + public timestamp: Timestamp; + + /** + * Whether or not the logger will show a timestamp in UTC. + * @since 1.0.0 + */ + public utc: boolean; + + /** + * The logger style to apply the color to the timestamp. + * @since 1.0.0 + */ + public color: LoggerStyle | null; + + /** + * The final formatter. + * @since 1.0.0 + */ + public formatter: LoggerTimestampFormatter; + + public constructor(options: LoggerTimestampOptions = {}) { + this.timestamp = new Timestamp(options.pattern ?? 'YYYY-MM-DD HH:mm:ss'); + this.utc = options.utc ?? false; + this.color = options.color === null ? null : new LoggerStyle(options.color); + this.formatter = options.formatter ?? ((timestamp) => `${timestamp} - `); + } + + /** + * Formats the current time. + * @since 1.0.0 + */ + public run() { + const date = new Date(); + const result = this.utc ? this.timestamp.displayUTC(date) : this.timestamp.display(date); + return this.formatter(this.color ? this.color.run(result) : result); + } +} + +/** + * The options for {@link LoggerTimestamp}. + * @since 1.0.0 + */ +export interface LoggerTimestampOptions { + /** + * The {@link Timestamp} pattern. + * @since 1.0.0 + * @default 'YYYY-MM-DD HH:mm:ss' + * @example + * ```typescript + * 'YYYY-MM-DD HH:mm:ss' + * // 2020-12-23 22:01:10 + * ``` + */ + pattern?: string; + + /** + * Whether or not the date should be UTC. + * @since 1.0.0 + * @default false + */ + utc?: boolean; + + /** + * The color to use. + * @since 1.0.0 + * @default colorette.reset + */ + color?: LoggerStyleResolvable | null; + + /** + * The formatter. See {@link LoggerTimestampFormatter} for more information. + * @since 1.0.0 + * @default (value) => `${value} - ` + */ + formatter?: LoggerTimestampFormatter; +} + +/** + * The formatter used for {@link LoggerTimestampOptions}. This will be run **after** applying the color to the formatter. + * @since 1.0.0 + */ +export interface LoggerTimestampFormatter { + /** + * @param timestamp The output of {@link LoggerStyle.run} on {@link Timestamp.display}/{@link Timestamp.displayUTC}. + * @since 1.0.0 + */ + (timestamp: string): string; +} \ No newline at end of file diff --git a/packages/plugin-custom-logger/src/register.ts b/packages/plugin-custom-logger/src/register.ts new file mode 100644 index 0000000..6c9687c --- /dev/null +++ b/packages/plugin-custom-logger/src/register.ts @@ -0,0 +1,13 @@ +import './index.js' +import {Plugin, preGenericsInitialization, SapphireClient} from '@sapphire/framework' +import {ClientOptions} from 'discord.js' +import {Logger} from './index.js' + +export class CustomLoggerPlugin extends Plugin { + public static [preGenericsInitialization](this: SapphireClient, options: ClientOptions): void { + options.logger ??= {} + options.logger.instance = new Logger(options.logger) + } +} + +SapphireClient.plugins.registerPreGenericsInitializationHook(CustomLoggerPlugin[preGenericsInitialization], 'CustomLogger-PreGenericsInitialization') \ No newline at end of file diff --git a/packages/plugin-custom-logger/tsconfig.json b/packages/plugin-custom-logger/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/plugin-custom-logger/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/plugin-custom-logger/tsconfig.tsbuildinfo b/packages/plugin-custom-logger/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1ed360d --- /dev/null +++ b/packages/plugin-custom-logger/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/foo.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36bcced44876ff177efb79cc8662aafc1ae351077eee9e034fd7b036e9d33ab5","signature":"3dee7bbd2b685bdcb66cfc9b45605d6689ea42852231fa79cac9a40643c0fa22","impliedFormat":99},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ca6d304b929748ea15c33f28c1f159df18a94470b424ab78c52d68d40a41e1e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"4d7da7075068195f8f127f41c61e304cdca5aafb1be2d0f4fb67c6b4c3e98d50","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4bdde4e601e9554a844e1e0d0ccfa05e183ef9d82ab3ac25f17c1709033d360","impliedFormat":1},{"version":"ad23fd126ff06e72728dd7bfc84326a8ca8cec2b9d2dac0193d42a777df0e7d8","impliedFormat":1},{"version":"9dd9f50652a176469e85fb65aa081d2e7eb807e2c476f378233de4f1f6604962","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"7edec695cdb707c7146ac34c44ca364469c7ea504344b3206c686e79f61b61a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a20f1e119615bf7632729fd89b6c0b5ffdc2df3b512d6304146294528e3ebe19","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"08353b04a3501d84fc8d7b49de99f6c1cc26026e6d9d697a18315f3bfe92ed03","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"efeedd8bbc5c0d53e760d8b120a010470722982e6ae14de8d1bcff66ebc2ae71","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"9091e564b81e7b4c382a33c62de704a699e10508190547d4f7c1c3e039d2db2b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","impliedFormat":1}],"root":[72],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"importHelpers":false,"module":100,"newLine":1,"noEmitHelpers":false,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":false,"rootDir":"./src","sourceMap":true,"strict":true,"target":7,"useDefineForClassFields":true},"fileIdsList":[[81,123],[81,120,123],[81,122,123],[81,123,128,157],[81,123,124,129,135,136,143,154,165],[81,123,124,125,135,143],[76,77,78,81,123],[81,123,126,166],[81,123,127,128,136,144],[81,123,128,154,162],[81,123,129,131,135,143],[81,122,123,130],[81,123,131,132],[81,123,135],[81,123,133,135],[81,122,123,135],[81,123,135,136,137,154,165],[81,123,135,136,137,150,154,157],[81,118,123,170],[81,123,131,135,138,143,154,165],[81,123,135,136,138,139,143,154,162,165],[81,123,138,140,154,162,165],[81,123,135,141],[81,123,142,165,170],[81,123,131,135,143,154],[81,123,144],[81,123,145],[81,122,123,146],[81,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,148],[81,123,149],[81,123,135,150,151],[81,123,150,152,166,168],[81,123,135,154,155,156,157],[81,123,154,156],[81,123,154,155],[81,123,157],[81,123,158],[81,120,123,154],[81,123,135,160,161],[81,123,160,161],[81,123,128,143,154,162],[81,123,163],[123],[79,80,81,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,143,164],[81,123,138,149,165],[81,123,128,166],[81,123,154,167],[81,123,142,168],[81,123,169],[81,123,128,135,137,146,154,165,168,170],[81,123,154,171],[81,123,174,213],[81,123,174,198,213],[81,123,213],[81,123,174],[81,123,174,199,213],[81,123,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212],[81,123,199,213],[81,123,135,138,140,154,162,165,171,172],[81,90,94,123,165],[81,90,123,154,165],[81,85,123],[81,87,90,123,162,165],[81,123,143,162],[81,123,172],[81,85,123,172],[81,87,90,123,143,165],[81,82,83,86,89,123,135,154,165],[81,90,97,123],[81,82,88,123],[81,90,111,112,123],[81,86,90,123,157,165,172],[81,111,123,172],[81,84,85,123,172],[81,90,123],[81,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,123],[81,90,105,123],[81,90,97,98,123],[81,88,90,98,99,123],[81,89,123],[81,82,85,90,123],[81,90,94,98,99,123],[81,94,123],[81,88,90,93,123,165],[81,82,87,90,97,123],[81,123,154],[81,85,90,111,123,170,172]],"referencedMap":[[73,1],[74,1],[75,1],[120,2],[121,2],[122,3],[123,4],[124,5],[125,6],[76,1],[79,7],[77,1],[78,1],[126,8],[127,9],[128,10],[129,11],[130,12],[131,13],[132,13],[134,14],[133,15],[135,16],[136,17],[137,18],[119,19],[138,20],[139,21],[140,22],[141,23],[142,24],[143,25],[144,26],[145,27],[146,28],[147,29],[148,30],[149,31],[150,32],[151,32],[152,33],[153,1],[154,34],[156,35],[155,36],[157,37],[158,38],[159,39],[160,40],[161,41],[162,42],[163,43],[81,44],[80,1],[172,45],[164,46],[165,47],[166,48],[167,49],[168,50],[169,51],[170,52],[171,53],[173,1],[198,54],[199,55],[174,56],[177,56],[196,54],[197,54],[187,54],[186,57],[184,54],[179,54],[192,54],[190,54],[194,54],[178,54],[191,54],[195,54],[180,54],[181,54],[193,54],[175,54],[182,54],[183,54],[185,54],[189,54],[200,58],[188,54],[176,54],[213,59],[212,1],[207,58],[209,60],[208,58],[201,58],[202,58],[204,58],[206,58],[210,60],[211,60],[203,60],[205,60],[214,61],[70,1],[71,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[59,1],[10,1],[60,1],[1,1],[61,1],[62,1],[11,1],[67,1],[64,1],[63,1],[68,1],[66,1],[69,1],[65,1],[97,62],[107,63],[96,62],[117,64],[88,65],[87,66],[116,67],[110,68],[115,69],[90,70],[104,71],[89,72],[113,73],[85,74],[84,67],[114,75],[86,76],[91,77],[92,1],[95,77],[82,1],[118,78],[108,79],[99,80],[100,81],[102,82],[98,83],[101,84],[111,67],[93,85],[94,86],[103,87],[83,88],[106,79],[105,77],[109,1],[112,89],[72,1]]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json new file mode 100644 index 0000000..a91ae54 --- /dev/null +++ b/packages/typescript-config/base.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "@sapphire/ts-config", + "@sapphire/ts-config/extra-strict", + "@sapphire/ts-config/decorators" + ] +} \ No newline at end of file diff --git a/packages/typescript-config/nextjs.json b/packages/typescript-config/nextjs.json new file mode 100644 index 0000000..e6defa4 --- /dev/null +++ b/packages/typescript-config/nextjs.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "plugins": [{ "name": "next" }], + "module": "ESNext", + "moduleResolution": "Bundler", + "allowJs": true, + "jsx": "preserve", + "noEmit": true + } +} diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json new file mode 100644 index 0000000..a944c77 --- /dev/null +++ b/packages/typescript-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@wyvern/typescript-config", + "version": "0.0.0", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/typescript-config/react-library.json b/packages/typescript-config/react-library.json new file mode 100644 index 0000000..c3a1b26 --- /dev/null +++ b/packages/typescript-config/react-library.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "jsx": "react-jsx" + } +} diff --git a/packages/urban-dictionary/package.json b/packages/urban-dictionary/package.json new file mode 100644 index 0000000..fc199a4 --- /dev/null +++ b/packages/urban-dictionary/package.json @@ -0,0 +1,21 @@ +{ + "name": "@wyvern/urban-dictionary", + "version": "0.0.0", + "type": "module", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsc --watch", + "build": "tsc", + "typecheck": "tsc --noEmit --skipLibCheck" + }, + "exports": { + ".": { + "default": "./dist/src/index.js", + "types": "./src/index.ts" + } + } +} diff --git a/packages/urban-dictionary/src/UrbanDictionary.ts b/packages/urban-dictionary/src/UrbanDictionary.ts new file mode 100644 index 0000000..6483ae2 --- /dev/null +++ b/packages/urban-dictionary/src/UrbanDictionary.ts @@ -0,0 +1,42 @@ +export class UrbanDictionary { + private readonly BASE_URL: string; + + constructor() { + this.BASE_URL = "http://api.urbandictionary.com/v0"; + } + + public removeBrackets(str: string): string { + return str.replaceAll(/[\[\]]/gmi, '') + } + + public async defineWord(word: string): Promise { + const res = await fetch(`${this.BASE_URL}/define?term=${word}`); + const json = await res.json(); + + return json as UrbanDefinition; + } + + public async randomDefinition() { + const res = await fetch(`${this.BASE_URL}/random`); + const json = await res.json(); + + return json as UrbanDefinition; + } +} + +interface UrbanDefinition { + list: List[]; +} + +interface List { + definition: string; + permalink: string; + thumbs_up: number; + author: string; + word: string; + defid: number; + current_vote: string; + written_on: Date; + example: string; + thumbs_down: number; +} diff --git a/packages/urban-dictionary/src/index.ts b/packages/urban-dictionary/src/index.ts new file mode 100644 index 0000000..8562e73 --- /dev/null +++ b/packages/urban-dictionary/src/index.ts @@ -0,0 +1 @@ +export * from "./UrbanDictionary.js"; diff --git a/packages/urban-dictionary/tsconfig.json b/packages/urban-dictionary/tsconfig.json new file mode 100644 index 0000000..52cc5a0 --- /dev/null +++ b/packages/urban-dictionary/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@wyvern/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/urban-dictionary/tsconfig.tsbuildinfo b/packages/urban-dictionary/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1ed360d --- /dev/null +++ b/packages/urban-dictionary/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/foo.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36bcced44876ff177efb79cc8662aafc1ae351077eee9e034fd7b036e9d33ab5","signature":"3dee7bbd2b685bdcb66cfc9b45605d6689ea42852231fa79cac9a40643c0fa22","impliedFormat":99},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ca6d304b929748ea15c33f28c1f159df18a94470b424ab78c52d68d40a41e1e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"4d7da7075068195f8f127f41c61e304cdca5aafb1be2d0f4fb67c6b4c3e98d50","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4bdde4e601e9554a844e1e0d0ccfa05e183ef9d82ab3ac25f17c1709033d360","impliedFormat":1},{"version":"ad23fd126ff06e72728dd7bfc84326a8ca8cec2b9d2dac0193d42a777df0e7d8","impliedFormat":1},{"version":"9dd9f50652a176469e85fb65aa081d2e7eb807e2c476f378233de4f1f6604962","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"7edec695cdb707c7146ac34c44ca364469c7ea504344b3206c686e79f61b61a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a20f1e119615bf7632729fd89b6c0b5ffdc2df3b512d6304146294528e3ebe19","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"08353b04a3501d84fc8d7b49de99f6c1cc26026e6d9d697a18315f3bfe92ed03","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"efeedd8bbc5c0d53e760d8b120a010470722982e6ae14de8d1bcff66ebc2ae71","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"9091e564b81e7b4c382a33c62de704a699e10508190547d4f7c1c3e039d2db2b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","impliedFormat":1}],"root":[72],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"importHelpers":false,"module":100,"newLine":1,"noEmitHelpers":false,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":false,"rootDir":"./src","sourceMap":true,"strict":true,"target":7,"useDefineForClassFields":true},"fileIdsList":[[81,123],[81,120,123],[81,122,123],[81,123,128,157],[81,123,124,129,135,136,143,154,165],[81,123,124,125,135,143],[76,77,78,81,123],[81,123,126,166],[81,123,127,128,136,144],[81,123,128,154,162],[81,123,129,131,135,143],[81,122,123,130],[81,123,131,132],[81,123,135],[81,123,133,135],[81,122,123,135],[81,123,135,136,137,154,165],[81,123,135,136,137,150,154,157],[81,118,123,170],[81,123,131,135,138,143,154,165],[81,123,135,136,138,139,143,154,162,165],[81,123,138,140,154,162,165],[81,123,135,141],[81,123,142,165,170],[81,123,131,135,143,154],[81,123,144],[81,123,145],[81,122,123,146],[81,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,148],[81,123,149],[81,123,135,150,151],[81,123,150,152,166,168],[81,123,135,154,155,156,157],[81,123,154,156],[81,123,154,155],[81,123,157],[81,123,158],[81,120,123,154],[81,123,135,160,161],[81,123,160,161],[81,123,128,143,154,162],[81,123,163],[123],[79,80,81,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[81,123,143,164],[81,123,138,149,165],[81,123,128,166],[81,123,154,167],[81,123,142,168],[81,123,169],[81,123,128,135,137,146,154,165,168,170],[81,123,154,171],[81,123,174,213],[81,123,174,198,213],[81,123,213],[81,123,174],[81,123,174,199,213],[81,123,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212],[81,123,199,213],[81,123,135,138,140,154,162,165,171,172],[81,90,94,123,165],[81,90,123,154,165],[81,85,123],[81,87,90,123,162,165],[81,123,143,162],[81,123,172],[81,85,123,172],[81,87,90,123,143,165],[81,82,83,86,89,123,135,154,165],[81,90,97,123],[81,82,88,123],[81,90,111,112,123],[81,86,90,123,157,165,172],[81,111,123,172],[81,84,85,123,172],[81,90,123],[81,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,123],[81,90,105,123],[81,90,97,98,123],[81,88,90,98,99,123],[81,89,123],[81,82,85,90,123],[81,90,94,98,99,123],[81,94,123],[81,88,90,93,123,165],[81,82,87,90,97,123],[81,123,154],[81,85,90,111,123,170,172]],"referencedMap":[[73,1],[74,1],[75,1],[120,2],[121,2],[122,3],[123,4],[124,5],[125,6],[76,1],[79,7],[77,1],[78,1],[126,8],[127,9],[128,10],[129,11],[130,12],[131,13],[132,13],[134,14],[133,15],[135,16],[136,17],[137,18],[119,19],[138,20],[139,21],[140,22],[141,23],[142,24],[143,25],[144,26],[145,27],[146,28],[147,29],[148,30],[149,31],[150,32],[151,32],[152,33],[153,1],[154,34],[156,35],[155,36],[157,37],[158,38],[159,39],[160,40],[161,41],[162,42],[163,43],[81,44],[80,1],[172,45],[164,46],[165,47],[166,48],[167,49],[168,50],[169,51],[170,52],[171,53],[173,1],[198,54],[199,55],[174,56],[177,56],[196,54],[197,54],[187,54],[186,57],[184,54],[179,54],[192,54],[190,54],[194,54],[178,54],[191,54],[195,54],[180,54],[181,54],[193,54],[175,54],[182,54],[183,54],[185,54],[189,54],[200,58],[188,54],[176,54],[213,59],[212,1],[207,58],[209,60],[208,58],[201,58],[202,58],[204,58],[206,58],[210,60],[211,60],[203,60],[205,60],[214,61],[70,1],[71,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[59,1],[10,1],[60,1],[1,1],[61,1],[62,1],[11,1],[67,1],[64,1],[63,1],[68,1],[66,1],[69,1],[65,1],[97,62],[107,63],[96,62],[117,64],[88,65],[87,66],[116,67],[110,68],[115,69],[90,70],[104,71],[89,72],[113,73],[85,74],[84,67],[114,75],[86,76],[91,77],[92,1],[95,77],[82,1],[118,78],[108,79],[99,80],[100,81],[102,82],[98,83],[101,84],[111,67],[93,85],[94,86],[103,87],[83,88],[106,79],[105,77],[109,1],[112,89],[72,1]]},"version":"5.5.4"} \ No newline at end of file diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..70e73ce --- /dev/null +++ b/turbo.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://turbo.build/schema.json", + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": [".next/**", "!.next/cache/**", "dist/**"] + }, + "lint": { + "dependsOn": ["^typecheck"] + }, + + "dev": { + "cache": false, + "persistent": true, + "interruptible": true, + "dependsOn": ["prisma:generate", "^typecheck"] + }, + + "prisma:generate": { + "cache": false, + "outputs": ["prisma/schema.prisma"], + "env": ["DATABASE_URL", "DATABASE_URL_UNPOOLED"] + }, + + "prisma:generateSql": { + "cache": false, + "outputs": ["prisma/schema.prisma"], + "env": ["DATABASE_URL", "DATABASE_URL_UNPOOLED"] + }, + + "prisma:push": { + "cache": false, + "dependsOn": ["prisma:generate"], + "env": ["DATABASE_URL", "DATABASE_URL_UNPOOLED"] + }, + + "prisma:migrate": { + "cache": false, + "persistent": true, + "interactive": true, + "dependsOn": ["prisma:generate"], + "env": ["DATABASE_URL", "DATABASE_URL_UNPOOLED"] + }, + + "typecheck": { + "cache": false + } + } +}