diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index d53917a..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: bug -assignees: ahmadk953, RoseFix7 - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 8f83f59..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[Feature Request]" -labels: dependencies, documentation, enhancement -assignees: ahmadk953, RoseFix7 - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml new file mode 100644 index 0000000..60dcf23 --- /dev/null +++ b/.github/workflows/eslint.yml @@ -0,0 +1,40 @@ +name: ESLint + +on: + push: + branches: ['main'] + pull_request: + branches: ['main'] + schedule: + - cron: '25 21 * * 1' + +jobs: + eslint: + name: Run eslint scanning + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + actions: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Configure Corepack + run: corepack enable + + - name: Install Dependencies + run: yarn install + + - name: Run ESLint + run: npx eslint ./src + --config eslint.config.mjs + --format @microsoft/eslint-formatter-sarif + --output-file eslint-results.sarif + continue-on-error: true + + - name: Upload analysis results to GitHub + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: eslint-results.sarif + wait-for-processing: true diff --git a/.gitignore b/.gitignore index acb27c6..fa61b2c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ target/ node_modules/ drizzle/ +.vscode/ config.json -.vscode .yarn \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c34419c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +target/ +node_modules/ +drizzle/ +.vscode/ +.github/ +.yarn/ +config.json +config.example.json +package.json +yarn.lock +README.md \ No newline at end of file diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..2106bdc --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,11 @@ +{ + 'printWidth': 80, + 'tabWidth': 2, + 'useTabs': false, + 'semi': true, + 'singleQuote': true, + 'trailingComma': 'all', + 'bracketSpacing': true, + 'arrowParens': 'always', + 'endOfLine': 'lf', +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 50bb375..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,131 +0,0 @@ -# Contributor Covenant Code of Conduct - -> [!WARNING] -> Please check the Code of Conduct often for updates - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -ahmad.khan60@outlook.com. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 4a9c7fc..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,8 +0,0 @@ -# Contributing Guidelines - -> [!NOTE] -> Expect this to change - -## How to Contribute - -If you would like to contribute to this repository, please either [make a fork](https://github.com/ahmadk953/poixpixel-discord-bot/fork) or, clone this repo locally using git. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 58051b9..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,8 +0,0 @@ -# Security Policy - -> [!NOTE] -> Expect this policy to change in the future. - -## Reporting a Vulnerability - -If you notice a vulnerability in the project, please immediately report it to [me](mailto:ahmad.khan60@outlook.com) diff --git a/drizzle.config.ts b/drizzle.config.ts index 5e57ef0..324e350 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,7 +1,7 @@ -import fs from "node:fs"; +import fs from 'node:fs'; import { defineConfig } from 'drizzle-kit'; -const config = JSON.parse(fs.readFileSync("./config.json", "utf8")); +const config = JSON.parse(fs.readFileSync('./config.json', 'utf8')); const { dbConnectionString } = config; export default defineConfig({ diff --git a/eslint.config.mjs b/eslint.config.mjs index bd929be..b727ff6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,10 +1,10 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import globals from "globals"; -import { FlatCompat } from "@eslint/eslintrc"; -import tsParser from "@typescript-eslint/parser"; -import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import js from '@eslint/js'; +import globals from 'globals'; +import { FlatCompat } from '@eslint/eslintrc'; +import tsParser from '@typescript-eslint/parser'; +import typescriptEslint from '@typescript-eslint/eslint-plugin'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -15,21 +15,21 @@ const compat = new FlatCompat({ }); export default [ - ...compat.extends("eslint:recommended"), + ...compat.extends('eslint:recommended', 'prettier'), { - files: ["**/*.ts"], + files: ['**/*.ts'], plugins: { - "@typescript-eslint": typescriptEslint, + '@typescript-eslint': typescriptEslint, }, languageOptions: { ecmaVersion: 5, - sourceType: "script", + sourceType: 'script', parser: tsParser, parserOptions: { - project: "./tsconfig.json", + project: './tsconfig.json', }, globals: { ...globals.node, @@ -37,54 +37,54 @@ export default [ }, rules: { - "arrow-spacing": [ - "warn", + 'arrow-spacing': [ + 'warn', { before: true, after: true, }, ], - "brace-style": [ - "error", - "stroustrup", + 'brace-style': [ + 'error', + 'stroustrup', { allowSingleLine: true, }, ], - "comma-dangle": ["error", "always-multiline"], - "comma-spacing": "error", - "comma-style": "error", - curly: ["error", "multi-line", "consistent"], - "dot-location": ["error", "property"], - "handle-callback-err": "off", - indent: ["error", 2], - "keyword-spacing": "error", + 'comma-dangle': ['error', 'always-multiline'], + 'comma-spacing': 'error', + 'comma-style': 'error', + curly: ['error', 'multi-line', 'consistent'], + 'dot-location': ['error', 'property'], + 'handle-callback-err': 'off', + indent: ['error', 2], + 'keyword-spacing': 'error', - "max-nested-callbacks": [ - "error", + 'max-nested-callbacks': [ + 'error', { max: 4, }, ], - "max-statements-per-line": [ - "error", + 'max-statements-per-line': [ + 'error', { max: 2, }, ], - "no-console": "off", - "no-empty-function": "error", - "no-floating-decimal": "error", - "no-inline-comments": "error", - "no-lonely-if": "error", - "no-multi-spaces": "error", + 'no-console': 'off', + 'no-empty-function': 'error', + 'no-floating-decimal': 'error', + 'no-inline-comments': 'error', + 'no-lonely-if': 'error', + 'no-multi-spaces': 'error', - "no-multiple-empty-lines": [ - "error", + 'no-multiple-empty-lines': [ + 'error', { max: 2, maxEOF: 1, @@ -92,38 +92,38 @@ export default [ }, ], - "no-shadow": [ - "error", + 'no-shadow': [ + 'error', { - allow: ["err", "resolve", "reject"], + allow: ['err', 'resolve', 'reject'], }, ], - "no-trailing-spaces": ["error"], - "no-var": "error", - "object-curly-spacing": ["error", "always"], - "prefer-const": "error", - quotes: ["warn", "single"], - semi: ["error", "always"], - "space-before-blocks": "error", + 'no-trailing-spaces': ['error'], + 'no-var': 'error', + 'object-curly-spacing': ['error', 'always'], + 'prefer-const': 'error', + quotes: ['warn', 'single'], + semi: ['error', 'always'], + 'space-before-blocks': 'error', - "space-before-function-paren": [ - "error", + 'space-before-function-paren': [ + 'error', { - anonymous: "never", - named: "never", - asyncArrow: "always", + anonymous: 'never', + named: 'never', + asyncArrow: 'always', }, ], - "space-in-parens": "error", - "space-infix-ops": "error", - "space-unary-ops": "error", - "spaced-comment": "error", - yoda: "error", + 'space-in-parens': 'error', + 'space-infix-ops': 'error', + 'space-unary-ops': 'error', + 'spaced-comment': 'error', + yoda: 'error', - "no-redeclare": "off", - "no-unused-vars": "off", // This is causing issues + 'no-redeclare': 'off', + 'no-unused-vars': 'off', // This is causing issues }, }, ]; diff --git a/package.json b/package.json index 076c9bd..3c7a5b7 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "compile": "npx tsc", "target": "node ./target/discord-bot.js", "start": "yarn run compile && yarn run target", - "lint": "npx eslint ./src" + "lint": "npx eslint ./src && npx tsc --noEmit", + "format": "prettier --check --ignore-path .prettierignore .", + "format:fix": "prettier --write --ignore-path .prettierignore ." }, "dependencies": { "discord.js": "^14.16.3", @@ -20,13 +22,16 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.17.0", + "@microsoft/eslint-formatter-sarif": "^3.1.0", "@types/node": "^22.10.2", "@types/pg": "^8.11.10", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", "drizzle-kit": "^0.30.1", "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", "globals": "^15.14.0", + "prettier": "3.4.2", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.7.2" diff --git a/src/commands/rules.ts b/src/commands/rules.ts index c16aa9e..123d295 100644 --- a/src/commands/rules.ts +++ b/src/commands/rules.ts @@ -18,7 +18,7 @@ const rulesEmbed = new EmbedBuilder() 'https://cdn.discordapp.com/avatars/1052017329376071781/922947c726d7866d313744186c42ef49.webp', }) .setDescription( - 'These are the rules for the server. Please read and follow them carefully.' + 'These are the rules for the server. Please read and follow them carefully.', ) .addFields( { @@ -77,9 +77,9 @@ const rulesEmbed = new EmbedBuilder() 'Post content in the right channels. Off-topic content may be moved or deleted.', }, { - name: '**Rule #12: Follow Discord\'s ToS and Community Guidelines**', + name: '**Rule #12: Follow the Discord Terms of Service and Community Guidelines**', value: - 'All members must adhere to Discord’s Terms of Service and Community Guidelines.', + 'All members must adhere to the Discord Terms of Service and Community Guidelines.', }, { name: '**Rule #13: Moderator Discretion**', @@ -90,7 +90,7 @@ const rulesEmbed = new EmbedBuilder() name: '**Disclaimer:**', value: '**These rules may be updated at any time. It is your responsibility to review them regularly. Moderators and admins have the authority to enforce these rules and take appropriate action.**', - } + }, ) .setTimestamp() .setFooter({ diff --git a/src/commands/util/ping.ts b/src/commands/util/ping.ts index ac0055f..c67554e 100644 --- a/src/commands/util/ping.ts +++ b/src/commands/util/ping.ts @@ -10,7 +10,9 @@ const command: Command = { .setName('ping') .setDescription('Check the latency from you to the bot'), execute: async (interaction) => { - await interaction.reply(`Pong! Latency: ${Date.now() - interaction.createdTimestamp}ms`); + await interaction.reply( + `Pong! Latency: ${Date.now() - interaction.createdTimestamp}ms`, + ); }, }; diff --git a/src/commands/util/server.ts b/src/commands/util/server.ts index 671624d..1ce7cca 100644 --- a/src/commands/util/server.ts +++ b/src/commands/util/server.ts @@ -11,7 +11,7 @@ const command: Command = { .setDescription('Provides information about the server.'), execute: async (interaction) => { await interaction.reply( - `The server ${interaction!.guild!.name} has ${interaction!.guild!.memberCount} members and was created on ${interaction!.guild!.createdAt}. It is ${new Date().getFullYear() - interaction!.guild!.createdAt.getFullYear()!} years old.` + `The server ${interaction!.guild!.name} has ${interaction!.guild!.memberCount} members and was created on ${interaction!.guild!.createdAt}. It is ${new Date().getFullYear() - interaction!.guild!.createdAt.getFullYear()!} years old.`, ); }, }; diff --git a/src/commands/util/user-info.ts b/src/commands/util/user-info.ts index 8bb2f57..9911cb9 100644 --- a/src/commands/util/user-info.ts +++ b/src/commands/util/user-info.ts @@ -19,7 +19,7 @@ const command: Command = { option .setName('user') .setDescription('The user whose information you want to retrieve.') - .setRequired(true) + .setRequired(true), ), execute: async (interaction) => { const userOption = interaction.options.get('user'); @@ -60,7 +60,7 @@ const command: Command = { { name: 'Number of Bans', value: memberData?.numberOfBans.toString() || '0', - } + }, ); await interaction.reply({ embeds: [embed] }); }, diff --git a/src/discord-bot.ts b/src/discord-bot.ts index b34e753..00fc465 100644 --- a/src/discord-bot.ts +++ b/src/discord-bot.ts @@ -1,5 +1,11 @@ import fs from 'node:fs'; -import { Client, Collection, Events, GatewayIntentBits, GuildMember } from 'discord.js'; +import { + Client, + Collection, + Events, + GatewayIntentBits, + GuildMember, +} from 'discord.js'; import { deployCommands } from './util/deployCommand.js'; import { removeMember, setMembers } from './util/db.js'; @@ -82,7 +88,9 @@ client.on(Events.GuildMemberAdd, async (member: GuildMember) => { try { await setMembers(nonBotMembers); // TODO: Move this to config file - await welcomeChannel.send(`Welcome to the server, ${member.user.username}!`); + await welcomeChannel.send( + `Welcome to the server, ${member.user.username}!`, + ); await member.user.send('Welcome to the Poixpixel Discord server!'); } catch (error: any) { diff --git a/src/util/db.ts b/src/util/db.ts index 2a9d3ea..9c23960 100644 --- a/src/util/db.ts +++ b/src/util/db.ts @@ -45,5 +45,8 @@ export async function removeMember(discordId: string) { } export async function getMember(discordId: string) { - return await db.select().from(memberTable).where(eq(memberTable.discordId, discordId)); -} \ No newline at end of file + return await db + .select() + .from(memberTable) + .where(eq(memberTable.discordId, discordId)); +} diff --git a/src/util/deployCommand.ts b/src/util/deployCommand.ts index 5f5506d..cdd27b0 100644 --- a/src/util/deployCommand.ts +++ b/src/util/deployCommand.ts @@ -27,7 +27,7 @@ const commandFiles = getFilesRecursively(commandsPath); export const deployCommands = async () => { try { console.log( - `Started refreshing ${commandFiles.length} application (/) commands.` + `Started refreshing ${commandFiles.length} application (/) commands.`, ); const commands = commandFiles.map(async (file) => { @@ -43,14 +43,14 @@ export const deployCommands = async () => { } else { console.warn( - `[WARNING] The command at ${file} is missing a required "data" or "execute" property.` + `[WARNING] The command at ${file} is missing a required "data" or "execute" property.`, ); return null; } }); const validCommands = await Promise.all( - commands.filter((command) => command !== null) + commands.filter((command) => command !== null), ); return validCommands; diff --git a/tsconfig.json b/tsconfig.json index 373614f..a5e1167 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,8 +11,10 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["ES2022"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": [ + "ES2022" + ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ @@ -25,9 +27,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "esnext", /* Specify what module code is generated. */ - "rootDir": "src", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "module": "esnext" /* Specify what module code is generated. */, + "rootDir": "src" /* Specify the root folder within your source files. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ @@ -39,7 +41,7 @@ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true /* Enable importing .json files. */, // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ @@ -55,7 +57,7 @@ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./target", /* Specify an output folder for all emitted files. */ + "outDir": "./target" /* Specify an output folder for all emitted files. */, // "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ @@ -77,12 +79,12 @@ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ @@ -104,9 +106,7 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file + "include": ["src/**/*"] +} diff --git a/yarn.lock b/yarn.lock index 4e3c941..f8e3864 100644 --- a/yarn.lock +++ b/yarn.lock @@ -625,7 +625,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 @@ -650,6 +650,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^3.2.0": version: 3.2.0 resolution: "@eslint/eslintrc@npm:3.2.0" @@ -667,6 +684,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + "@eslint/js@npm:9.17.0, @eslint/js@npm:^9.17.0": version: 9.17.0 resolution: "@eslint/js@npm:9.17.0" @@ -707,6 +731,17 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -714,6 +749,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + "@humanwhocodes/retry@npm:^0.3.0": version: 0.3.0 resolution: "@humanwhocodes/retry@npm:0.3.0" @@ -766,6 +808,18 @@ __metadata: languageName: node linkType: hard +"@microsoft/eslint-formatter-sarif@npm:^3.1.0": + version: 3.1.0 + resolution: "@microsoft/eslint-formatter-sarif@npm:3.1.0" + dependencies: + eslint: "npm:^8.9.0" + jschardet: "npm:latest" + lodash: "npm:^4.17.14" + utf8: "npm:^3.0.0" + checksum: 10c0/c4052ea4f728fd01932406468fa688582f843059786bfce1ef1d0f6d957f43871a1e888095af6d958b90e4380f179049c77f2058fd5ead3354aa73147e60c5b7 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -783,7 +837,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1038,6 +1092,13 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.1 + resolution: "@ungap/structured-clone@npm:1.2.1" + checksum: 10c0/127afbcc75ff1532f7b1eb85ee992f9faa70e8d5bb2558da05355d423b966fc279d0a485bf19da2883280e7c299ae4170809a72e78eab086da71c6bcdda5d1e2 + languageName: node + linkType: hard + "@vladfrangu/async_event_emitter@npm:^2.2.4, @vladfrangu/async_event_emitter@npm:^2.4.6": version: 2.4.6 resolution: "@vladfrangu/async_event_emitter@npm:2.4.6" @@ -1079,7 +1140,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.0": +"acorn@npm:^8.14.0, acorn@npm:^8.9.0": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -1286,7 +1347,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -1376,6 +1437,15 @@ __metadata: languageName: node linkType: hard +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + "drizzle-kit@npm:^0.30.1": version: 0.30.1 resolution: "drizzle-kit@npm:0.30.1" @@ -1787,6 +1857,27 @@ __metadata: languageName: node linkType: hard +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + "eslint-scope@npm:^8.2.0": version: 8.2.0 resolution: "eslint-scope@npm:8.2.0" @@ -1797,7 +1888,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -1818,6 +1909,54 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^8.9.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + "eslint@npm:^9.17.0": version: 9.17.0 resolution: "eslint@npm:9.17.0" @@ -1889,7 +2028,18 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.5.0": +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -1971,6 +2121,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -1999,6 +2158,17 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + "flat-cache@npm:^4.0.0": version: 4.0.1 resolution: "flat-cache@npm:4.0.1" @@ -2044,6 +2214,13 @@ __metadata: languageName: node linkType: hard +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + "fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -2106,6 +2283,29 @@ __metadata: languageName: node linkType: hard +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -2208,6 +2408,23 @@ __metadata: languageName: node linkType: hard +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -2255,6 +2472,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -2300,6 +2524,13 @@ __metadata: languageName: node linkType: hard +"jschardet@npm:latest": + version: 3.1.4 + resolution: "jschardet@npm:3.1.4" + checksum: 10c0/d72c724ff60bc185d3962617ffda6849c6d632a935820841078c656a5247d73617a5df3b233e1fb1064de8683f7dae1b422b68186d1d6db22117b59edb5433dc + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -2321,7 +2552,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.4": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -2363,7 +2594,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash@npm:^4.17.14, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -2428,7 +2659,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -2605,6 +2836,15 @@ __metadata: languageName: node linkType: hard +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -2669,6 +2909,13 @@ __metadata: languageName: node linkType: hard +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -2802,6 +3049,7 @@ __metadata: dependencies: "@eslint/eslintrc": "npm:^3.2.0" "@eslint/js": "npm:^9.17.0" + "@microsoft/eslint-formatter-sarif": "npm:^3.1.0" "@types/node": "npm:^22.10.2" "@types/pg": "npm:^8.11.10" "@typescript-eslint/eslint-plugin": "npm:^8.18.1" @@ -2810,8 +3058,10 @@ __metadata: drizzle-kit: "npm:^0.30.1" drizzle-orm: "npm:^0.38.2" eslint: "npm:^9.17.0" + eslint-config-prettier: "npm:^9.1.0" globals: "npm:^15.14.0" pg: "npm:^8.13.1" + prettier: "npm:3.4.2" ts-node: "npm:^10.9.2" tsx: "npm:^4.19.2" typescript: "npm:^5.7.2" @@ -2892,6 +3142,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:3.4.2": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 + languageName: node + linkType: hard + "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -2951,6 +3210,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -3137,6 +3407,13 @@ __metadata: languageName: node linkType: hard +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -3232,6 +3509,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + "typescript@npm:^5.7.2": version: 5.7.2 resolution: "typescript@npm:5.7.2" @@ -3300,6 +3584,13 @@ __metadata: languageName: node linkType: hard +"utf8@npm:^3.0.0": + version: 3.0.0 + resolution: "utf8@npm:3.0.0" + checksum: 10c0/675d008bab65fc463ce718d5cae8fd4c063540f269e4f25afebce643098439d53e7164bb1f193e0c3852825c7e3e32fbd8641163d19a618dbb53f1f09acb0d5a + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -3358,6 +3649,13 @@ __metadata: languageName: node linkType: hard +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + "ws@npm:^8.16.0": version: 8.18.0 resolution: "ws@npm:8.18.0"