{"_id":"@kaname-png/revoltx","_rev":"256-6b5abda357bfba499b5edc8d960e96f0","name":"@kaname-png/revoltx","dist-tags":{"next":"2.0.6-next.b6a1c13.0","latest":"2.0.6"},"versions":{"1.1.0-next.5aacc72.0":{"name":"@kaname-png/revoltx","version":"1.1.0-next.5aacc72.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@sapphire"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.2.0","@sapphire/result":"^1.0.0","@sapphire/utilities":"^3.3.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.2.2","@sapphire/prettier-config":"^1.3.0","@sapphire/ts-config":"^3.3.1","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.13.0","@typescript-eslint/parser":"^5.13.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.4","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.6.0","typedoc":"^0.22.12","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://www.sapphirejs.dev","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"5aacc72cb113fcdf742227b35257bbd0ea383b9f","_id":"@kaname-png/revoltx@1.1.0-next.5aacc72.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-A8ZD0zpK8ozF0/ZaYHH2y3XwZ911BaQ5n2g2YL6kExFBSpxK+3CBIAnSvLdhgjQzGVOarFi8gTyuz1V7aVhFNg==","shasum":"1757c880d4f035b48635f96475c861bd77816e5b","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.0-next.5aacc72.0.tgz","fileCount":267,"unpackedSize":233913,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJllhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmreVhAAmjJrf2rwnWqQuNBNWq0DR102FcKme+2hlH6QnwT4i1c+Ih0d\r\nnHyyZr67SBOZWrqLMByMkLKzxGGXdXCtfxVx1A98hlYmfSZsFKf0c0pRs0c5\r\nHiBL4ohpVvnQBBdmBTsyzwmx1TsOhRfYInE+b2vcSVneo/8Z2oIY3roT1RCp\r\n/M9GjgAgynnG7kbVsI5dSWnUYFwv3wW0pXM0dVkiNPQzAHGwHp/MQv0LK+Aq\r\nWqPEbFbCcfjPdK8NR52GYvbwlt70qvp92m3CNsmmxq79YmJMCpqvSC/e3A5E\r\n0t5yzs8/zo/de1fOAkxOEPyUt0T+Rtz6bmO4cuCCnsOZ1gibt43O+F+CbtTf\r\npfiUqSfUG5QuMB5F0onVoTkQTA02jaUp21+LA1aVdY7W4eXlPVVnHU6qpRAS\r\nZPHO9zH8gwseeS177o8ZU1zc0T96f6CJSEkgZzKl64tqvIWPpqV1iGGjwddw\r\n5+vm1I4xZ1fdZMeGh+2398CBuuFDzhse+OAMANldcTjE2GwMba+ka9cIHgDY\r\n+zc/8Dblq4161hbpj0FpaLcEgtg3QQydLw4qdq+OpUDTAwn1mN2DM/tz3nQE\r\nS+AqCvrwaOiljtPDAiT26H2Frsysd7I+dpuaxHKa1ryQzb/TvitKsOlZhzPm\r\nCOx9Y8KR5RUXlTgmxcAbBLsqvqVMxx9eO/4=\r\n=orvj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA0CEz6CH6NZzBYotGaJ5AppM2Q7ifhk2JRQJ3c7VbO2AiEAiCoYQ4/NWFkwCaomUuLYXpXgJAvuk18W+1ETiRZ6kbc="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.0-next.5aacc72.0_1646680417816_0.34717785769180853"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.1-next.1f77f89.0":{"name":"@kaname-png/revoltx","version":"1.1.1-next.1f77f89.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@sapphire"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.2.0","@sapphire/result":"^1.0.0","@sapphire/utilities":"^3.3.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.2.2","@sapphire/prettier-config":"^1.3.0","@sapphire/ts-config":"^3.3.1","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.13.0","@typescript-eslint/parser":"^5.13.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.4","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.6.0","typedoc":"^0.22.12","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://www.sapphirejs.dev","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1f77f89f18311748ad2fa12e98684fe2d1f1f0e0","_id":"@kaname-png/revoltx@1.1.1-next.1f77f89.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-9jTfzhA++aaObvKTAzvGNUXleDim0WDBRxZniy9SW9DEpVBEjFnpmNuEzJ5vcTzbZJ3fZHkyV7Nu+IIq8qRGZw==","shasum":"1d8938f6abae3e83d2ed7523d99ea3d2fe575efd","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.1-next.1f77f89.0.tgz","fileCount":267,"unpackedSize":233913,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJlslACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqi4g/9Gm0vX4ZtYN7xKg8QAuav6V4MNO+U0s4lGbYAXLs+vKPT+rBP\r\nfM+PHjVXFWOSS6u3r18QAPrprLeFmK0xWkTe9eyczYJyiuqQ2FrsYgPO8vqI\r\nTl/IM37Mm8UhhZC3N8IRiWwXuWc2dF7D8r7agLuZWzAHI2ZvqEq7Xl4gxUtC\r\npcIGsuAMmxUMZiBxqzpnuNFMZiXf0V1Kam58HqZMK24bi0EsyeLc2AzXoToh\r\nTExMv20zsEU9d3KQF9xt5/t7an8eDWt5U/KmoxGJYDxksKB/AJfntdgLN2Pt\r\noDfXUEoiiCoPtwf4tftDnxT2MKzpJkgQnldpx8U3RSSwxtC9Mst2BdBaeZq2\r\nCm3eWRSeZfHpsgpgyWc5x1PhUtShbJBvlH05/kmCyNdVW3WWXopOYYo+6q6K\r\n3MaODJzXa7wlbJt4GJMu7Hr03kL09reRPP2iTlRsAfFNjMThH1g5Dzt7SP85\r\n1mDslzoiFtOg/qv61gE+UGu85de7N3ne0MsfcTPjFvZ3ZSPED2VslF1n+di0\r\nl7ygElcmWd59W50MoXc61aFP0BzhTPi2xdUd06RTLkDrIApDRxF+5I9mm9p9\r\niCcgjQ9uDS2ezPH3crc/9MZ37EkdGSzjQ5pMGgxqr10GmAqRQSwjAaQONnC3\r\nVjyJd1uvFZu9LoAe2PnHDP3PACVE6KxL5R8=\r\n=37QD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGHnRbVBMhLOKg1wdyraQ4THXOh90RpLPyGuJ1nLbGgJAiEAq7U6eay1Hu3jsVTCiZM3bT2jJOvF5SP7KIcaxagqhBE="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.1-next.1f77f89.0_1646680869167_0.346622325491591"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.1":{"name":"@kaname-png/revoltx","version":"1.1.1","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.2.0","@sapphire/result":"^1.0.0","@sapphire/utilities":"^3.3.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.2.2","@sapphire/prettier-config":"^1.3.0","@sapphire/ts-config":"^3.3.1","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.13.0","@typescript-eslint/parser":"^5.13.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.4","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.6.0","typedoc":"^0.22.12","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"0c06e8dbc4ee1419dceb2e919c9c066bd2189b41","_id":"@kaname-png/revoltx@1.1.1","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-exuundHCm2UHJGPLKlSafKTOWWvpB3eNzXQKDVjCqF/BwTg380agHFg68pcYlRvQxpb9YACsyD8YXDANljS6WA==","shasum":"f94a70b064f717a26b268c0a8871a1dfa1868dc1","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.1.tgz","fileCount":275,"unpackedSize":236763,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJlxtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqH3g/+KFN0p+q7ZmvTfrtxuiLTT4oYg9VmBISy38FL6Gnj3Zwua4sW\r\nM5Tv2vjyRnNZgEGuWEXRGvftkq5ML/ou5TfBMNO9UPnp2os+nZXTplvg8MnN\r\nsg6//Xpo/uDZ/M+S8Gch8ISBBHvVXQ81OUDF5hGS6Y/t0BdToDz8W9I8zKnf\r\nGKiddHZ6phkumbnbY8pR+nsr0yZLG0u3jzkzSQ27vp9jti1a+veLeIA/Gfsv\r\nDU72mdEIive4efY9AEJbJaV+EOyLKvGuGX0HV+ZMsgdmbepjsPoJQ4Ge2kxS\r\nY8bEViBffZT5bdQoR8WE12Ur0mEsLJ5HzvWhweHKYFnV7+vvqK0X7/tBJH2c\r\nFezNgsmA5IDtTuhZy/RQKASjpOHFt2uvOESNHC180110bCf/aFpPT9WqUnht\r\nfeDCoygAzsDYHTb4xW/jrtY3LIBOocJuWGdhAe41OISdCfcTOHdlEKzcPGjK\r\nqM2zvt0sGDlJuVm2nj55r2W+etq5O/bIZ4Id/oEqWajQzBf/tA9xlvz8RJxx\r\nvOAQ0e7ijcmRUOATq1FDpyol79v5a8K/zXQDiPDlQehB2c+35I9w63W6luCG\r\nTLmanX5PH8aTb8CLag4YMeqN/tKMbnvLPHAdcUPlFSx3ofbFYCN/Y2JCUlwI\r\nowq/4qV9cep5MG5BRpVEa0osGuZaSsh/yDw=\r\n=0XtO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAvtZkN8WoCp21KDmIzZmBLVVgKWvGO61m4ZON4sYw5UAiAD2eOmtJSXcUXT1S9RCTyj2VtUY6UPZge1I/tlmiNldg=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.1_1646681197725_0.0889939379362581"},"_hasShrinkwrap":false},"1.1.2-next.b57ba48.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.b57ba48.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.2.0","@sapphire/result":"^1.0.0","@sapphire/utilities":"^3.3.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.2.2","@sapphire/prettier-config":"^1.3.0","@sapphire/ts-config":"^3.3.1","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.13.0","@typescript-eslint/parser":"^5.13.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.4","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.6.0","typedoc":"^0.22.12","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"b57ba48d89c1879b4374aa5c57efbf41b6751993","_id":"@kaname-png/revoltx@1.1.2-next.b57ba48.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-j4b0n5F/7nq4Evu52rWg3OuU3z2CfUZ90a0rxANbEPPCREJmO4mRjStcSK5vbc+L7G8jGOA0w6GqvP4fMmZSDQ==","shasum":"97c9950d49982062dfeec419686c77d7d936fcd4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.b57ba48.0.tgz","fileCount":267,"unpackedSize":233926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJlyNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmozYQ//aLVFvUIQ1sFlzHoZ2jPwF6ARprXw+xJmHTPspe/Rv3Zp7mdc\r\nGQvoFuzQymYvx2jK/qgZny/EHwJN4ewPOTaPaSyIsi9ufQkbskDV40WP9SeW\r\ne8xIihYK7UPvE9GQuh5eOR6HvUiwtdWYLN24p6xt78Ufc5D8iRyMdWFbhVwF\r\naAOHSv7dz7z/gXYoTSiwGUn+bv9IB10NO49ThLmreHuHD9+4cDbpAuM0wGjT\r\nxTHmLryLTZ5FuSTFH87yy6znqQ4I8olLDignI9ypnPbB6lO4d7jEXkHBpM6Q\r\nseH+9kHFwnRkkSgvya8YDaWv5cvQNND/CjmBa54AO85UJS3ZVGQ9IrovW8BY\r\nhvkVJczAjjYwZ1zYP677FzasExoY+rEneFMfGrDhW3SgjGeGwAHVYMKM+nfD\r\n21kfuenMk6AWHgdCqSdjxqw2HVFTdoPKwr+RceGG9NHOoLkt89q1GIy7ehw3\r\nu4FelZ8rBVv+OpYbe7nBEYjV4UEDprX3/m461pjRel1n4uXAPIbvTzKsng69\r\n20M5DZYHeWSrWBeq3KxfEb+iWtGws+tta6igCILNl4iuvOMZ8SH+69DKGhEr\r\njN1XDfBoSkgMxfgKxcppY8qjrsXbLe1SlUgwe7ntz09zuQLGCE16BKDhE6XB\r\ndST+dd2gQDzNEDbJy2S28cz0Qz0kz9M5onk=\r\n=sgXp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwE83by1gL7BcLZTZbz6ZVp4K/TBOfG/fxus5W3SbglQIhAKz9Tela6wrN4WMAA6KDYy8bg3CA8MnREY0xdzdMc8rn"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.b57ba48.0_1646681229710_0.18127677660029318"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2-next.7e782f1.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.7e782f1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.13.0","@typescript-eslint/parser":"^5.13.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.4","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.6.0","typedoc":"^0.22.12","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"7e782f1fc946bade1d605cd05f95961dfdecf43e","_id":"@kaname-png/revoltx@1.1.2-next.7e782f1.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-jJSoXD7JJ+xPK9bvzwq62QP3K5dJQq3cjp+NGGXF1GR0HsG1olGQQP3rwjMRJC74dHbzWU9darSMXyNHeuBHOw==","shasum":"ed2ff1d18745d7922ccfc18f5398ecca0c007d14","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.7e782f1.0.tgz","fileCount":267,"unpackedSize":233926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJl9RACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrd2g/8CrNQzXPhbocck4m4uQJuhT1JVzKDAQ5KKRr0Cqu4tp+ZMthw\r\nV3PilnGG/zS17OHpR5sWGbxkAt1oWn2bybG77HGV3LdJMsTuDRW1YuTVQE0U\r\nyooZBNqVMZTgBJXjnW2G0Y8gnRI3sVFNXVPkA5Ni/ySPQLxAc7pw/p2kxGv/\r\nOoz0UlZWjIKuoNg/GcAV2L6PqeUtbf7M45w4k8XKQ+JnnNw9pQUWagT0rqBe\r\ngtm2SqMvrnbFR9nBtWAAbixj4b1HOlRoBLWljKPzjZLG/DTv4Pacls5hXuAB\r\nA/9mSU0BSIM41++ROzwGSN+15UqfKRFhnkJGhr387JZm/ppr1Mb6vmJWxzOl\r\nHQ/EUIArcJzdx9+mTOZXnBXU04eC1hf6lx6SnbqlCTk5LNxtGyOjZe4Vx3AY\r\nlcKU00AF4vLD3ab4PDSV5Y1G0tX6xNsVLIyBqqOlWJPyhxvZppaZaEr6XNVF\r\nzBNlfgW8mDLEZ/a+Bs8WxYyi+EvAJG4BSEY1yZnMp4FJU5Zxz9QHsfGIulC8\r\nca6JOSJFU32Ihw6yQwYZibTAxKv0Sq93i7b+N8zKrp28DwQGkowaWWLOIAJF\r\nhGC9w/FnyC6WCO68YWFgFzGF90s+m6PxgeYoxZaBg/N/qSYBndAYcHDPSWs/\r\nGhgUf86Wiv3y6TQYuZpHgtTyv1kAtqi9wjc=\r\n=UDek\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGqBmIO9DMLwxuMdLJKfZ52AURNQ4iktV+bjnKOea7JzAiEA0oqn7Eab2fSF4aMoprBJyjz2JyrarT+IsqMAZfR/Q28="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.7e782f1.0_1646681936971_0.8598934633053763"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2-next.958fd13.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.958fd13.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"958fd13b9636b43f7f9f4bed17e81e19280e1016","_id":"@kaname-png/revoltx@1.1.2-next.958fd13.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-kOfLKYuVuwaK3ifpfy28th2ebm8SHDyFsmcl8f8Vcz0YrwDELKxTgvqD/l4JX0ofKQAGhfUqdyKFq9JD9KJeZQ==","shasum":"ce84441b8d51a586288de21431b6a17e6639ce83","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.958fd13.0.tgz","fileCount":267,"unpackedSize":233926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmBCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpD1g/8Di8BJJIPR/kX0ts/FkUFgpOU1I7zuKiiT9sbZGBE39IangyS\r\nbqUOGbDiUtN+aXUtdzGsji+fl/7xk2jeG4DZ8lCCc++4Oz5NaZqp6MWrN+e7\r\n2dM7jX4XqsZDoE5Hd9PtbWT4Inz7FOOjuuM9O9w9o+1gAH7Y3aQAtutYqPt+\r\nkwIJvcfF5iTyIpoJ37bS8GrmiL/TXuOSWLCAknPULc3BpJP2q1PtfKbba38f\r\nPfM7dqhb3ShT0DZ20wl9ssA0kCl6yDM/kKGPjPI+XkO3XZcgb1CJg24bPZU9\r\noNy0pm0jzyXvJUiKEaogVjFU92HXO6G1AWuYlfS0LQawsL587mWzcz6FhsiZ\r\nLb3SfuKJ32DdBXwJBwHzKa1oBbqmiRjpVUHBtvPDeePmnuDUYB+QEn+6Kt52\r\nNRRFyNXQnZWnMyH+9LsmFAcPgi4wIZoxLVVJFLHo/qwowzP0pwqKB+uIzUPm\r\nzYpuTxy54vXryh7i9HGQdpgONNo9aOT+BIF+2bLadIPGwBbNz4b+QlDqY/dS\r\nwbporAlfnBPp7GHVcgPHDvy9ghjAntda5gL+SGr6u3nD0rtCsHZnKZAc/iUI\r\nkDcccTCgC71IwpKmUCSUWf4Ex+nn0U0hO07Uy5cgMeaBslVP/zwDfeEB2hs3\r\ndgdgoyL3fzEve0y00BT7q3ERfjaL1GAX0Y0=\r\n=r8zY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDk+BCtk6fwkxaXtHKLMiFm/ag8eCwMNpAiVQTDu4vg9gIhAI2aAygZoDeYa9efy/aJVlh4umtHv0U5zNEvbWrAXjf6"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.958fd13.0_1646682178067_0.5982508990879605"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2-next.f19ec0f.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.f19ec0f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"f19ec0fad7df76aacaa705244b9a22f2fcbf5c53","_id":"@kaname-png/revoltx@1.1.2-next.f19ec0f.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-OvPd6bkt21WXKvZ91o9WgHwQeu8K2XneXRRur9+yRn5+c2XAnQSerKudB7J/OxMQG/JvnTt7/3e/o+kTYhqQjw==","shasum":"bc34c31d7df4bf0b1aeec126bf37cc90a73882b2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.f19ec0f.0.tgz","fileCount":267,"unpackedSize":233926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmKDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgbQ/+LDPgLCHNT1QSzKowt2plDRqMKRA7jWJ9WJDUXf/jWx2/bElZ\r\noLqNMvPPZm6f3OTvykFWRwdDOcnvvBg2aeX6LXqrf1GaKeshg7J03viWYpc4\r\nqrRebpVVYkSpqetxSzlzyC1xHzb02Io6bUkPIzm0t48oVjBjehrK1uKSL3xK\r\nSU1+oW5eMmCWZV6WdQQKVAWuAR7b0yQ3bw3J5LufmobdJwav+Ji70I7Ve2vV\r\ndBHoSX9qrbulO4OwzqIXnjBT7gGsM8r7ir74JTlo5NrlJfDEnOAhKEJHyo/v\r\nfwrS3ZHKKkAaGOmTSzpcDBqrPGrOCRbOfaOfDlYRpMBerWq9M9bi3gCDRE0F\r\n1hlMtnWNXzs0GY8h5UbyDTsHqpCenIq13PpUSjNuRr7U9SU50UcNy1kFhcPe\r\nO65FR+gPJYTBwwKGPacdLrmXH5A3BaXeiPQXX7AxQXjm9WcHo4Fpt4V7dmka\r\naqX9zRcBUG7WAbu/UHjm8xsib47WQ5D6a1cdjDqLNa7tZF3PNW4E7567+vUG\r\n2ARknrFsdl1lYAPBCBdNeJvB68BYcoJyazKPIRLsoff+svIjSxyVsIuD3XPg\r\nQUpWNWlqCwIhHSmSeSeI8ZWfIWVXeTCIhVkDZp+t3CtK3qia63H/M35opSzv\r\nBbMwRgeb9+KTxA83Si9MGhHFWHNTmeAs0nA=\r\n=OUHf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgbA+XkQ0YvQgJmyqhmBcWZRkgwjBJxYHmwQsh9LKqWAIgEFLcynNZvYbvM2XjGeZN9guylBGv5PYDrQJs2WEfK/4="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.f19ec0f.0_1646682754881_0.8120839206550254"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2-next.a13a5c9.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.a13a5c9.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a13a5c95349edd067275d01123604932fb5c5de0","_id":"@kaname-png/revoltx@1.1.2-next.a13a5c9.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Moe3JT9syWzyxGwSeQUaT93mgojkMfEhVVY3+kgRHSf6wi1i0T/MZUxvUdOwHHVenbIQIYyu+jwKD5tykqlVhA==","shasum":"8d23c67e4e4a593db18636d2fa227b23dc852e25","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.a13a5c9.0.tgz","fileCount":267,"unpackedSize":234806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmLxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqs6g//QTZNA7clBhp3t06C3NQ96opcXRanyBMM4ZlV/b5nWX83PItY\r\n6r1fk0dC5Wd6VDA42m5M6HnwNXyVCqZBjzdQ26MZ8WHK6C5UE5cWD827UY4Z\r\nsBKDg/KgcQbWCFoTEdphjDw9bBAJBtzeRto/jc0CUJMverPMcuVLx22lE88f\r\nTETFTGO4DasSVJqfflZ7kYNkN8/8sm7ETbxGmiiFylbHgEu8WucruBwiyhG+\r\nbY6X/obX89NnbqLwDsBIKsNY3HBlbROsbO7AKZ1I+NNspUdXgl5vD6wHfl7L\r\nlJyK2ODYfu7/f5W6mzFgBMmja1nIjgb16MhsoSLJPxhuuP2UuS7NcCzF8bg+\r\nk4BMZj3vGN1mPXzOoffKtBYCJNsE2zHsXVd7C4pdSgH8wNracW5P0F67qnhO\r\nt1xFHVbGcdlBiBjBiYBxMwG5UO64748OgAOklTI6JOD/jX2DCzzlcqsirO/n\r\nbDWDoeRzvAd7zIO/qCX3jMAMRPZvBEqIePdgMj4HI//F4PsI0Cw25/6vOEb2\r\nrt8F6Bkhv2A5lm5XhG9SJdxXUUf/J2wv+1HBzadmm+bcJtaKnorv2yobnVgQ\r\nmP8CG5gGX3PCiA1OqKodjW6Z6D3oNOrjAb+TJp7IfbPOvg/TxBN6MzMeeyuI\r\nRJi86CjEVgWzTO9KqlZeNvi7brTY0KGAQqs=\r\n=ANDs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBD25j6axY/7ko9pNK+oz3PtU3Vnkyk8RpXWLu2ii1n5AiEA1AjNN/yVz4WZSQFCtSwyGGv1QqE3t1E/SDfqnTcW3Jc="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.a13a5c9.0_1646682865598_0.2667101588338465"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2-next.91ae121.0":{"name":"@kaname-png/revoltx","version":"1.1.2-next.91ae121.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"91ae1215fad0c372624495c4bb7592201b406af3","_id":"@kaname-png/revoltx@1.1.2-next.91ae121.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-C6g4WcvJyWmBoxIYKsivl8CvR/Yji5xUrXfJQJW7vQo0cPZjKTUYtray+MrdzOa4VbKhIGDU959x5O4ipWXgXg==","shasum":"1d69b0b9bfb3fa0a3275d03795c1653529c8dfd3","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2-next.91ae121.0.tgz","fileCount":267,"unpackedSize":234806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmRQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3Qw//bmamdJgULjrXYDWCOUC586DgvsSGnZY1poG4n7woR86JHZir\r\nafjPM9fnUVLuvnoI6X7Cqlzi1buGcDXzj8sRHSmi00IsZeTMTtqwoJRQhJH7\r\ng1HWI3fsZdiDpT7Ll/K45xpLsIwWltpCX5OEt4cIYmP8s1ZDY9R7cdh2TC4A\r\nzZYtegOqyJ9TS5fOTmvFdPbjLRpNTPAiqugjNZI7FyUGrJ/gh+4+eo+L+47l\r\nkUwp1hDvuFsTlu2PqESAB93E8VGibvmTxE7SXHmHK3ePbYIQR3nfllUKdcHZ\r\nQNbD2coyD9qFCZ8YC2KkyMiED2pePpQhNWZ2k412A7oKrLg/QiYHrr1ugL/N\r\nYXXLfu8NKa4JM4nuRZ87Uvxy3ohd+3wl6SCgBpAt1wEZDJ/mRgh9Zzjgj1ii\r\n+MPVNbl//l/i3fS5OQMZOh4KyOvDOZLgyjSHWJAdsZlST1tn+pWz7dNqDQa3\r\nwpaDaesBB4ttgD7JG/24MUVwVILZW6hG/yYq1+KjcASf+m/c/qxe0SKaWH1a\r\nJkT4Q8cztGrQ1Junjzs/pqxQt/Zr+aJOq+acSQ27gZ/rUam2dF7qk/urz+Ao\r\n+0bTCD3K2lRuvkHL9luhVfj2ZkYOWjnIlO86WbUJb9K0qqsuiyV90NRNSf+U\r\nm4aE4S6LSFtdcj6n93LGu/dgZFK5X8ua0As=\r\n=eWKG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIANOZ2wqeUbdBMVEccvj/KnTWbjguYbzl0LfXKsqPRPLAiEAuTvYxrk2JtsGXQfWlhD1jaSLJvTkGJaKNi/8DfpYycs="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2-next.91ae121.0_1646683216070_0.9377038952554297"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.2":{"name":"@kaname-png/revoltx","version":"1.1.2","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"70bab7b9c13d2bfdd359bc92bc8ad2a210aab54e","_id":"@kaname-png/revoltx@1.1.2","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-qiFIbK+DoWR2PIJ6eEnwjcgGJKp+zAKBGl6ifjwGTl1hqnccYZXzQi9GtPDXWtQ/Qj0Nt4mBkV3MMfTwPixlYg==","shasum":"225a7a68566a47e8f2829a369c5cd021b440ef83","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.2.tgz","fileCount":275,"unpackedSize":237757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmTSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoSxA//U4OvhSJ0HLA4zafrBhBu4GZsAL6pUtP/Z4qWM7pgGtIoeyVJ\r\nqO40JYt1gavgk8HX4v1pfaGSDrVw3lxx/8SYzpAPh4jWENlcw6qVeEB3cPoo\r\nExTuejSCiUTkuQ5giKj9SJmETzO4ZePUkxoHAgUiqeFau7efmhnsh85ROFnC\r\nPnylIYifRfF/Yrv4nPrj9tSNLRDSUFOvI7viwnmY44Vw5MLVdEdWjNxfYcF5\r\nfe/w9pq7IBPi5ItaNoGCbCn1XB4UZs9rbC8Y9ma6rim5dlmqXdAvWZddeQY4\r\nbZzaSC+TzqcA0AQD8/98Jf17AMK82dRr34JKp1xD6KUDYnyBrlTIscCXDPGk\r\neSD8U4tbkT5f36H8IWLo+j+PxDmY+MqghRp+YuTmbvlPp60qGKz90h7q3YWF\r\nX24hAG18trMSWemQBmx/D3R6fzlD95c7M1RSTqvC+jzolUQ5oBIQXrFvdxCs\r\nGHP7d+603rGsbTbGykts7cYu98kA+L1E3cpLf1POX8R1zQTKChLySLKdpN1s\r\nUxxI8KCUSwTbVhkCmUoVvlmIpCerXOErjh88YkPwk97uGxAtUsPNk1IwrpZh\r\nX+SMKQT0+Ugs3fZ7rGqDLVfmptI/eGThFhCNR1m4wqalE9zajfH/G7+UmwFr\r\nt47wVMwJ641bf41R4Wwxf/K40DzfgNFvznU=\r\n=PHh3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE7wdmOvrn1ZuswkZtpVQ/7KiQhPTjDoAAJVCukyGyA3AiEAwm60Pbl1P1AdkgpQZre1LHJjeBvpIlobA1bE2S78J3E="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.2_1646683346152_0.21901030366810859"},"_hasShrinkwrap":false},"1.1.3-next.70bab7b.0":{"name":"@kaname-png/revoltx","version":"1.1.3-next.70bab7b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"70bab7b9c13d2bfdd359bc92bc8ad2a210aab54e","_id":"@kaname-png/revoltx@1.1.3-next.70bab7b.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-xzhmTkiI+BgRiCyWnLR9nxmmf+RmafGexpE8Tz9wvXixseHlOhKiJKlKvGGrj2C/9BX3eyRyl89VOsSR2p10dA==","shasum":"2fcc492532c7b94bc4190989014825f3c6d45d7f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.3-next.70bab7b.0.tgz","fileCount":267,"unpackedSize":234806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmTrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrr5A//ZYlkYYiLhnWqO2zS9Tlrtw2LjbeOM4HeAzq6dZp8N+XJcz0u\r\n2adhnGMuyjtAjmraDNuAcwk/aTzJpSABYmqJijOysPh0R2hqbmzp3XploYMP\r\nT60v5NFkLAujcbfaSEWYUtfuRYGqnsaph9x15OZt+z2MN87lKwkPtDiQP4dE\r\nyi32A0XOsdmyCDnV+jtvNTQrjb0T9cmcjzoLarc+ohXfQ3ocl9w2mCJ0b3UX\r\nemX3faIpTpJzn09gJsl1cGy4shA175sABrPlJmFdSgCk/jYYKeiweVAqb4ZE\r\nFR5ALJ5EBfF3HiJJrugc7HCyEdjZZpsR4ks8LP83VsJPiFS10XPglLgOp+Wo\r\nHH3h4gTlULS5o1IIMeQuPgs4sYV1i6B79u2OZYwc8s+Rpqxbkm1WvxVVHNpm\r\npWnXKGF980ct+ElUA3sVLMn82w8cbOjoZc4GDVK7JoSx8Fvt/THUvpRPkxIN\r\nN3MGzFlaP9x4E0UXE7Igbtm7gkkPdpYeWE5VIIG4ic3Gql8VlRTP6L3+xEPH\r\nU5Gs5NDSv6wBx6hYfsxNjRCsRAVZ7bAanm/aKed45ZFDUZ9IH+873qE3F2a6\r\nSPPSpcjZjG1TTvV7sld6WFHeI+KY+a57VIUFnahQt+PTekdFnnLorRL9Eg8D\r\nOI8oxIYy8esfqnkq3zuhnvvJzjXHcBH3leA=\r\n=WXbK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVzX/bSbJk4sQyMmf081ygIZHKXivE8WPlK92Ea8f2+AiEAhGixRUK6FVQf/m4GCCW70YyM86AZEUwrrPmm2sf9/BA="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.3-next.70bab7b.0_1646683371557_0.7302517381019673"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.3":{"name":"@kaname-png/revoltx","version":"1.1.3","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"d7677596a6ef710c9e316af51a333f5c13b18a2d","_id":"@kaname-png/revoltx@1.1.3","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-+CWVfgIMC5fXagkw/RFbPYchNYtRc+0FLGS9xLDhIzUhegD2gad6nesb95ha7PVpB8aYo8FrnCR7A67cSdlJLA==","shasum":"e1abe91e2b4a1b1f6029bce11dbe16ab9bbce355","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.3.tgz","fileCount":275,"unpackedSize":237616,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmfwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmon8Q//RgaWKQLwr8U0oNIcMLt1/tLtwf21dl38/e8hd1wmzkd+Byc3\r\nsCaGa5ZpPMSD4uDIa6T6Fo2XsJyg4xN1pH2Cjw7CLXlsAagcTEX/Dw/VKUZQ\r\nTGtszOB95LxC0GTcWL8AW3QP3a6sv3hYyXJHfv5QSIfopDBHQFkpNKg+UC6k\r\n8HYPALJbsW5N7NpbBZ/muc/DoWzr+GX2YWKgzsoqLY2dR/UKiYgGRaD8iT7J\r\nmnrptwpBXGbIEW8g5ab/J0Ewqi4Q8VLDQE5c1b4zhs6hCW4JCYc8it7zCOIv\r\nk7ZoUYCBeDyYNyqbWNNqYqn0ZneeX+of3zwaB1u77hY1RKaYREeq0DpgFLcx\r\nglmhXzkw44IpdiwiKwBOBFMpYoUUpmzMGJzndYLSLXDQ/i93QKD99yGS7No4\r\neE+pNjkKatbuGdEIeqH9qcowGp1Spv8Kl2aJtyMfE9oYAfgM/x3vP6hsBAf2\r\na5J2p1szvJSCu+9std+jZKorupewtC5K+Y78m9Q68jQBNo916r77ReRKrMqW\r\n7dk5LGdNKkl0yVJL94moD497QLDJmE3lGyTqhmnILiNm6D4uPBr45RkXOHil\r\nbk0UHLnbYGugyI9gMUrioF7K2/nrrF6BRYsoHqsWoUNUvzp6XdKYbjaGzR1l\r\nLSLmztXTyg4QJhSmm2btCC8ix1PsYHXHOrM=\r\n=n4Pp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCzViry5JW52WdHJXvXFhNmYERd/0S+A5O7pn2yH2MuAgIhAONnPPtEFkeXlM7+Vi38W9LOAd7TwjgjhUXFHrCZq4hr"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.3_1646684144644_0.8783566983074507"},"_hasShrinkwrap":false},"1.1.4-next.d767759.0":{"name":"@kaname-png/revoltx","version":"1.1.4-next.d767759.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d7677596a6ef710c9e316af51a333f5c13b18a2d","_id":"@kaname-png/revoltx@1.1.4-next.d767759.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-1B32FOzUMXeJCGnoxeTkLd9S+mKW4p9h+oZGo3unYRC0Xy3V+2Xx2gD/6lrCaMYyGWQNsLztWo/nbr/g4B7Heg==","shasum":"d2ba87914fae201639b9636b19526d712989d0b6","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.4-next.d767759.0.tgz","fileCount":267,"unpackedSize":234925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmgRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsPBAAhkL2qFfNFycIL69IO6iiarxMhRFcbp3FvNc+w72Hac+oaXZM\r\nEQN6Gghemk3rhnxma00m9di3I+kK0tsPMhSw3FprCGrPlLPbZWmqbUpNtYSS\r\nyhILPPl7r3j2kqFAGDnr+3BMlTfK9cpdR4IDBrdQCd2nrRqUUKaMqdVuUwDX\r\nYzst9H7wRMG7tGKkjfMCbhiXi0dr/ntbg2yca6OyNOvVE9mW86AR6U1qyBN7\r\nvnn2wIUC1F1DBbYxDqde7BS5HqEuJW543cRPgGEBpChlCd/S2l560WeHIbs2\r\nOzwI4FTMDK1pp/bxXTf/aKV9nObM2yDEyGJJnzULrrT7cVKLla0+WTMHbbHZ\r\njig2k8WkmG4dECW6BXaMz6fAcw77HDQ8Q6qEpEsvlsx8N7u56pJPczeOS8ob\r\neALba/XYZslokm3QbkbHCjjV/VPoQF1p7L25blNH6hLAfWb1Jwi5VXxFq+7V\r\nzjKpuWhW464h1JzIDEd6jq8/Cf8SKC0HH+ooZWdrF+EuPITdqpCRSu1qojp+\r\nTiWxUZq4NzMUDdS74D8QltCpWXm0bP9X4FYGAUMvX2xrbTBLm62mVwEN6q1r\r\nr1GHiu/YZ9WYxDDeOjlqV4hxUSfBhScLv2Ax42OfGCSVNbt3zC9uzbNuBXV2\r\nPXJnybiqGnhwDDOUXUcM7BqXPqp1WPSAhqg=\r\n=IPoE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcvwOPiRaGbHBz6BXFVhBJw6LRl6NXrdmqBLqwR56cswIgau70WcN6+Y0LwW2o63Q8ytRDIzLJDEr/uKon6zlV460="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.4-next.d767759.0_1646684176902_0.6848450264434032"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.1.4-next.fc7ca8e.0":{"name":"@kaname-png/revoltx","version":"1.1.4-next.fc7ca8e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"fc7ca8ebeb72ede56fd7ae02da90d17d9a0c9aa5","_id":"@kaname-png/revoltx@1.1.4-next.fc7ca8e.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-BvEQOpq+KMiYAyDKxB6Z/ZoXigqd9EhfhpmkEOW6ZgSNdthwIbYXhUSquXty98WaPfyd+uSAsgJd+E7oNoMUBg==","shasum":"bbc72559a115cb3b20b52fa96f25332b67038230","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.1.4-next.fc7ca8e.0.tgz","fileCount":267,"unpackedSize":234963,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJqP3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqIZQ/+M1Of7uOthvt+dOJw5TI+4Rw5DT182w8bNNYOAMdimLk5aJG9\r\nqvDVjweNmkdZLmZS7b55thLqP0Im5nrYh5qTDW+1FUigqJ/DfyuGHDqf6cCZ\r\n0e7mywnwizulZKDrB0V9PWXefdjPnrde8qDXWeRdv9zfTz55R+cbTRRAHczV\r\nCmz3hqCn75ywoS5tFeSqzyEZ6PBgF6ao9JhY9Kqy7ZUt+1CQNaHbsntVx95i\r\neLkVr6daoCrMBwHhkDkIu8PORnc+E3p6RmzPK1g/VGWRVJaPD4NjXKTebbeF\r\nd8rEy/FDgrYe1zqidrPgYkwDEM34ejy/vNGsiZ9qhZbU8/1mMFKu3nuX0k2v\r\nRMy+8aexujWdoqH6nr8PklMwEKjNcCNyXmIrCv0R+q1HX5dp1h71NQtRDzI/\r\nRKZCqKMM0jOPwFfyu5QvTZ3OAQMicwws4egcZH7CObaARw3db52vF1QHyL+e\r\n24TB1s05H/jy+JzkZemOVoSpIzBmjIwuU0AMExRHqaihAfEVx2J7zN2d/p8A\r\neuigG6SBcuMnnzm5pHomc7DAFEDhE6cIGv8TD67yjLStgoRpjMUQIHX4DqKh\r\n8GPLvCRAhnmXZLSVhQAM238Wv4ULO5Aa7wCUp6dBHLpMczjn6mMPDqgt2ML+\r\npbQbL7WzlBdU+zzB1noKpkvpzaa6vrY0nuU=\r\n=8qMw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH0yXnW3mYou4PxV8EDe3ZqFJjMe0m3Q1zx5Og5S6z7DAiEAtZKZYMCQ5z4VhoYiRBnfh75SoGfaTJgMzFqnKmEYKSU="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.1.4-next.fc7ca8e.0_1646699510960_0.5539470661616226"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.2.0-next.1fc4d37.0":{"name":"@kaname-png/revoltx","version":"1.2.0-next.1fc4d37.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner !== parameter;\n\t\tif (resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1fc4d370d6c8024449228033133ab73feb1ded7c","_id":"@kaname-png/revoltx@1.2.0-next.1fc4d37.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-CmrVCY/KE3fArL6WWNKLgOV45LL8S6SVQKBzG/yboKxY72WabdLZNJrDRjeh+F7cDBVuQDUkeXtrViVAAHZW/g==","shasum":"836177082da4b9a11fe11f7e1ffcf4efe169de1d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.0-next.1fc4d37.0.tgz","fileCount":311,"unpackedSize":292240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJrNgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqB9A/9HpfA2VVoZ+8TfZe+xpwYWmuHDZ/n6sxPaKPPrrFoY9JJSKHQ\r\n8YiUf/GPY5EGrsckUgkTc0YWgGGSNuTB7i8OV83I4/gpxtFsveedZq3zG+t8\r\nnpqCIiALFShrUI+JMH1704GnwSSeoz0UZdrywah0remVX04LKufhIrl7suou\r\nxZzwxOhpAt9iAEYg/Hu/JFl+6l35pC3btNUHKk37h5IN4cO3UaFe04r9IeaB\r\nGrH7Fw5JpT10RBXpurUvTmhszjeGDo043LY6vvgPQE1lAoQzrIQ5FF986oIQ\r\nbenxYfpzBRWoGUaFDU4NGe8UaV0AW5sCl9gBz1JZqgnNPD0li9OV3y5H9Upn\r\ntonZdKluvyo+io64iAEHjaZof8hyuLwX/eSxKDFF61e5GVRyrwa6+I+8t/T6\r\nEvSyB5u424DwJn6qCVe3ebduvTGr9XfUm7M3b11CkNab0uv6juKsTZpfLqYn\r\nSNpSm2sMluZw0m4p0YfO7pBh4gCGjVyXHdt8FXdnsar/aSa7zrmPbntqWlBF\r\nfd2FQt2/8BDM/Eilvja0i8fRjXpfdY0IxPNbk8MpDVyq9H87cw9V9yBJonKO\r\noz8twlRPUnYkQp+WEAAzDcNPVb14Z7YXEQJjbeWNh/wEXNs2VsDXwkOcirAm\r\nA60ZFEwL/mEHx5MqPChea+gEzTfiAvngMEM=\r\n=NZsI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG7HQt9NVq8QqUdrab8wMShzN896mxDAvSouSUmf+MDCAiAuovup/9JEqSXdjHobQt3lNK+MEMzkFbQIjILqqlQGjQ=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.0-next.1fc4d37.0_1646703456480_0.4278213258705468"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.2.0-next.aed15d7.0":{"name":"@kaname-png/revoltx","version":"1.2.0-next.aed15d7.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions (soon) and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"aed15d769ed75193162953d111c3c40f5142a117","_id":"@kaname-png/revoltx@1.2.0-next.aed15d7.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-/QOqOlw8dhLzH2SRGekhxdJDiDBSbRUwHVcktzmbfgBPcggD7uaeShaKgg37lzb/vm5r3J4ygV6sD51Hdq/cKQ==","shasum":"4aa33ac6e258d15eb7403d742ba5d37201548be9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.0-next.aed15d7.0.tgz","fileCount":343,"unpackedSize":346190,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ6CRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmptmw//cvvkOl4FIuOMyE4BiQ0Q2xiU8KsY9pn8ZW2oqCmXXra/r8xf\r\nMSwt+gYyVpBkrmOonup5Eswq+BbRWgAqsdm0cjXqkOqQbmWFHlmdEbSyQgO9\r\n1XZQB22DRttTEpClhgih5rBA3lZEn/RAQbpHNXYiRJCuiRqaxdq1i/O2Wx/p\r\nZO4BS5ZLG/cAXRcf2EnBikE37N+bfpz+wGofxxgJOyCEotFFlWo9P93JCKMQ\r\ntEl7oJmK075w0/qMcj8P41jw5cfgHz/do9bv3HUvkY1ewu4qC+iAxOXQyQQD\r\nK+/kqJjiZ2NrN6pmBJGsDGe6JoZONM8GZFr1b31m9bUDgQYGm0zG2C8dNEkN\r\nV9w3A1TceveqYirG0qfSAMI49IYull+VrYk4iQFDkAMUaPi3WPFyReD3W0KX\r\n32pmT8SA79d8TjzhNI6qbBLYEVzpdDmotbpVhq5b/mYmETElYgcYvbY10QYe\r\nNqo1PkYFW7dKoWjdfFp/xid7Dv2GsqfrD28OpzsItWPdd+6VW3s859+2LNQE\r\n19vwr1nex5zxD2vk5gh3ec0T6K4V4LINyPEoqjpZjMW22vErv2P3+5JOriM3\r\nUtGT+zFgJXvzuW4NW5f1rQnn8yM6VzSVQTGnHs+unMq0MzJsRKHl4dm0bT9h\r\ndmnP5l3tnCh29B2edA0yFF/1G9NGgj3rtqw=\r\n=RID2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQxTpYpnSphvrTnCKFgjUSLTyTfSomsdC/bjdZI8vodgIgMbgzKmdmxg9zXwaoZou4LRr7MFCtQCM1iEyqxzVhpFM="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.0-next.aed15d7.0_1646764176763_0.5945069578123992"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.2.0-next.8be4a08.0":{"name":"@kaname-png/revoltx","version":"1.2.0-next.8be4a08.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8be4a0803ab37ebfccbf9367cd734f325a2a2af2","_id":"@kaname-png/revoltx@1.2.0-next.8be4a08.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-UQyL9axm1NOw3yXiAI50HxbDv86KwkOsEWdF9SP0/zjY6M7jBV4ZwMZag8z37Z2qSRU6bGV5XpDxvqwmHkF5YQ==","shasum":"b0de6ab66a88c0d9ac331a61fc118d1d7959d1ce","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.0-next.8be4a08.0.tgz","fileCount":343,"unpackedSize":346183,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ6C8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooSw//SRA8bvIN3Sjdu+p/wVViuqXOchrPX9OrTRwvTpE2mfybyAWF\r\nEbbCCZ+UdEL/0Wu20Le8GQUIBylU43ZAQMy+La1dc0pWGdwYlqNJUZZqM4N9\r\nNCHXh5BkHbn1mpsxifkJNraCzu1zuZIM+rhwNLIxRmWVqMA8NXDtyk4mSLVv\r\nU0XkFgm1eH76dCduBoEQsSvvosZCq6Ci24BAHrxCfcEfq0qN8BDB8WvWktuJ\r\nq6nnmsG3TNrESdcLXuQT7NKNsvr2yeqnKtGE7e1gYLcIIS9LQqaMNV2Zap0T\r\n0YnB6LOxu+Z3iD85M3q80eOJS3F6RhpMpEIqe5x2I1etynoXaF4oAH5KkvMO\r\nNH672cmrTlFymaVTyB4WqVhx2yEC5F1LYIp+QMn/aYqsZJ4Losz0ClqNNCRN\r\npuwas9qOukBPXQLsIUjOvaoJwWvM41K1IDAq3Bx2oEHhsMujT6Jqt3+jnB3M\r\nY9t69oI22NSVUXO1UffZjokQ7sehXzEgeWIn2kDI3Cx2rYrpL5O6tAri3m5z\r\nKmChOkGksWwRbQFNaXcYEH892v3s619Svt+JxCRLjobEaPQqKgGi9drg9FRQ\r\n0qvUSUb+VT9+ogcSB0N1uHZ9vv0qxyPMWtAORWmDbW941A6k/E8DnwKhURVP\r\nO0LpAmisbAwIWirBIkBkCx4c1+l/bg8CaOw=\r\n=bmuj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMsAIsjqpK8DA+SygrLMDtGBfg2WBF1/7XIa7ev5f+0AIhAJ290piNulYF5c/zyOv+eVm1PZ65lSx+hBF8agaJeFLm"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.0-next.8be4a08.0_1646764220765_0.14579474474868115"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.2.0":{"name":"@kaname-png/revoltx","version":"1.2.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"88f5532a02ffee7c2bfd0d3f82e5da24153b07c8","_id":"@kaname-png/revoltx@1.2.0","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-fRcWl+g/teqBO544l/VeePgSqdOFe8GApSblgPvpsbU/otZtOHMZi9OXKjVPvEGU2hD9dqkaPUAr0nH3/iMenw==","shasum":"a2e9aa28c8f9032c25a0b08c6f427719623a4cfc","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.0.tgz","fileCount":355,"unpackedSize":359584,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ6DiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmryrw//bybUfpDMo8Z0b3iikeF/XHdDrkji8+OerMhlciDzZWeYGuRY\r\napaYviGmKfLdRqQQe9ZrGsegITRN3vmdBCErh1c8fYXFd2DSV4SQxGLfm6ae\r\nyKIcMMPSIDz0AwPUK1Bi9jk40bAdLdJEZM0eaBvdb8Y8/Vi1P1EDJ8rAcXdN\r\n4LDysgo1Ts4Mry6bHIu7pvKpBImRWtEG9Hgg32nCfxIqsutP3dJJEJxlhBm0\r\n1TphdOGWf+36Xa56DVlejqn02wxrOhBqCfPEf3DN+JTdjIWOE5oPKASOKnXa\r\nBkjyVVRbepSmqO/L88ndgnYjJJoOhuftHWtgSSlm6TElfgoVKu+rJQkhLm3k\r\nmXArZYU/qkP+1gzcew8H19fZskF+tOQD9XhABrFa01ihxdAyo/7vzWD7rlug\r\nE5FkrNsNSYCbsWhh6QbarLp/xni72FSKFNKB/Ct9itdUUhvP08A0uinJNdZ8\r\n9UpqZ18rA3mU7flYEIhDoMFXOOgHFYMTeIbKg5e8zGELE5i+qf0zj1Pjcmnj\r\naWXe6KWKJBUrkBtoxHklq/OOkiUGQgrmoxOoqUG0RepN7WtlWKjKYfiwmhvg\r\ndgww3cLK5+Y7FZsGTYlnnae7y9K/a9PO20YDzkhNzUbtBTZ3mIdtZtaaCXlE\r\n+KbwolrFCzlbaAO6hCB90W9SFiaGGL9zV+4=\r\n=WCJL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHXo0TdnPLIjlWRwf6mV1qtW2+dJu3hmYkqbO91G7ed0AiBMcZIhyhCyVaA953bfMERdh2TIb9HRKuvcqe5NZ48JOQ=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.0_1646764258359_0.893920771220261"},"_hasShrinkwrap":false},"1.2.1-next.88f5532.0":{"name":"@kaname-png/revoltx","version":"1.2.1-next.88f5532.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"88f5532a02ffee7c2bfd0d3f82e5da24153b07c8","_id":"@kaname-png/revoltx@1.2.1-next.88f5532.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Ja+Cph2HYreSRh2yCmLiRqYnvYHMxaA/pp78pqvv/sGv/3pnkeDvqr/2kSmScSN41HA72Ax85f+GCv+IxfCQwQ==","shasum":"68cf88c4d490f8b83a382a2a13bbb07f8bb01dc9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.1-next.88f5532.0.tgz","fileCount":343,"unpackedSize":346183,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ6ECACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmquKA//ckWn0/o+ZUtWMc7/FEoBG8jLnJoh2DdE4+Nc7YgPvJq1DVaX\r\n/ASqiVidcBXnKSy0XF5y3KR14DfYuyPTcFmQ6pdkC8MwC5NRkGxzdRLblCn4\r\nzuHtsXkmGa6B9EfEZTRlWdORB+slIMrROiODoZ5Sa8pyB3aFfTYh/1rGQK47\r\nGhG6j8g+FMUFkSpAP7HKcKJ0LHArqv4Rjj8dWsEjqBZqGwoMj7AsmnhoPWZ4\r\n5wqng8kmo787kcfX7l6CWK5JWD3sy6QAP6nwc5rVuNnbE4Ulhi5NmPP3Vi8w\r\ndm6GNmEAzBVbpkzi8aq2ncv0DntxPHdGuNC1BncttfswH9yW/Mw/xoqNO63Y\r\nQ4TleRnusBP6u2Cj6wYLceqCAs4ykDlGfMGLMd1VgLaoxT2AB7s42/Ew2B5t\r\nSZ6motztWYIBA3buCUH0kAmNfgZiehkP0xaR4FgbTPkCoiv0d7LVaXvSmfvk\r\nfxRHkMehi0ouC9FpUa1SG1B6mTA1HTvMR9eU2hyPemM3xN9MmQtWpYWYhlFH\r\nyIi+Hs3lDz6l9NxgnARjlc8tenvNf5ZkelcNGTzcXtK4u9SstF+n5aDSsRVT\r\nlL1l2qLj6qM0jNX9SZQ9iE2rT16JwKe1hLbF0kyR4djn4vONYbMGe+JQa1jU\r\nyI02MW7v0fMdJFy4yPf6OZOFvdj1cALCWWY=\r\n=4gf9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHiB5vSITq+/9gXGRbYp81h+4OhzbYtjMr1BLKhqx4aqAiA6xPmeCCt60AtDeGgCDnqC3SRxJCt+9AfqTo0c0L7Jfw=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.1-next.88f5532.0_1646764290369_0.4543260767825652"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.2.1-next.06963bd.0":{"name":"@kaname-png/revoltx","version":"1.2.1-next.06963bd.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","lexure":"^0.17.0","tslib":"^2.3.1"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"06963bde7791f453880bd7322175bf0b69e4eadf","_id":"@kaname-png/revoltx@1.2.1-next.06963bd.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-GscafkABUCg+9ZsMG34n6YkLHpIy28MK0h2dXmDQUqyHrLXjVm4w3MP4OCGYwxt3kDQOsejC4ERIzd8PjQpIOA==","shasum":"aef862843f1ec85a5e618bfcaddc8d95145f055a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.2.1-next.06963bd.0.tgz","fileCount":343,"unpackedSize":346152,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ9cCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoaRg/+O3hE/hTYEKXoiVEPDy0HmarhA6fqqjgQUL2dYlLceTZ+PIkR\r\nweY42bcdQBWr6v9NV+vDrbYulkt1xGl5koafcQZbnvtGmSVxdoZiD2JdrFSt\r\n0mHHeMJovc4zIMwzp3uhY6D5jWqw0wARdH/VQeRlVXga3XdAJiYIz2DgVLs3\r\nZOIPqU9LoE8da6uoHGAd0nd7wvvZP+DT5XTwlZvL4j3ULpeEuRlFURZza+ir\r\n4R5s6sJuW6FR1HD29zRqCrHRCvgOBlvYHtom9t+lA1MXy3db6cfvBgIJMWax\r\n1vnIsQ1otO9OLM2KoJ3bsP6/xaM8Fso7q4KW826gELNYfYXyxjNX1X8/Ut3y\r\nn6AA3ddx/Z+ADvYt8v87u9LDBOXxNdhtN/jwhLNuKwtXOwickkLO9uq9qyte\r\niVszbEuoNMTwAOqNYSmffKHl+f5vunMSiy7kP7TJ8EhhB/ujQ3bAcIV4UKwq\r\na15obcmmmr9cthMHGY0N0VXz0fJeaBai6pX0+nuDM0LvKVbc8DRQ59ZEeT7T\r\nQV2/d0D80b/6QkosPTzBI1lz+M8mTYsHPLRnRfTARZAXgnP70TAiXhrVhibQ\r\nUtmUX/LRaLY+nEK5rzTzvHB0T19JMC12T/3tDAISWMgsJE1XN/tvDVFY5/97\r\njS2dtqYs+eb2xmBP8f78twRUZrobDB7qJ2Y=\r\n=8LI+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIwDsi8EyjLcbbOWaWpL7bks+saj1YUgGjKpWIy22vfAIhAOxWzTqUADjkqORZfamjuQ7TD4zuSspDZsC0gs53OoSq"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.2.1-next.06963bd.0_1646778114628_0.38066392059139775"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.3.0-next.4df3800.0":{"name":"@kaname-png/revoltx","version":"1.3.0-next.4df3800.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"4df3800b88ee2c7de5802a891452cd12fc6278e4","_id":"@kaname-png/revoltx@1.3.0-next.4df3800.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-LP4ta4/Rklryvo3c4VXSiwTx8p6qngwVH32oQttxgs1lsnJ4PPV9TRv5n582/3Cpe7QRE2FjGagN52eEJF+EjQ==","shasum":"a576b76740b1f259145a7eb36222478da5bdcbbf","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.3.0-next.4df3800.0.tgz","fileCount":343,"unpackedSize":348882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJ+HsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4eQ//Ug23kfSoSgHjy2xTgTbsUZ04h4qDbC4u0EEAyd9d/0E7TsnH\r\nzddDsc35Kj8jhOZrNwKsaZC6ikC9lN6QFSiKl948AEC3BXMFNsv5u9K8kVfe\r\nMh0AQjv9Vx8MKOfjQ21HJo3dQMkdic7rkRvV88LesyO+Kns3jq5/1lh4L8ls\r\nlBOzlQrxeKcXs3Jala8kRltQDHOWWw44kr1uDIop4jPh4ZND8ZqrvIHneiGK\r\nUTyYcFjZ5LGH2CCyaoFChn5FDOUtdJP1o46nitv5FZkNwUErTFqVZ8DosUkh\r\n59Tkqi2jQX3E4SD0nlNTY8Jy36KCZHxOZ+gCNhEr+M6u0M6jHDwmoHYeOShr\r\nLwW6BsvEgAF3/Hm5pnA/wb437t8Cq3IxAFtCdCuEGqk3VoQZ+PNE/lBC8odY\r\nEGw/EIpKaghxMASN0gi2jKFVBkk7TuIGOGtw+wDlzL29Qr3C1NEiBOtgZ3JW\r\nj1U3uXbTExOZJD3wZRN9z/X4qSfxB0Chh8NJHXbBX3OEtB/L3CUN566ZyiCS\r\n9wQw+IPmxR2zUDgnRqdv+OL7ibSGyRspcVaEHoUTbEoff3Tg9hLs6M6n7YGe\r\nTy95rsDkCCLQyojR+OiTF6AOvZFPEDlKfLM1TRUAnqtads7BE9ipcPJKFx/s\r\nNNdZ1vWnQ38cXioY3XiJFThZUhgsep02Xec=\r\n=6guD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDRUW/B7C9TOHBV2MOQi1WzZNhZAwoAZ4rENcedEUogYAiBpX4TaupTjhnIll7042RcahbfAyv7lu5hEcgtbZe5WlQ=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.3.0-next.4df3800.0_1646780907914_0.20944892185123298"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.3.0-next.41d7a80.0":{"name":"@kaname-png/revoltx","version":"1.3.0-next.41d7a80.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"41d7a805dc09ab528adf93741ee8032bf4d2119d","_id":"@kaname-png/revoltx@1.3.0-next.41d7a80.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-goM2JaZnZJFE2F87zlJ9Lzc8kp6zhm6L+ioyIvopNpjBTg42bslGcus0HvOlXgbItx0uvxcM7q9UZ9BV61nImg==","shasum":"97b70dadbf85f73b453d9c53b19341e96e8fb325","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.3.0-next.41d7a80.0.tgz","fileCount":343,"unpackedSize":348882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKMHnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpprA//S9NtDN2XHrURbjsXVd9ngDwpdgt/Kr/VWH1YHtejNAm8oEnJ\r\nXZKbaSrQCzWkZ+Dy5knjztD0uNq2JsFo8PMT34VWHg3pvhXcM5o+Y94LrJae\r\nwItPQiW3VtvKVMfgxq0A0GYwNlZ2ZN4+Dt5B0NVSI+GVF/MJNCrOBEUElI0D\r\n+avGFfa3s9dvklJpp+SWmtrDhnq7Yi1Jws9E2y5NljIxuE3xq0XPoz5N2ZtW\r\nfNMoX+5HBzomIsqSLquQ4ybJZ2KqjQiSPxRts8mO5ne/YyikbiOv56X1E9MS\r\nv+hEpPRygosWYi+UjCT8Jbo6gDu7gNhuncoSSTW3yaCKHHo8CQxvhO+zq0Aq\r\n3JSBlxNaQRImFxAy60OdLN098oHGBVVWjIZGYGj5ZuOQo+kgS/yNDI4aoDQt\r\nmF/b2B22Yn/lgelMIfB2zUrLxR2hN7b1/mG2Tny7vgTZQ1PX+sZdmpJGLo4O\r\ntjXoSW7V96BazhDOfALJzAZgfI+7CEiLPS4j0XF5iv5ESMMtn7NpUSjgX7iG\r\nSuEagETKQw+H5qD+2uGI15W5XuSsT6Ha4jBFTTZSvZdCIK0k48E/+g294uDD\r\nLvFAz/2kKWXGu5coL2ipsUiYbO7rdBJsbxIw9YLZMqU5INdTKzZ2wHOCFigj\r\nldfxzyzEaKHP1uPNAUrWO2jnZWurJ/KwdME=\r\n=wTBg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvyvbNGCHnp7MuF1h7PHYuxbxZO6U/ioBqqpDfDpF16AiEA1tnJoSDDCzxUTyLkn3HG1jydznAKSyoucASOhJzS2M0="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.3.0-next.41d7a80.0_1646838247116_0.5037135603214191"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.3.0":{"name":"@kaname-png/revoltx","version":"1.3.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"d7299b07743f3b8c0a72ca213108108929c1e49e","_id":"@kaname-png/revoltx@1.3.0","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-EysX7Tm4u9YcZMNKs1jUFbv5aSDw9W9aitmLg7KBWquvdHmGJeR10D04U8JVEauVoAyB/b/mIVBGjCHvXaujbg==","shasum":"6770e4a53a22e242ba9b984a8315ad8c17c6a30f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.3.0.tgz","fileCount":363,"unpackedSize":382219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKPCjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmojdg/8DE/BD8ZT5gnO6uL6YX1vsB0skiZnYFWEyi+8oFKgQMivX9ou\r\nKiJWZVI/N3hiLM45L9O1HB2KZYukfgOV+kEjlgtDUgivO6AGz0wa3M9Yyu2r\r\nt3ysdJtwMf+MT9RiH2Tolqt05+DxYccdNOEpbYMaIL4VKTfT39RxEweOfBrJ\r\ndBg1pt4anQbZQx53gkLOLTN72oCWiGnPuQK3JU66IV2TqKPTPbx38mRYTzqK\r\nH54ueT8DcY7iDj/nDKyBSJvjWQfHSjE7lmrb/9CbAru4hFMYZoEXWRMdSr1Y\r\nV88HkDq0rSt/szHHjsZ70F9difvpiU6udLOavdXB5X+n9XRzmWvxpWmdyJMM\r\n4QxSxUHMmLXKgiEubOuUKJ6X/YTqI0XmLUPGGX9RXDhfn8q4D/P1rmKT1UuS\r\ncxKEi+Rard/GpJVFmsYT8tbymNcwJISDrfRhAuTn4qx9EQLgPWiKPkxA+mRm\r\nGzzflVEltly/8qhTeecq7mDiX68RlaG5i9hg8ethTgWEmnx5o1Fzg1kSjQhP\r\nlHZlCqq6C4ToAhX/DgaiBYZkAUF/OuxgPYn1DGjq7t0UjrI8Qn9n4GIPIvMK\r\nhWJn3mbqtSR/VxuPE7pPC2C5MFZZi+oxlPwrJZOKIGj67gVwi/QnzTkWduR8\r\nBI6cNbSBkcGhCD41hJQvCnPvtMJejfn5Oj0=\r\n=Eye8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGOZ7iuwxDU8YtwGOFMVBxTfhLKB3xWjgHlMG1PyAdewIhAPMN3lMiW2kIAofLCzFESCHzpsTnJ+SShyrDwYIHWHe4"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.3.0_1646850211546_0.03734276598761177"},"_hasShrinkwrap":false},"1.3.1-next.d7299b0.0":{"name":"@kaname-png/revoltx","version":"1.3.1-next.d7299b0.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d7299b07743f3b8c0a72ca213108108929c1e49e","_id":"@kaname-png/revoltx@1.3.1-next.d7299b0.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-HF/7lrxUqZ59QFcnkGjUUxThTpDkz0dM/yPyunch1r5t8eY62TbUEIK/IepdKF/rK3gbX/PZKfETsbfEVZMDhg==","shasum":"3794ee34f9af1b5a232895a57359af66249b79b2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.3.1-next.d7299b0.0.tgz","fileCount":343,"unpackedSize":348882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKPDBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqZCQ/+IkYAlGdPeAYeoVwXEXnc/6DF+iADXNt2sKnY/qjs88V+zIXs\r\ntGTcQLAQIvFREivSVzAewwymgopBPdX9qhDJNVcztjNARqI+sG4dK3wBivBL\r\nKl6Qmtts2ITj05o1Z1OK4hoZt2tblsZJiN00iomgF3sfUjWXsMvyhowlUm15\r\nJkqXtgwOQRHeL+l4kXUI5I3IDr9JJexPaAUQAmWxPx3M32jveQUaBePnkdpT\r\nbStwLB6OomrwRv9VcBIgIijWegUL9+rTHdBvaGG85uq8SrGoNzC77TsWOJsk\r\nYbVSxNwK940d/eSWjzoYeDnYqZNAD47elSu998uBGHjCSFvGJoMT65BNs/LX\r\nk1WFssbj7IAlcdZ2MmbHj9KV7n4XUnFlIspt+hJodiJoRFOlIHMIeVG5ZNmg\r\n9Mn0UlDNQJmOT7wRV5VPbHrKEeLz7f9CpEwKXtq3nhfxN0ud0YuK/3FFsaBR\r\nICGBG637ybxVhrf6WFxEOzhjA8OoHf9qgJMcG//0YVYUQbRPEqhARfMtq6hC\r\nqArEIijNcOj5KHLrqtOso/FEs5PNOnegrP8yTAjkaniWDSCsH8F2VQWOdH1q\r\nown8wnKBCCShWFvHCxHO6uXJ2r8tHXoW3vXgtaDYsZqe8BWPiJfeq7HgGMr8\r\nKkLWXpbM7oNKRYcYWCVS27eXVtdrqHDlTiw=\r\n=TYoB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEOFiSzScvQmfbfzXofDbLjfolS6GTi6B8l38WWc4KBMAiA5B6vd/1dk3gUym1GBRibZVwCByluQ3oYaGMGrsXqDVQ=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.3.1-next.d7299b0.0_1646850240759_0.04348500966306723"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.4.0":{"name":"@kaname-png/revoltx","version":"1.4.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"80ad2d2b6b128f625c1876d1de7ee6d4c5372eaa","_id":"@kaname-png/revoltx@1.4.0","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-HXaq/0SMJUqsnpBs6BPNgliP7bCLzo1FXlyACl6965p6aNY5clEwWl4+ukAPctUSPn4p3FSQ/hED+gkgBmb8Wg==","shasum":"ea1c880e677b8e5a1de15ed6230bd21786471514","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.0.tgz","fileCount":367,"unpackedSize":394766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKP1XACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpI9g//VQOcQhQs02l0oacOgK+fvKMAWpQeMZQIyZz90kZ2007nt8nD\r\nc1vA8fPOMLsnUpxVxLQkKpj8L7oYIgpZl06HjWFamTo6jSK94Z9Pi0XUDQhI\r\nCAOgZati0508BIZTVNE796HctQmG6uDq2TjktHwSv0DuOGVCmSWBDS3f6VWy\r\nY9GFH7G9r7TGNk3E13ykXKHSW6SgO1klP/xGAaXWpyVP1P575cLozPcACjYq\r\nXaGamraMvQicneKZu8zLqeOqyZRujFOcJO+Rc7V18kHxwGngUxRts4OCMQaf\r\n3xjK8OCYHcXSasvvmt9Wap/1n/mO3zm4Q5zHy+OkgljS+EDQH3JCIulleMRH\r\nQKxMVhVqjcPAY4F4ZsBi9JCOf42UzZTlM1yJrrsek2wGV/J+gxm7pUKB3vFF\r\nGGWJ7fRb6hY7ASeyJdci9YjG/ijXFnVI4tEV29U3uYHIg44ggToK6cOXT5wK\r\nJNL+rpzvX9cGqU9TUII1QPE+aWAjWLEahOmgy6YsRUl7vNh7SborAetVjirU\r\nhNm8cPKvC1SJQsTCnOi5sflBfJrNOOxY0el6BW1UsTubzqKhW61HKuvqtOyT\r\njfIFwQPJ/UxeXcMfq0R40fRXDcTtqM9kEWAStcMWsF87xNCryc9zXW+e35Ot\r\nvyuK0XcJkANrWAP2F5KLYqbMat4JE5bNjMk=\r\n=es8a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEqC7ks4NEBGiUxb6j0kfRAHfXltFgwrvvWMAEHlzb0zAiBhLdeHyR/185Wm7jcivdswUvQD4JdDjJNBtXGyg77hxA=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.0_1646853463449_0.9861519468346263"},"_hasShrinkwrap":false},"1.4.1":{"name":"@kaname-png/revoltx","version":"1.4.1","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"992303231eea459a88bed1a5e65d8bfb15f607c7","_id":"@kaname-png/revoltx@1.4.1","_nodeVersion":"17.5.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-cGCDJfiB/eHY0F0K/bpJZuIsSq0GnF1XDhru2mi6pcaMk0CXGQIXBLh5zQVqZDiJlzMVdVDUYGnWtBEYRL3Jpg==","shasum":"6ac5a811ae45b930db90241c1effa0eaffb0dce4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.1.tgz","fileCount":367,"unpackedSize":394790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKP4CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6rw//R3grllrZ2TMv0Uw9NDkQm86T0Hl75wkOyW43dA645P4hjddk\r\nPFpwour6qycLMtUGXL2B9mPPeCy1pHeJLSjky3XMkEyb4WNKo/tUU8Z+SN9t\r\nI7gjmeWC+m4+oZapZI8jfS5kQqpc/fE3S48A/cvtrO/95tMve6Twqpm08Gyo\r\nvjN2e57q/9Y0JgjlEuA7eFwF32zhsDJqSrsTC9/7ztk/4GbuFWiM/inYb7ur\r\nxFd+1NPYwLBraL8t111hkSwx2UiP2kMlEjARDcXFDMKYgjdkgtZ4qwKrDBc4\r\nYaNmvUyT+jtUhlW3xTJ+4nYdBzrr8KxQhRzfa75QT2gUq/RzutFdR8JbOXyx\r\nIvoqLkcmYdvpEdSBTYIvGK3eyRDzNr33yA6zqIBTp4c/tyBKOiihX6CXg8wb\r\nhHHM6uAMUQgeVAP3nXv7dPvyjsBeyVHei3UL84EvqlluTomMp2w+P6077Znv\r\nbMuJfegqaEQzQ9ezi6yOz+c+Bjxw+kofn8NCydwC/+bGOhkWo6pjiHUsWD2u\r\n7XPMFxlkwf5uA5fz514A0x36JCG9awSdk/1jOlD7fvRg8fNs3tEhtv0tl6QJ\r\neAVUQKCol4DHhhOyKIi92//BRwwOcjCuSSbvg+7krxz2d5ZXfwSLQWaeHFgw\r\nlUyTd3l7tviI/tOZDCMOmorV1On4rCFw7Sc=\r\n=ncHG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICt+whWH4qoNgsHR/8abGPOXXj5S6WErCsQdp0gD09guAiEA2nmnHlsK2xuzxxoFxWBz7jLTIm8wHFEDllnNHsMvry4="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.1_1646853633871_0.2372462752456821"},"_hasShrinkwrap":false},"1.4.2-next.9923032.0":{"name":"@kaname-png/revoltx","version":"1.4.2-next.9923032.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.0","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.4.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"992303231eea459a88bed1a5e65d8bfb15f607c7","_id":"@kaname-png/revoltx@1.4.2-next.9923032.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-dIR9Ycf1LNqCi8vFuy4duwNTlvh/Nl0b/0iSODj88mpvFHSflz67Fs54hZZPwjhTDLBAWFsKGINjLir26p0PZw==","shasum":"835a4bddec0bddea755b839da629e470da223a83","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.2-next.9923032.0.tgz","fileCount":347,"unpackedSize":361566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKP5cACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrTwRAAmHqv8R4O7Kmbp8TUPJzkDSqtrfT31amI2rfqOADXzngoEz3w\r\n6jpfujNf0UHwCcc7gFnaakujDkPLxzNPnYGlLr0w8yZC/7G7rYraM568nI0Y\r\nyJmGXuT4Ps9KRQPVVhemPNsvFHWvm/V257D0r2MSvawxqKCimfplq3AV+Lro\r\nYnb5wgEbKwpcEXOvxBo9pgZ/YeWwIWYXLvLfKMrYFOcBe/TPBTPEQ4MysAc/\r\n6BuA5jiBRPD5noJKQdduDarIBGd7rDRz9R2QKpY7oVWX6jIwDZVWtRjF7Bef\r\nFKS2uFKMGCscvLSe2EnhFCQ7mp8wHyH9dkzBR44lo5QqP1hCDIeqOrenxCx+\r\nyYCgeh4RdeZQznsweLZDpZZ8wRAEFrVCPdQMG9GrHVqDIkoNMnjdfIrFfGWz\r\nFE0FGSNk0wwJowFqpkv4d0ielwWHBC/sS7iqyk8GaTijaTC9tO8xRybFMpAW\r\ntnndCbTA4Lj4xuUEdHJSDOSsiZB7R9gZMdmDBc4HZkiUaNdrrTX52ahIGOrH\r\n28xttFZ+fAg2h89i+D16ChbsJpa/bloTxslJnQ25AnqJ0xWc9qaNvmqZoY68\r\ne4QEvTm/Wf258gsGkeUdZtwL6lkVrYc1UVhzrQg+672R4BxGT2jvvxZaIi2q\r\n1UHF1WPlKUy5VUvtxHFh7QUzRS9Hns5JK6c=\r\n=XNZd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCDcgbYsw4j6ZI8Ljq1zQO82WKI6M1YESGG6y8wy8X1QIhAKCQ5m3BGAR/JGgg1hJx84kvD92EPGJinCTn5kn0NWJg"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.2-next.9923032.0_1646853724532_0.9556750500198956"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.4.2-next.381dcca.0":{"name":"@kaname-png/revoltx","version":"1.4.2-next.381dcca.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.1","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.5.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.10.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"381dcca8386df72904b7f010ab7e9771734442fc","_id":"@kaname-png/revoltx@1.4.2-next.381dcca.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-0Fn6AbFEXbP9UKaYu9P75c1Bz7Aeiu9JYCqXUtA0uP0IETeMwmMvHEF01CtqrweIEErA9MQECRf5gg9T4aDmlw==","shasum":"f5cd8fb0a34e7300866a1980d4bcabd9a060753f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.2-next.381dcca.0.tgz","fileCount":347,"unpackedSize":361566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLVdiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7PxAAhqHf+YWZ3TcZDvzLK222bWwmboiMhtKjHQ+9p3R0vnFEq7R0\r\nlqe6cFWwTbAc8WlkFwixr1I+VuS/cLgU+ItaH7eghQvrlaysSBakVjuTbhwG\r\nfGq7IcJ/V0fI5x2u7YZjEGpL8UqyfC3+9tC9lvUSBPbdx6fzSVeveLgfP/yv\r\nWs2GKQb53icpFe4bd5WEKsx5PXTQLK5aF3IW2/umerWo9hE5IXr5c0QntMXR\r\nY5Sws38gZYCCwcK+9m9f4OmBVyzf7BQHf1HoeyBslHfR41o7zojtjBWqO+b8\r\nPF/kb+qxHZdOwnqDtjjXw+vB5G40OmU7gbM9QSQNYo2qtCAcGWEJVMjKxr2W\r\niIpYizxraGlr7bLiDm9FFGxrZjr0S2H+h4Y8ciD+oObjQzEe3x1/wDsylvUd\r\n2g5zCiQ0bN7R734UqfDqEezZfckICYrJ08c/mEW5glQ8K7L9z/UlZuhPZRF7\r\njgswAH8vOaZ9z1afOYlawWVfTS3Di3vJIyd6Wzl6AdsVGkBOV+o9vKVOy5mP\r\nOEcbd9tjpl1jAJJMfi4fcG37nlnpqSDjnoDw6Umt4whxFEEYIydJg0q8ugHJ\r\n4w9tzhGpOP2PSaOywC4KAPIMiXKS9SwzFOqoqU7b1dQtoHHn5ii17086VN2c\r\ntK75xfByDmZIfeIXDABTdRgP3YoVeInpOWo=\r\n=uBFd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4KF0+u2t3Gyaw4qXOS36HB4iT/2hDvUsGPGMnkBSPMgIgfEkOsaYA0MrVG9mPi/PU56w89KyjAaLzJSmJLG150P0="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.2-next.381dcca.0_1647138658324_0.4780503050899405"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.4.2-next.6fd42d9.0":{"name":"@kaname-png/revoltx","version":"1.4.2-next.6fd42d9.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.1","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.5.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.0","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.11.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"6fd42d9f53d3e03266200d95552bfbe53d588031","_id":"@kaname-png/revoltx@1.4.2-next.6fd42d9.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-zqpBjFSZPEufrXqv0kQH3KRHiukH1+VxwWh8pBy9pf3X8dFDQy/ARE9A+CYQ5fAfUhtGmcV/Ws8RIw3MuzoFlg==","shasum":"24463baf822b7112f0520dcafdc91697ab640950","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.2-next.6fd42d9.0.tgz","fileCount":347,"unpackedSize":361566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLXlcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpo3g//eh3Xv10V44o78yVYkUWtqdzUM+dn8a25Oqz7kPMqlWOf/8IM\r\nrC2c4RmdB/N4iQAwGWxnu6TbjnLHf/FFKGb5V6L+rR1lMdYwOhzhUb3Z7wmt\r\ny6Rh+rwn3vU4pd2dZqz2UgWz4uYMxX8F3mUpRUZt0M1shkVM1wRqYOw/YcV5\r\nHgWVMWbDRx0cC36FZm+qiuEet+FYApyknaWOBJ3jejxPBJdQyPucjS0iQm9C\r\ngF9/IVXFDZflNfqqjmq4uqnA2NTMOLI/NT6Q34OwGy8Yu8WmqJ6oDFhUzHEu\r\nL3wVTf49T0KaUyBNd3ydbfpo6owCl5whdfs0DwSNZ5H0NfRIb21e+ZQetGzg\r\nCcz0Jw6qLOYetR8TN1b2e9Vm7V3u69zYtnKnqEFurgzyGsV9q+Q4ZKQlhP1Q\r\ndWY77y48afbtcg6tIP8sT/jItxfAtfFtJa3i64ulUYrcel6wYmwbidBF31Ob\r\nPCVDzn77QQB+TMefwgy9faGRQbPM6V9mAmBRW2YqbsXwBrMIUavson+nPMq5\r\njUKbrDSni1QnvrTM4qwzrrqCqwWJRh29B/F/ToTyqZmtm2XQmM2UlfQ8CfIy\r\nTT6nb2p520rxRedN3adR8on8wW5a4Z+5NmBPNJcTNh7VuRvO1+jMA5qmHiWK\r\nSSCTX8HJv87NxuDbb9e/4vucjUGnq4QTiSQ=\r\n=JjFT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF614pMe5+/DOc9NXwuBQX3rfRx9tE0nEmYCC1fuWGigAiBBUzVM6O2XOpQJsY+XF8b841bDRHmKI7MSVsPie9qMBw=="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.2-next.6fd42d9.0_1647147356300_0.07015726658322663"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.4.2-next.1740925.0":{"name":"@kaname-png/revoltx","version":"1.4.2-next.1740925.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.2","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.1","@sapphire/prettier-config":"^1.4.0","@sapphire/ts-config":"^3.3.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.11.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1740925fd3ec079ea9915fccda11249eb1ff47a3","_id":"@kaname-png/revoltx@1.4.2-next.1740925.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-hnmbXsG6Eb1tcLTJv3FIp8WNkPWWK8fpKfm0wK9Esbyp/RiH9JHweSAGGDSX7BkXwrr32IO6E8AWYUqP4Wfv4A==","shasum":"bf1ac788f4cce9afcf2ff22fcc454cea33437e7a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.2-next.1740925.0.tgz","fileCount":347,"unpackedSize":361566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNqOZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoE2A//dSLAZ916lHY0hLpnnHG7BS/ngY4FHj31CmO7MQBi6K9dSd+A\r\n47WMubqOZhOcZXqFwVKWtaYoeJtwzmOblPMrU5axNkRGbpdJq7N2LT8Weug6\r\nK/GbbW54e2HLJjeJj8p/WOpF3lajJ2jwVplG99HxPw8lt5lOdJXd+6Z+P08d\r\njnvVNOqoYLbWSBBHEoPYfoTZpG5FUgY07zWMlXbmp51dAmt7gpTRqdGLGV4H\r\nVhWSM9QlRsGWhmf2LaKeWt5Qvz+WDgVQO0WDBSaSeGV8UW9x/5S+Oc/J6zEr\r\nyIc8dAU1ZHXWgB/s0HXXgUCpCNOvPY9oV4yYPCfrjweuAvm+oHky77XOmd0Y\r\n75cnUbCey+n9E1BplOOgfdZ2Udczxik3q5ug6CAPJ/uZQ8KKLIWS4OFsrSHm\r\nv8yzAxdkgznVq+0sMCh6YeQcbsfXLyak0g9eo6htLuMq2GUMpKU0D1z/1bze\r\nF2XdconwIZHC2oqlqbOBLoxyi/A5mML2HvRmt2p2GFK49rb7BSCKHPi8UkGQ\r\nKRXNDjX3AQtgUvO8ozQ55U8HxogvmwN3i16Bh9Do/866VzZZFeZ6NmCZU0kF\r\n5b+BUxpUe6b/M1RYM+HEbVucXplyY2EHgCJ01r9LDa6wq/SPE14iIGL2cvBL\r\nclKoDdC+R6BHzQZLrn0Nyt5nSc8lS7QX2IA=\r\n=OTVg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCp1Y7WT1t2fiBAFe9fgxfiUHHEY6chcY5y5nn1mOaWPAIhAKMLL7sFdnyT+0E3+vyEBX/CKyx7zLhMnAqsxmFlv1g0"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.2-next.1740925.0_1647747993726_0.7361992618493196"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.4.2-next.1357778.0":{"name":"@kaname-png/revoltx","version":"1.4.2-next.1357778.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.3","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.1","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.2"},"devDependencies":{"@commitlint/cli":"^16.2.1","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.2","@sapphire/prettier-config":"^1.4.1","@sapphire/ts-config":"^3.3.3","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.14.0","@typescript-eslint/parser":"^5.14.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.11.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.5","prettier":"^2.5.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-alpha.12","revolt.js":"^5.2.8","standard-version":"^9.3.2","ts-jest":"^27.1.3","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js/dist/maps/Messages';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"135777833bb3902828044f6e925039ac2f4c38e5","_id":"@kaname-png/revoltx@1.4.2-next.1357778.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-ZdoYB47sQbFO4qMH49AZXTv+sogD2oReHggm43H6UvyhhRPNKxdj+u6RO/owMckPohzLaEpZD8vVmmfa6oz0Kw==","shasum":"935a207ad7fcf3bd61ab052eaa487ca03caf31bd","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.4.2-next.1357778.0.tgz","fileCount":347,"unpackedSize":361566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiP9ipACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXPRAAod6xAzQU8BV/bqnUASJJLG+jnbx/TJa2+ADV/JH0mMkEWthB\r\ncWGWtFfFsEGeyM4+Gvmff+J0b8qVnjaiCVN891KhGTg8CPGXENgYvoG2HcCA\r\nCsLKLpSOj67hxNfsdhxiKhaStY4rpLXoepUY0fqKp/bEAoE7wrzinyd4K84v\r\nZkbtL2VZIJrzib7M1Ha6/OO9fSoty2t++dkOiuAsaugaijYXPovif4MYuzd6\r\nbr/sIEuEHeGdQa/VWNVCWVqaWArCI3Q9JANODBPhCHQF3ABXSy1j5E34DIpo\r\noI6L7xotQFeBMhuL444qqFEnRL2I6DTwd2g9PxGYVEFKQmK25ZFS5RzmyODQ\r\n2t6yB59BKVSZFztplunaOhZT9LSrA7Yr8RTDI1OSOOQzN6aknYN4Cu2WmWt8\r\nf6jjAlV7nZtWy7pYi0EhgIrQadEj1+uuSGRS0vjjXcZm5OCtzqXAXQrv+XAZ\r\n1+WoUJ10XVP+j9IPvIan56utIdyIh2X5lJSS8gPJfRwt6SmtRI5eX0eqAujd\r\nwLxcrtxucctKwrmxLeOkJtpsVqxNsBRnPWcEVnv2ieBUdMtkv1DFOxXM+yqG\r\nPbepZC3oLCGkDnoJLVeHDJUc69dkKud7CuCchKnAPQNFMM6yJEJ0ROV6YuM3\r\nXrdyPbX3hq8ukkLWQGJ3s7KkA3dKmnDmrBE=\r\n=iIiJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC09Z5aVLnsRo1fyRku90OB1NbkN2LNRCXMS01Yjz+ofAIgE6WMjHNYaWMz+gq9QxuBYjgJ3J3jwrZ0LuseIbABIao="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.4.2-next.1357778.0_1648351401520_0.11436568981916406"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.d47cd03.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.d47cd03.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.3","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.1","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.2","@sapphire/prettier-config":"^1.4.1","@sapphire/ts-config":"^3.3.3","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.16.0","@typescript-eslint/parser":"^5.16.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.3","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d47cd03931b34cad21415d0d769448e7205c4e27","_id":"@kaname-png/revoltx@1.5.0-next.d47cd03.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-9hL22Po+1wek3pVWR0GaTnZMLrFOhw3gbVgjdHGXg2Z2e79oMYoMsQWc2iyqUiKzRWP3ww1HHYA66jSmKEfsBg==","shasum":"43f0cea7cdd7c02a1a0fd38feef743f8eff79bfc","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.d47cd03.0.tgz","fileCount":347,"unpackedSize":356570,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQThRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpidA/7BHQGLqpMkgBZ+8AZlOZRq1p4Xyco/0yVPuw5tIWThmvQETCy\r\nVXe3EZnMOc6nk7zO7NcAAG2ur+D/YbY4g/gpyaQ9ox2X1/8oXyrnR/XavIk0\r\nOJQ461wCo6aXTLkXzAfLrMq3+7ceeUnneTya3m4sph0J0Ozc98EhG7Rxf9GJ\r\nlpEFJsrOgucLbw0umyBl9iPs3GKoNVzoSU42yH+DVADHU+nMzYZyBgIcz5bH\r\nLk24pCDYqxP04D/NfIeoD8653ux7ORdGprbO6tX6K10Uy9S1AcBX26Ocr9UH\r\nWq+icfyfMwhndRAY72RXlqWh5nIYpfbfqXjjbFy2hLIzlCyr/EfC9i/cGYc+\r\nNRI8Cow3rQC0lWJOgzsnI0LSh4joviBd3GPWvuIesVISiWr8OjeaVJzx/4qx\r\nbvc/Fo188TJLsl/LMgcy8aCznDjfbSP6h/r8bKyvWHN6c9vvqzMZDVxq6KtP\r\nW1f49PsJneVMAIBwHeARWln2+gTDYF9+6UP7YGKSSIuWxALBJ7dZ3sG6Vht6\r\ngyFSVkeMQWG1H5gzXj6cPRAFbr6cJlxtEwYNBp0fXC8iUDbgXTzQjglaBtOU\r\n9Q54eOT+fZK/hBzpt3XsYbrbEZWLf6t4iiibTN6HPiUtfssNXNBsZz8hCDaN\r\nQy3kG/w0Ybeo+PKMhT+j18GsrZXf6SQ8HvY=\r\n=T+Gm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWebeFFYHgGbi7h1Su4eAl7aseg8rgGzwv3WyxY7V2rAIgNaXtL6zMwcjPT/ZFNlcWpgy3yHu1eV/cHQBvxpE8L3w="}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.d47cd03.0_1648441425572_0.5450159796670442"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.68e8727.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.68e8727.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.3","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.1","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.2","@sapphire/prettier-config":"^1.4.1","@sapphire/ts-config":"^3.3.3","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.16.0","@typescript-eslint/parser":"^5.16.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.3","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"68e872742e484915e7842a89e55fcb9740ebb8dc","_id":"@kaname-png/revoltx@1.5.0-next.68e8727.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-DGW20YYr5z3+apmDfVeNaYFsMJCIn73ckgyCGl+7XfEIo8IOIXfkkoslgS8RidGKinufUbtnhQdMw3alMA/5Ng==","shasum":"a9a57f744d6ffe7dbd34e193adae7779dd3ea429","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.68e8727.0.tgz","fileCount":347,"unpackedSize":357241,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQToeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrXyw/+NXIdDzTqA/6tS9MfRgBdqHyr3qly2FYH86oCuMakzq6wHHGv\r\n12hMOzCe6bR7SE1gdKyLblSzUEc+6pXiLKjg7mGeX8oW/bEt77X6EYmOLMb1\r\n5++mpYWwCauyAUpC+Ygw86yfjxLzeNcgloiWDPnOz15Zu2UVmZyRT7DzXRS0\r\n+x5mLcHDkDX8MPLfTo3hskE86R20wnjMMy+FSX928Rds1/TPfhoHJ3jLOEW6\r\nBjbmins6lA3a/R0k8fm3Qp3x0cqkaQ5AZmMhCtyOj9HsrGJ+tzgw8X7kJ/92\r\nNwfxUUl9Y0BZPallDUmjHJv+K3dDDd+OGoF5S00GGBF0l2JTIcxFSxqvXpPi\r\n92YOPmnRaNhbyTLCUt9RvkSFk07r9EZ3H5fTBBsheIM2c992wXEc837aP515\r\nIcSWgXElcyCR5Ij5ufBYg52HBFbHtQaOJdsGNHFMKJF55smUoumvyP2XO13e\r\nGzQeQYHA4I1CERcpooFfChGAEw+8WGnrdIt1V9GGhabCGVlH13FabhnjL8UL\r\nnqT73p2KWMvQ0tytOE4cjkqjMGfRZtrAJLbcDwqs5tJ26SWwl4XKJi8niOsC\r\n6NRLendIEMHqfpeuVToASdlOnogZqSUmuGEa0WPZiiAapfiJSGu1dS9yyWKs\r\nO+ME3dAeDSd9BJx0hrLTsxHisDAW24CbcFM=\r\n=+50Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC366fhNrPsB2tUlX6Cnt3ok/Y3VOoC87DyoebDS29lNgIhAP70xMPNLPVADicgfxRYpKd/fkaDBnRCuFFg3sm565iI"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.68e8727.0_1648441886537_0.6893038568206673"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.97e7c67.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.97e7c67.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.3","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.1","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.2","@sapphire/prettier-config":"^1.4.1","@sapphire/ts-config":"^3.3.3","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.16.0","@typescript-eslint/parser":"^5.16.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"97e7c672bf6f1e3a50d827369650ff154121d455","_id":"@kaname-png/revoltx@1.5.0-next.97e7c67.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-EpNodIdveAGeWB4qrAlU7hevvGncnKaCgaCvenVIm6XQGU8o16HmsYQ4sPutNLJOSn0sUlJHSplUZKE+ib0NwA==","shasum":"e6988d05974f3e6d1fe071fb3590abe71639724a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.97e7c67.0.tgz","fileCount":347,"unpackedSize":357241,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQef0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCQRAAorBbuaN9XC6LwlRVvMb51pu5AIPZgmI0NfVcPV9yyAeriL05\r\nA00q4way23wxRR29cZZPxEzITz1Q0GRaNFjzaqjfe9ptkgIon6OuA8T7zTT1\r\nLATuylefHMu5DG4XCOcqwix9kPwJDKnexsrd9gKLliCsf17+S68Kvl62tfXF\r\nqv9hAaiP8uebZBABq6pNm1hjZYJzFQycDaWNnPB7aht5IIYPqMlb+8pzMHPE\r\nCP8+L3AXbzpU6kzgoxjB6Qnhd2mb369tIL2xEAdElC7BSNLM4Rb6cOsol0bn\r\n270chTtpmYVJaUcQPV2Hx4fx1z6SBYwZQ+7j8zVWHHzh4FUOX4o/ld4qIMw1\r\nyXFaUwY6PY/kTQDuphszZtwJG/f1rT4kk5QTBMfurepsngMkweCFkFWrfHBa\r\nu6zd/RCPfhngQoLDHHC1ZhLzNCxCu3tmfQWZwRDuTQ2UZ9jAbr00mpkPQJ7B\r\nGgSFvjmZwTUrm3bt0D0Ep+TzGGf29Y8sA+i98Sa70Ao9OHkANfQlIV3rbJRu\r\nGBLn1vw3vutMCCk+swbNS6/JKkz1jWHWW/7nlQ8fOT9b3r8ZxTCRX1+4pHOl\r\n+BzkU/oUUznktNo2g4CbJrnki1RJdZNi/vgf0hIxWL3k1X73eWP2TpNJcnFU\r\n0kDSJcMbRB54oNbkWg3OyMND4aVmRF0Cfno=\r\n=ihSk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDY5cE8fP+IPyBHKJiewpWxyJKZs5xlmkUXrXDUVsutDwIhAN3w6l5PTlmKt49uZr5DZYkci+u38S5csgldYhgU6jpH"}]},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.97e7c67.0_1648486388131_0.09701094954692424"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.706834a.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.706834a.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.0","@sapphire/ratelimits":"^2.4.3","@sapphire/result":"^1.1.0","@sapphire/utilities":"^3.6.1","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.2","@sapphire/prettier-config":"^1.4.1","@sapphire/ts-config":"^3.3.3","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.16.0","@typescript-eslint/parser":"^5.16.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"706834a2bfe46aa4ec6d30ebc2712e3e6891a8b3","_id":"@kaname-png/revoltx@1.5.0-next.706834a.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-m3ZkmlT+FcScuoDYUQAbrYM4M2WNcCR0F7gXf61ZvAerOjkgg1NevqHZSeUl8p+SVeRjZ021zyDUggL4G5cnZA==","shasum":"18d716500b162b04c53ef49c870d7355f7f84c27","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.706834a.0.tgz","fileCount":347,"unpackedSize":357241,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKerC2q2e39FSPY4EfAeB02mI0zE3Jr8TOU3vW6/O65AiAoHJaH2FjO8RQHmyeGCNLsrhhN/4Ww7gJdiuWoFRBX/g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSPG7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrTzw/+Pr85oaJTKC5Ri/ZWh7KHWUMEw5oA2ylXh0fK4ZGEIXe7XuL2\r\n0/3yyOE+suS3YMA3JPaCxCHPzSq/Fg9QLxSeW7Prr4OZuwhqOmZv1fBQinKv\r\nt6wXoNoJYfJRFYtf4iJW9XzlvmYAwnsn5o7Iq9UZewZo2Xpe77QcbO58cYmV\r\nvCfTZO4pbezsP9MCxqQ95CfOC+YYUUQMBwt4NhAdxPL5Nk6OjRHHz6KXx0k1\r\nDYxLSgZ9Lbz5MgEyjRFZnZRQ/OfFkuLEkdb2fHQ7s9YGpvjhUTxwXA3OdQJH\r\nBqjljZvvceKLfuxpwBcZVJhi9uIPkHQEX1YaA0bQjEz+9zxSO32/y987R7jW\r\nlbxTqgzGlp3HZXSca3RD3arvCEJfWF8092XnI1JWqmup+KeTVfYlDWDApgBB\r\nC/+6LlsSrJZt3IL9WzxqiY5qB9K1HVzMPeZ7zEsIsExuSJbsmQ5aMzsdhgLS\r\n4ISEIuFnl/ulD1rC17KLuw0JouG9RXuMVvlh7GJsQE3bR0M5YqxAFeW/fG6D\r\nWW+rssaUvF8JYRctMiBy1kfmzXynUhvEuLri61c+nSorY9CCiadgN3KnSWpH\r\nkPB7QkMusWU480c2Y2yW2J3lFiUoc3rrve+Wx97P866cj6zNfO9gakVoXCSE\r\nG3pJTFqU2yXssRc/9RF7stxs56grwiG+xpM=\r\n=dc+p\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.706834a.0_1648947643358_0.578803017804745"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.82dc52c.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.82dc52c.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.16.0","@typescript-eslint/parser":"^5.16.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.1","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"82dc52c0be431db957014c381438c1a05ab58407","_id":"@kaname-png/revoltx@1.5.0-next.82dc52c.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-vQeS2BEuK4tHD1GFjQyR4ulCz7cwiEtwhUbB1h3qzQNps2kTE8uFHEAVcMzGWWWkXKpFZVh5xRlrb1/rRT3QdQ==","shasum":"9e5ea29f61c38eeb2cbd6c38f388311f19b08af2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.82dc52c.0.tgz","fileCount":347,"unpackedSize":357241,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAeRjJCpNWJf/IIj0+LvXOR2jdEUcIOH9PiUUilr6GCuAiBJOUCr5te/AG75yJop040cf21aI+wbkvdQeX1xz1naoQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSPMmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo00A/8DLsLVOKl6oAN7z0tz6m/0xDECvtLr3eVbUHgt/DqH7CG0Xgz\r\nIpvv9edUE2/fFFTUdg6JnNYtqngxoyRRg4DGxUE7OijopcZJOddFy5owWcCM\r\n7/lw8qjsvhyK9VO07g8tUwSO46UQKol8zX8cSmO9ND6IjWAaZpng7gsQGqCo\r\n2EkKl3jeY2HhfDLAcjJcx2Efvv2WhhhJeuSBryVu16wf0whGYtQ9RO0/haVP\r\nSwlUkZy7XU91dMKz4XTGFV1fZySKjhR7AT2owoyJxXXEBfl8Q9zUlxAPgSPR\r\nElT54pDZ1xd0MCyQvoqRCmpV8HVEPa0ndt+ej8w7n3flaBNuW9y0FPQlepx1\r\n3Z+ErUFJd2ctnQFC8V5+RZRwhFbOgO/t7S+Bm4HlvI1wLCR5nAcYgCSWEUAp\r\n3xfJrac5D7xbJlRFXFLtxd+a2D70Wxz3cZ/Jd68MtQa2rSkEqNVESYAHGbjB\r\nWdrdSwrldiKh0nBvX+4y5uUwoe6YUNIpOMCBdVkhnTGZzjNwVfBg+ZHkv0fb\r\nDdOMa62rpsTkSVJpcX46Omm3oU49eKK9LMQmdwz1H/k95XNECAip+DLpvghl\r\nHZQNs/w63deHDtsLisBrCBrf8pNnNFAo67lKhucxpYswPDY9y94ZnTzDhxUH\r\nwA1oUslxDqI3aNwnKLj+FY/mVtqG6RScu2E=\r\n=v+cc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.82dc52c.0_1648948006358_0.31612251972468486"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.ec2299a.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.ec2299a.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.17.0","@typescript-eslint/parser":"^5.17.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ec2299a2fee47c685cdc9fa10c605d47445ec775","_id":"@kaname-png/revoltx@1.5.0-next.ec2299a.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-FglBut7SlyDnxd/++rkFOA5yL3q/n+aYAdHZluAI7gmRStAJTB5Nim2YGSXfeYnIAWLTJQykLukLpZkQz4s58Q==","shasum":"01017200b0e2bb9feafe92f4d3142874887a7afd","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.ec2299a.0.tgz","fileCount":347,"unpackedSize":357241,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaGYZV9Kp+zTkuBFfYQlCbFPULmGYyePblsC0U2eb0NAIgUlT5KBBhJ04KwHG2ufUqRVTMqS05VFnWWASe8fe/0Ww="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSPPdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqWaw//VKrZ4JwWiljP/OFWGRwPRlepempPf52wYQmuTpYIrHlH5Jkx\r\nvSE29ech1WW7anqfq3mnZVzyVTVHyXoi2okC0nvyh3BYVIwobld4o8cdB/KI\r\nZ1mY5cV9B75214bV7nudeLghzAXW6C1wjqemihT+d0cFC9RLQz2AzzAI7s3X\r\nXOGUqkALKBrhfVU1S8PFJAGXHSdAm3XRP29W12AjBuR9I4Fnp2fKiENm1Pfg\r\nrdzOXRoS6oRGeXKdSSG/Ctz/VKAdP7II/UMcRn9Kb2Ek+JFRVACIecx81ABI\r\n0uE8mFNx8co29TsSqBEEJVV/i75v1bujtUQPbxMYRvMvYX9CeJQAH5zKKWNk\r\nc9nKZ+iyj44Kp/PFmgBImY8+bl4di9pGlu6ZZICKf5dFW/5X/83rIbftdECE\r\nn1F9Q+74LXoedc5LoWSfKuVsmyrIKXZRw7RQujHh7JYdFUXz0beeMKQsHSf8\r\n0lKJysQFKLPAmB+BnP6arTErHRinpIV3nmA2ceG7zTKMfGuuFsu/jCk8cJr1\r\nz8/bo8fcTH5kOl2OlhMci+2QeWZl4ukyQrt1DhkVF2pC+RlC7tE8IborY/fX\r\navD6nXRHv/676q+C3XIRgqmaTXTF+4PHhRxERZNCBYDec0swz/AuS3q8nv58\r\nMzsh6NP2nmDbPkRh9HMH+TbfPZZuvV/GYuM=\r\n=r6/o\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.ec2299a.0_1648948189231_0.6127384050660283"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.cc20cf5.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.cc20cf5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.17.0","@typescript-eslint/parser":"^5.17.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"cc20cf559ca33e4934f4345778b9837cf69e47b6","_id":"@kaname-png/revoltx@1.5.0-next.cc20cf5.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-4IZajCt2Ppmi9s4xt3ZoSz9Rs2ti+HwS/PO9mzWsMjcF3TT9C72GurHJgLLHuDwQMpuUbrVKzCSbFF1tot7QNQ==","shasum":"65c2aefa132e02a4c615d5455d68347177a44f4e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.cc20cf5.0.tgz","fileCount":347,"unpackedSize":357420,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4Cow4SmdZ5KLq59q/9rW2l/YyU4PD5bCQMJ6HwEV5hAiB9uB2M4i+Zck5lwu8jUPccoHMoVRnRTcU+R5HLH7iytQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiScUhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpkEg/8CTIT0SdgxY2n5cYFpT9PpMEisb8i2WqILjtQ8xL+kSbLzv9t\r\nOmSfpkxlUAxfXwR/6rQtF4KhKilW1I9wkp3tzdxp54PxQvXky/WZfNou6vwl\r\nHsl4uv8qeE7whnIdmm8QujupdBJWuK9qLdxxMWm77NNzmB23j+TutqWa47eV\r\n5eTHouA/EeQNJukMIqbBuhhBMleTNDwmiv0ZqxYHEz/f+Ny6LOAMYXh+dwEc\r\nrSCQjgV+w+Q4n2pYx3gn1iM/iC63tdgCq9pBKJtdXBPhdCG1FO4LNj29Wjp+\r\nzRffQygk7M5RPttgsGWADs58Mlcrh5D3VqggXM2+jLKo8KLWFUlDelK1cHgx\r\nQo+4icp7zkxx9ARXGmGh4x6Jdw5kzIdlCT8fVcCnQm/IZyeFmJz7tKNElQsO\r\nfMf01hQ1hDdTudNnP5BBa9rAnsaQJnqnV7t9WkYs6+HEtTX8rrt1cLx9vqed\r\nsnYLPgKZSia43fO2yZuE/qxY0aFT6GMqpwwViLA2okpxt9eIqb3Nw2FUw7PF\r\n9i8e2NBjYI44/QD1uT0o+cMc8uiIzyYY7sTO2C77SrG0UAtA4V96FD9aha4A\r\nzC5i6Bgz8q/vmtuFND4U5fX58JTBzTqvyig0H6uXwAGvJiEKKiJKt3I1zc1x\r\n6Vd/mtifJ1slw6GgQCabQ4Scad3LmxVwQzQ=\r\n=wzdZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.cc20cf5.0_1649001761317_0.42089600228837964"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.53f0c6f.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.53f0c6f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.17.0","@typescript-eslint/parser":"^5.17.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.12.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.8","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.13","typedoc-plugin-mdn-links":"^1.0.5","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"53f0c6fd24a4efc5501a9fd5eb0985e9d985dca8","_id":"@kaname-png/revoltx@1.5.0-next.53f0c6f.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-9ifbAeQxe1qXc7ypraDwfnfwRh5ECTpKffTKvFmGwNvk3UXLNAQD4crLcNSe3ih/pJd4E9VGDSSI2SttlcHXpw==","shasum":"6ddba4652256a8c16da2c63af66ae089112fa3ba","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.53f0c6f.0.tgz","fileCount":347,"unpackedSize":357935,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC2XTMjVHKWeDNXSg3XIrPDz5wx87b5Qm/TbyIs3/OR/AiAKAgDcUMzjzeBD1YfqnFtZOAnSIsCZANxoYk3J6Zoeeg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiS5o2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqMaw//XMyu7IZ1m5vOciU5NdIODT0HVNmGxwVMkfsrseyw3MbYymiA\r\ndVyOMmeWCh8j81dvwbWffoCj4LK2q6GXOkPyFygFsj7uZGxP+1LAe+m2EiQW\r\nbVCXkmpZZ4GF52pSIN+Ai+96HEneM+7WuR6eWI+GrTJ8WDnANaOupHLoPk20\r\nWm2xtqqWycmviMPkR6Z78QS55pRzApZglMBBbKXw7hGXoPBuJcLgpQz+YMAd\r\n5VEzStH7Z44RgzHA14a0mp04orXnEkaQOBMeNer/OXgUOJljgI6GNPiFc2eJ\r\npg9CypdznfzzTHQIBtFPLZivNYG8g4vgLihpr7Tb1pPSIdV4zaVC2En96R1k\r\noeq5Ba1pnrAHUV4EY70DRJ+0ueqSURkyIDGJhvaktfjamjaKGFr6z7bblkOZ\r\n6LAnBnY/WTJLAapkjkCmv4Z5zT9u698/9xPFxbN8wetWsgTXu3ByQH8g8D91\r\nEEDS1eaVUFQi5ALSrWR2/ug7pC5YlWq64CjdWa+izbCj3dTCJiKYlvxUzOyd\r\nkIGgc0oKAKsqwzo/2qdhdUCHUXabdhaBgqDHO9cxDUSZzbV4KiP1tWpqIdF9\r\nUtlHtGxVwP9r7ykEZWK1uNVO59Mr6netBpjttOPQTGhfdin4ff+IAzla7qzF\r\ndGqwxQ4WPE+mSfFrsPCh9IdY4Pe2PY+DZkE=\r\n=jEJ5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.53f0c6f.0_1649121846163_0.1777213385569847"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.9c7b8a7.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.9c7b8a7.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.18.0","@typescript-eslint/parser":"^5.18.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.10","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.14","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"9c7b8a7d996dd4f1546071021a1c2642990948db","_id":"@kaname-png/revoltx@1.5.0-next.9c7b8a7.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-VKaBLTkfkTMXU96ykhwU+gpzZq8MeyZCCjPFzr/uit5LjdFcVdGATr5mIPMHkICbIC/BDYOWpXLZEKUNRdayIg==","shasum":"5fe0a2fc1784ff4bd125dfb73d11054d3e57b4fd","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.9c7b8a7.0.tgz","fileCount":347,"unpackedSize":357936,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDcDp8qV0PgCjXF8uUavWevYtGj7MMapwBcl4lIXUFxXAiEAyoqavw3xwUdy6K6JCyipXW09rMNrvjBAJyyp7EGu2JY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUmE0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYTg//c7vV/GO7vXAjnOatr67G+MnBwFAX4MZuzVslZBIWrIVwT87p\r\neLSW/WYqsKEzAoep/gP3jZ7JWkgS9UJAPXuvAKTlF4lTLXT/be1i1tryCsgr\r\n+90yGKb2GodIuj9qCL2SxlhtHRSVMrAzfzXdJss+pZZoCyWJjIw8N8ma88/e\r\nSzdRt9Ug5vgZT7TuWx8478+3WxcwCWKTvREGtMxXQuIMVc6tkcQKBmtfp1R6\r\nSYNkpmsFzGPD/UQg3jqF5w/ejAtVwpe10Jae5kcSr2z+diL82BQoo2Ote3Ty\r\n9SuGdWgSCOHhBmCrlYT6l+N4WdtPQ5RP27O1X2DxYzGNO3hLWvkPpKg9Ujqy\r\ni4tiKkKB9wv/q3UBEn/nODZEXCSHBgIEE1TLmPOlminFLG+5DVQIVdxchvcr\r\ndUupqG4Hy/dXAR5bgfM/314CG2VjLY6+I4pmB7ktFVRiUfQRd/ZBgVhVvFhI\r\n9YDaEQFmQLWvAn6J0jrwfeYp/MTmvB+u2k0nxnJdgCEPyAAkABIQBm9NHjRV\r\nbvDTUtAYzMZGHVJ/Exx4SUrUsTdDTjHfbws2zIslQEYcHygN9BM+vbHmg2bS\r\nyN+s1iWyDWVdbiMM9mX7oLkTK4Kttm09xeOTr2RdJWjxMVlj916xUTVtPm8p\r\nXbqj9lBaGCCFscsyg+fjNAy4IgzxS4RWu0s=\r\n=Kh8R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.9c7b8a7.0_1649566004679_0.031189954482727433"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.a1286ba.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.a1286ba.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.18.0","@typescript-eslint/parser":"^5.18.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.10","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.14","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a1286bae6146e7f40bbcb014bcf86f0af7bb51d7","_id":"@kaname-png/revoltx@1.5.0-next.a1286ba.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-FUjX6491534RZBQcDsZSNhJALIDiNYUWA7E1Bp8FJ1ItZFBHumxEbEhoeudHxdkjlnZYy4bUOCyomvrYNFDO2A==","shasum":"029c297f9cb117fca19c264e019bfb8acafcca7e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.a1286ba.0.tgz","fileCount":347,"unpackedSize":357936,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDpCIYfjE4t5xUCuAXOcX5f6vO5h+MQo7v9QMKLCLMrQIgPWUnPwWKJV++XYwb3f5e0H0Xd3TWSUylP3Wa+hIVo4w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUmfqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCPxAAmBNiBEZkfbkTuIBP+I6WtI6DFrP+IS4h4TYO8unDaS6zgmJL\r\nmO/ZbDslvlYQa+jkjVVX2vqF1fa/3iZYx02K/DaRZKGv+8RAH6vAxHhvaBjg\r\niGheltdTB58fSy9yw31GEvg3x9opVi7WRF/NYKNDI81Y5nk8Pzed/pEl+Flo\r\nkGaqchhlpOymzlR5/yrzucLbwlSYMKZwHU2lUmZ5gvQhb+zH7w5brs7FUQuO\r\nLMkkQOiPEjOFl/87FfP7v1MwV5QggM+PREOGexda5VoivQ5w+XhU12W0DRbP\r\nU11gTrK1CmF65Ao1eM5Wx08mmxMh18JJcZiOSrplwxZ5PXsztI1xSjnlkfvg\r\nD1MrKJvJxaPZMfW9T1/FSYf2g3wxMiaX3V14IoU+x8RZknJ1FWvS26ruAJTs\r\nX+4ffNY7KfsoaseVg3Wjk00IoFFUcHJGoRV8Nv2EsUyr94KIexyoCnHCmdAk\r\ndptDjdIQufOC9KvHxSjIevnD495rWIq3evO6MZsZ7o2wxDxLYNUHDHf+qfKP\r\nhb+4RcOh1PE5wo0FsyvlXoa+HXzFejlH/bgGZOFCVYsG28XPei/dhEIZdcMJ\r\nb1Mxa0ibvw7zo7IRQLM+6iFwnL8ZQnI10NyLPL9bHKUvelI7+gWwY9K8K5Gv\r\nI1Ts8jnZYXY2+WxPgvJtLHilN3WxcRdP2SQ=\r\n=IwRp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.a1286ba.0_1649567722471_0.9807656213722253"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.e3e94ac.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.e3e94ac.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.18.0","@typescript-eslint/parser":"^5.18.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.10","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.14","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e3e94ac58d3c0627df246cfc2d0e1b0bee64f193","_id":"@kaname-png/revoltx@1.5.0-next.e3e94ac.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-9V+39vnl2unuzeqz5hmGWpaMMj05yDQSImsFBYqqswQjjh6Mvysv1YQI8fV7DosZ6Ae7Ssr5DkEkqs73zjKxEQ==","shasum":"3e2e384d4751a768b66d69514410330b92ef78b6","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.e3e94ac.0.tgz","fileCount":347,"unpackedSize":357936,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwITzImxiwxveJ2/Y5T9PVkc4GLp6hyMWsHIOlH6SIGgIhALG6yWvy7+hcaHc5bDWNv5vsEgcYPlAtGJ6nK81iKDaK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiW2RCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoSIw/+PDynt2N8TCXhBalI7j8X8D5xCFrh98nAZFWon99Fpg176MB5\r\nLu6ATY1Gc7A52Mtc1pXt79VJP+IYADdiR7fKzOSVHb0pylU4tPrY1hYnR9uh\r\n2xZoPzZV+t/r+LNHSsJc6RXhzIleDkr/6Vr0byUCjuLB0uioYiDSSeVi6LeC\r\nFvVTmHJb1m66A/xg2Uk5fiB5a1MiPBbHcC4KDaOM3HNGDntwx1x/BsnmnY8h\r\nD8f1C8qixbSFSR+uTEv4JXy7AS6OlZeNUyigimxTw4vnF7gy4fc+u/tDcrqG\r\n+OtePfsB7tkR8f9/TPpce51yJPX7Tk0dP+w92ioYx3fwdNYh//e00Yt63Otj\r\nsEBU6eA6gCAfADzgnSMvGArv32ufE0BmSl6CN+8rjvz2V0GSx+IytNrFjjEt\r\nU2Ct7eYL99K297+dVI7k7xmbugjW/O8F+YFyIHxpHqTLsTlRS1IXa7tVbw4n\r\n/LrUvkcRkgn/LpNxu/Nz0iEtv9M43YQTHoelyxPXEW2VwYTgsy1UbVMaqo7j\r\nuFSnHruCeVgtrHvpe5co0Iu7Ca8gKig2PicgXUcJTeCeBTm5Bwbx3fgqjG3b\r\nRgGAqomru1dWuCN4UiGqAsI//oWcrTyRk0fr3nsQiYpDFGuoMKy0CDaSTubJ\r\nJPVFCt3Um0Vu1S7cvNe4g0vQR1ur2pg47Lc=\r\n=+lBi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.e3e94ac.0_1650156609795_0.23374398919148343"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.808ca1b.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.808ca1b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.5.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.3","@sapphire/prettier-config":"^1.4.2","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.23","@typescript-eslint/eslint-plugin":"^5.18.0","@typescript-eslint/parser":"^5.18.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.7","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt-api":"^0.5.3-rc.10","revolt.js":"^6.0.0-rc.4","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.14","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"808ca1bd14b68a639019d799b8ddeee9091b2115","_id":"@kaname-png/revoltx@1.5.0-next.808ca1b.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-aWqRdvorUIfqqkSwtK1jQ5X4/328614zL1cpS3q/SAE9XGJFQ8Ye81SuXVO1P6cY9r54avYmngLGHRqbUcBc2Q==","shasum":"57be377a256af4a7feddede1082586e7c2ca9398","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.808ca1b.0.tgz","fileCount":347,"unpackedSize":357936,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDc2hNAUTAzav9okV7yDQ9rtR4hDXBiz1eXs7/2UDCKVgIgKt6gSSTt+nifYdaiLA8iqFecj6z9NsaqDXlU97KysVQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiW2SlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpVmg/7Bo9XMGq1BCjVXY2vkpx8Uihd441q0BG9jocO8aygko4DP91t\r\nxJmCRE1AVS5qKjnwwSfgCZK+pSmmkohsRUU5EAQl2S6LiwueylgswDlYeMEM\r\nce9SYgToAJ367F8lNN9zEU36mqHI4c6A9a5ral5WHEQ5kfXa/mq5nMtnWct6\r\nSk77+Hh22znlWvVt9dYetiVbWL4ciE5vTyDz7RqBE4iQYJXJcyVcYJ6/vH/U\r\n11CDdp/Wc7wJUv+MofnBgieowkXNE7fC3chDxYrZTp1sRp5NZJkt/r6YskIL\r\nxtwwQ8LMIbyTiZXmhytZSLpIQ8Ido5jWxTA8bkRL5h1Sp8uKEpoe7LK+3S89\r\ncXo2zRM82TAuUAXYpEsHBZJEjEFA339MVIgeAUKVz1kx5rYyzHL7cTLNdctX\r\nr8P1hpr7X/5k9exxz+s0SWey5S3YQH6E0T0YvflhwuczMFSbwIIDTxEuyfT7\r\nlvDDRgYLczqve88b0QBvWjNhIWocHnme6jfxfqQcrDg5UZtRZAW0E3M73zZL\r\nz/7xvxeIGymGwG7WYTedjoFpQRBhPiB7XDaI3GA0ajoKy51rs+ghofQOBNtA\r\n8HtsXuUQfTSxOzsqtjO8SbJLBxO0qdF53iPr2jz8VTwKNY/Fh5aCMex+2wts\r\nPinNNr9TI0FAnYzljg41luBqjZSHd76/xxQ=\r\n=kVwg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.808ca1b.0_1650156709732_0.6109841703102361"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.38f695d.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.38f695d.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.20.0","@typescript-eslint/parser":"^5.20.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.8","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.8","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"38f695d51221e1349392f6e508fba4784f7945a3","_id":"@kaname-png/revoltx@1.5.0-next.38f695d.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-J0NUc5xq2RhAnaDqjVOl33E4X+QoP+JLDbzyrlOqQRSj3PV4L/gVSz7xIaXfmCGkTWa4FVfwHhZHWqAsu/ZteA==","shasum":"5ac098e664d6978fb070f4dfae65621ce0c48ec0","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.38f695d.0.tgz","fileCount":347,"unpackedSize":358254,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAnyBWAQFSY87LBKHqtUUQHW4HdNAaB2sv3P3ippNgnRAiAL8K8o16MycJ6/s+aJyrryJqJkaUHaxyY3FDOaX4fJKA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXxfdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp1Tg/+PMw+qbsOYlEaM773ssk6QlSVEmF2I/Vt0Q0lwZw4nkpJHJ1D\r\nqpjtGkqUaGx9GnbJqolMq2Zfm2LkcUjgdnehst31bMWGUDpynCPDgJymRywf\r\n3jw2Q0QFVEDTBgmOYt3DnngUxfcXT5CZIScU0AKLi5d7mXt/CUmJTA2u9Tcx\r\nbNx74F0NRU3EJGaoYH2e91/TgZNI6jBCnSkUUXvw9SCwIqDyu7wGSXm4J1dP\r\niIpwYdw9tcI+2lHSOn0vJ6SiB5nm3idmA7kzTKRc2nsnCr0YT4B+NNnngUQ5\r\nOYO3+vXBwgtax4mUj0BymWBn5jSpA0vWDL+Liyq8ddwKJUZndC3A3jkWfj26\r\nQElE/XsIT+iqu3BuNU8eC6kI2zYCGPNGPxyzLca9g08kD3zVpajNbxfFcaot\r\nOLaX7q3mTqPWyJh/lfXbj182Xbj22N8Mej9xKWJ07juB8S3R1bvyILQVb1WK\r\nG/TikWga0rczaVDE4epWIqpUuj3qN0LT/OqbrvespcAb5FcFX6XlUuHc81J3\r\n5U4MxqVb1aqX2uxuuHIDuQcUMlTqEusDwo4t6Y5MDxy37IaXqufTiXvRK+lE\r\nWSwRP+YEdJRsfZ8xa71NHnYe9GLc3CwOnXrA2qAj/8F1owX21gMBe7pjQOjx\r\nyg3XSsBJR09U1HsPlYXCgPUkA3f3LWZscM8=\r\n=aUbZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.38f695d.0_1650399197091_0.807396163366803"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.b5f4a95.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.b5f4a95.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.20.0","@typescript-eslint/parser":"^5.20.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.8","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.8","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"b5f4a9562a3eee1957ad1343be53917e4a4b1127","_id":"@kaname-png/revoltx@1.5.0-next.b5f4a95.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-i0i2uI4VEIh3jaYhBVOC9wbkOvew42pfrY/RPJ6q90Rgk06qAcyE4gF4B88mm/AJ1MCnOjps4nEbv012nonROg==","shasum":"a293d38579a9a10db9c27b66b73ed8243de8e7af","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.b5f4a95.0.tgz","fileCount":347,"unpackedSize":358254,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC3WCEaT8kRVjTXynp0zWfW9L5TdOqhpTYq8RH+ZQw0fAiB8TsT1+ukUQLZlgD4qpg0CrwVgojZ6N1MqZLfZvXwbsw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZLuUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8bhAAl1H5CoT04Dyb6JdrNDmCBRl1v9usmdF2eE+E82FhGUduhB0S\r\nbQwn43dYfqYWHxIOjFA/C/KxDIPjqJGZdYeUgHfU8H0l1BgXDKm9Z4tlBwk3\r\nhdhVLdX2646LeeFiiiX/ThRdLzRmy1BMtiE8vCSAT6/Ha0yfPC86FZww6ou0\r\nNJmRxR+SA9VfX/Jdn166tqIYrESY4f5v4TZ5s0PlSaRgWXEAUDMwglge3KoQ\r\nHHZGIZIYebnVg5mfWOPObHWUmHHdyFmCg4fifBUDHvCeZySgBMJiik5ml5bj\r\nBKgiOQEQpLIYpnGobgVpecYh1p3QeAQahFj/YmEAIXTJzAha8eAX1UN/1EBm\r\nxmgldwpV1WRK0sxERIz7W2XAHiJyHy5N+iuCS70NAkvidzW8b8euCQq3wdUD\r\nW9l5aOo/nYSDgLZIUzaGTQmPKzAGsk3sTVaKdnhhQhtgyPsonvD9/in0sdKW\r\netzJnCGFW8rNEsGPSx6TtKaQ+KZEuNNG1UZFT7v8j0r7klAGhIE5q9y87yTQ\r\nnwU6i4EPWWX89/k9YZmMzFC1oxeDeoEvxrpUJn8ugVB9JXLmdG5rnh/ovGV9\r\nGp1UudoiKNnTYDA7/oNRBR7s6ZRG2Urxrv/Nt0oGekTLsLPdGL6jMaSPKHuY\r\nmi/jFFInNZAnbNxbuyh06981gHTy7b9voC4=\r\n=LfgT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.b5f4a95.0_1650768788554_0.5485408938391598"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.09c3113.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.09c3113.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.3.1","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.20.0","@typescript-eslint/parser":"^5.20.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.13.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.3.8","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.8","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"09c3113e396ae95b470645287d52828a1c478ff1","_id":"@kaname-png/revoltx@1.5.0-next.09c3113.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-aqvO89A/E/GSJU6VxbI23VWSMfU5rebpE2kdBRbF1ZMDCICphcvTJgbYR6iQrEv6S0E6JMSuWPjRHHetOY97Lw==","shasum":"43f6fe67d6c579a7815c8672aeda9c21fcc34017","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.09c3113.0.tgz","fileCount":347,"unpackedSize":358254,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+wz2jsd3sl2AHpy/4RPG6RGSEiK4UedVQA/u/bqnbbgIgP4l8Kx5/WnMP55yDAsptAhng71wquNapYeacuGwEers="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZLu3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmojbA/+JPuxImJ+hhwu4rmfFkuGC2UQjJLdIzRvhVQjs9Ey4LY8TYtb\r\nZxQCHFeL5uL4jBPUOsXq8Qc/GNzEg+W2dZgr/Zw/RcSrsGNoZahhJADa7Mlp\r\nsnwrpukkBjJ7Bozs1wFXKnENeRu5yWkJkEIBw8U5jUHtv7PMGlIoTrG08b5b\r\nxlJvwrapVy3+tFdI+296uV/K0TZ1l0Wp2IrqxIoOCoFMmP8KfuCPQ2QJA3rS\r\nwPOUWkPEEHKg2Q1wB06z5mmT2t8/NJOKi/EGV3lDmcqF6k8ah+kW7CKTYERY\r\nPMNo+3KqmaFxYL6ZbfydZXAQeh+dzKpKGxlU0CpQMAaQX7AX43DaEoWlacWD\r\ngsvDKXeAWquql7VzLO0mMhkOIJQFiMH9bMGTFoheWc5qLLTu3epxoUBkoMO7\r\nnnhH1TIM94e1VP/St4aeHrztXZGO9dBBpTR05qnb/YvETlK8dc3aCHuOVgSK\r\nR8ab9SelzIojx9gJksSRiCbKwAAgKf49sOv8SwWFBuw3uVQAk/wHo0NKTuz0\r\nar6BDyF1nscXZSlfq+x0khWOHaoZMYRd+lFGCIBYCW9U77bT7OYH+0HD+YFV\r\n4ImPLDMA3I9eEDgnOKVLNwYRxT1LyWY9NAKD+PFYuj5APBy5aOXYzck5mQxW\r\nCPioHnUsNeu4t/U/r6hJJyOiip9882upvfc=\r\n=gm5f\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.09c3113.0_1650768823303_0.39038496707066206"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.8f04c47.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.8f04c47.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.20.0","@typescript-eslint/parser":"^5.20.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","jest-circus":"^27.5.1","lint-staged":"^12.4.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.15","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8f04c47ffb21ab71c711706032d556ccd4037dc5","_id":"@kaname-png/revoltx@1.5.0-next.8f04c47.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-L7tKX4jgkVCo9UY9eaCHkyqNnmmIoqcXivhNm56qTSq0nb12pnYx86LG0EVat/zX5lAfy6ByRirSQ+1Zvbe8Aw==","shasum":"510d60035928affac85b2c5d6dc648a0f5142887","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.8f04c47.0.tgz","fileCount":347,"unpackedSize":358255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1e0iNLCEPoa+oEndY77rS9ZRIr23mRrf8NZfDTWAP/wIhAIyhUncs2XLleuNWf6+i47qipSvwxPollgxQuvxxGIsd"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZLy1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpxIw//a+aFvpjytLrvjV5U3FRONASSe267xJXsSlHW/YNzzq/w7EvB\r\nenZMN7erBLDfJ6PNF62Y/JhwH8ohl6Ltu1I+LbURHbqMgHnsyFygVNhHNG5H\r\nBG+MX24ff6l10kHG4nDHu05QiemTQpO7YgfOig5lQ0hXfsF1SAuV3Xbh1uPn\r\nwqdwtep4WjlaeLietqpLcBkESTdvFjXAj/1X8v03EmUUfnD5k1vUeQeIMfJm\r\niWuK8s8EHh/MCMXCsZ/I2zPrPuOzP9i7EX0lXszhN+QXGmT5pTpkTugnK4wv\r\nJzbZAofv2E2qoHNjxEQ3ll8AObuZlUq9QXP4tEqtNkcAr+jwwZfT8jYOBory\r\nzXejDTzlqSNNNUIlTMhwNB8FF1xGEMoGyVmOExbwelrGeXKcUuorhxMNfPT4\r\npp33d+c6/GBG/2UW/FEyrN2SLJ0D6ull5yLrAL6L96jI7xVX+4NJZqp8Xlk3\r\nr97lsyS3W+Fdy7ZSG3fAujiSzwlJEpzm7p8XJ2r4mypUkDiYe/AWDYdlL8Ww\r\nvecAohrVjPIax5+KgL/+ZLugmREupxUBU5Sz/Rmm5rJyXDf8KcramG63Fl5G\r\ndurTNskQQcLqTTrG+TzD65+ijDz2/Zqt8ibS+RdpYd1g7Bl7jRwdORnbC5Kx\r\noUsMEc2gUsICFKrGUB/g2/oReFhaVVFgshA=\r\n=8n6f\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.8f04c47.0_1650769077588_0.17501235493219203"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.1bfa478.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.1bfa478.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.20.0","@typescript-eslint/parser":"^5.20.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.1","jest-circus":"^28.0.1","lint-staged":"^12.4.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.15","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1bfa4780205d6e778304c9d73f5b087d2215195a","_id":"@kaname-png/revoltx@1.5.0-next.1bfa478.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-vPdcf9tj4om/sR4jxP26OA247iKZlOtrUz4qSTO3uyki8P79EP64IPioiYGuPv5hSDbdRVk8rYbGvYIUhyOvzA==","shasum":"b41baadb0cc774e5b0773dc0806f978d3a7145a9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.1bfa478.0.tgz","fileCount":347,"unpackedSize":358255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDtn0fuL2f7neb7MVZQQR4L6bju0/Ho6mPNN5g1UhZRaAiAoyzPpRgJyyfuCzIvGml8k6GvF2RV5O6r0CMX4u00YvA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaL8RACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmodMA/9Hx2A4E3SQ796M7xz7njUDZuJJxhPkXagHsgTLcP+XYslXEI7\r\nicKvfeIsVXtATDVO431XpfWdE3UsOb3oAO41WjQrH+tiR104MqpslAN6V8XV\r\ni6SiCKfnRaR+iAqDEQ+BSvNjsmsjxDvAzfV1rgCkTKYkWHfpRs/RnAeDGHs+\r\nzLw2UbGlFTuBg8PipJFX3kU0oOFWBJq92v7PVIwLMz/GfGkuYuv3yl8rucQW\r\nPML43jHy4bMJG+svqig2Dj/KNmpqjAXfaJPJExdYJqeVCRblAS4469nAWXvg\r\no6IiPcV4xGuo7cJOgvFmzWLu3arXhf4O4h+epez2vDFsMAvgy913lKVoOkWe\r\nIgArj2Ap3QijFZTrFDpZBflai/NkEfMhIgjSzzQPW3f4D0HnMwYokCebFDik\r\neC30gKTvS+g6SL9AWTjk5kOmR+wa0ITE65RIHztI/i/RFhomBv9K4xl5AvpQ\r\nLuYyIiyDb1CAFuWG47fNHvkxBpJHWy3EiXnkCXfXdVfxPAYG3EnPVxMjypaR\r\nvx1GyRP47tTTICYnrYXZiv4Am0amVH1DBAYfVaFawQE9yRTF4u7FLV+zHk1u\r\nGLIJg3WJY/nGkeXTnYCmt8yTu0ykNzDFbKCOPdxUJcC8+q0GG0KH4NbAsHYo\r\n6K8CMgraRs6t4uFu0jVivT7q76HBnAqdxtc=\r\n=euok\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.1bfa478.0_1651031825033_0.9135245290122647"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.929af92.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.929af92.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.2","jest-circus":"^28.0.2","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.16","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"929af92ce12589216536e154340b1fbbb802fea8","_id":"@kaname-png/revoltx@1.5.0-next.929af92.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-EHDN8oKvN9GlGrtHyDeEuL6kOjX6Q/r+2SW1Ia+AAXMLZfKf6VqOU/oSma0v6bZ+x6ZjlnAOi5cL9/IIZQ/r9w==","shasum":"5bd6e9a1eb42362addbbee4271eedc56e4546c45","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.929af92.0.tgz","fileCount":347,"unpackedSize":358255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4PWTrFQJcbi0W4dgMQSPSV6itOqWln8bbyxF2BoWk1wIhAPWZOwkspGfxMJJihhn3N+bj7DSRNkmxg9ZgvJBbt1JK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaV40ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq0cxAAhDcI+O8VH4FE4hsN60l0RHqYaiSnN4VOnnXIDk80jYU/pvd5\r\n+Qp+zJmc6dFCyeSREejKHTpMLusW7eE8eEvq+KanAGyoSi9LjjP/DLnq0GHu\r\nexY2VB2FA5fZOY7Gvd512N/FBX7A7tHbDwW0lKO/uYOOp7xEeThc5312uI5m\r\n0C8fRqa5sZYIH+MRWF0DX8l5Srz5yRZW08dhMADnKIouz1vbPmzNdj5gdAdW\r\nT49l+Zmk5aVn6X8Ws+8E5+HPk61HWJMMvr4ZZR8GcP/OI8bIL7qlFT49DKiD\r\n3yk1JrpfMDTbLcPacLKobwvIrHZNPiAPK24AT4hpZy6t5WVG1Pae5cGGfQtZ\r\nWDTpL4GMefm9FTmDt7YCfQ3oKUVm3AW2Lh5sMaqVquT0ihPHKEJDG3ly/Anq\r\ncTA7ochdDXbcliOY7mM0n2pYYrhUU4f2fUMo9cZbzXk87fsS6IbWJpiLWuzF\r\nXHq1YO37RVygRT3ADnfKj2pWYlrdx2YNs0h0iUJ7DnmoBxIz5SxMBhpnNmWW\r\n1LNJnUT84sEgRnHsgp4BBE/HKG3oMKEBTM7bwhAr+trF/brlLsePyPSqm8hu\r\nXRfCaw8d+PbR4N7IyoCyVIdVLKgvJT3KxXzDgoV6iguXhdtfemGYddACvuvM\r\nmi1+mE4vijfVDRToytXi2+PfHcNu9TXuBTM=\r\n=K4l/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.929af92.0_1651072564683_0.9417129252692094"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.6bc5da9.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.6bc5da9.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.2","jest-circus":"^28.0.2","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.16","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"6bc5da9e8bf03a85df1e8d5297d4767aee1fc902","_id":"@kaname-png/revoltx@1.5.0-next.6bc5da9.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-5WNb0ofqaL1QsS2E+1VZlW9JvPDZ9zmvg25Jty5FmB9djEUQfgAdAPJsLTsn3Z/4IaU7PJMeBilbC10c4jUp7Q==","shasum":"cfd058a0ef04fc2be5ffdb98cf4ea2a270d15522","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.6bc5da9.0.tgz","fileCount":347,"unpackedSize":358255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFtpal4sDjDbRDXwmuXDVG/44FQ17lv6ixJKmNfb4p7wIhAPhWyVQFuxyX92UJjGiLwNv27Dyvk/vIiQk5jK/G/A9c"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaV5hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7fRAAlE9Ln09KXapljMuArN4abVcI9XhFWIaiVfEJF5GpGLnca1K+\r\nAEk9JKr7QvpQsWXJl0Omh/NDqXlHPxLcBwW2XHWKARmy+LOWTTfDv10s0g5G\r\nXF+Vn9Sd/3g5vuRHwgYmeUgzlrPM0Nye3eW49A3fhoivMVnZY/c5cA1MSZGW\r\nnmcmItmeGKkRUR7CneHINWxDHwEg/vL+5xXZJpapaGXwkglwy9G4Ncg4P0Mv\r\nRg1S3Uu6NLcKBaGzyhFqaru93TlU6mK7ej//TzTbG/D0Pf2d+imUyk9gdsQl\r\njCpc1SGJRR9FTkBFqtfiBVRRRbbV44cY+9BOTpdD7nWCohwOa5sn7iObuh8G\r\n1Zby6DOrjd13r6lcQlmxDyL+zDI0Plwj3k1+UpAmhhGCbaON6To9vfeslLHt\r\nVtcC/ghgULVzhHAMBWEBwn5naBQMQtxJ2cWmjq9LkLPg8EW3M7xK+BKCraP5\r\nu926+dXi1P/kopBTTm/8N+dCeXIYxrAOUNBayoEXr4TxnLlwAQRjdRWtJOwC\r\n3rHorPLfMlY72e0xkJv/OLbil/oasI6p59NE+9mai3RGGS10tURZbOIOg/Mv\r\nIcvPpzjWJotcE/R0KJdaVsNOKtWCiULDy7bbTr/S1tFjPxSU6/KJUu1Si2J6\r\nVDyeMS3hJoprcoyzoewCjEDkZv8Os2i3huE=\r\n=zQpX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.6bc5da9.0_1651072609168_0.6976191042485342"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.56167f1.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.56167f1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.2","jest-circus":"^28.0.2","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.16","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"56167f187d2d2f208a6bb3df2bad7498afb97bc1","_id":"@kaname-png/revoltx@1.5.0-next.56167f1.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-cY4Gud85tL5FpOnjxEdhDiPKlf4jcnX7M5AsfkmDt28NLtk/pZIXPh4lYWTyaAg343dayxkNBap3JW3B4R2vpA==","shasum":"67008bb195be2c510babbd27d909ed9c8d136bea","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.56167f1.0.tgz","fileCount":347,"unpackedSize":358255,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqJ4x810SKtngGxcfOKGtJ6LZ/qb+YQ2Mkx7zhPRDBWwIhALgkARp+8kGqerU/muphTCRbGg9P2HxCx7MmVDF4iSVq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibBywACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpplA//YIIg8p3l4+Ih1VGf8pf+Flpa7g0ZxIQJ37nVp8sjWPAde3tv\r\nAH/cEaPzm8yj4QtBlVY1HAwDLSrL5e57z8yfLan1815OkGV6XQEQdQqX0gyj\r\ntvx59I19Re5R8m2yIErPw/nW8BEo/02suIn5U3xm9coW5QqiS3Y/fU3SdhBp\r\niZlkJYF8Hn5hIGQVlx77OtQgnpakOxD63DkFOTyZ2ZtpBGd5c+GQWUH/Iz/S\r\nA/4vMI+uh3vUcDYQeHw4Iw6Lp1rE4vKVX7nKquWqrD8jpbChAc5GaQGCSU/a\r\n3Zs30hL7HI+FZpHUBplgFzC8r80VhOqFoT02HA59uQgMMFcjiOsSORJfIgza\r\nZE6xxYTsh6C36OlKXt/VX3cGhvcPwBelq42j8ahJKKnF42tbOoBjlraBm7z6\r\nBCSBZ4QGEByH9Ozvw9eKg2sICe2kRrEBAJruuItJ0Lvmn2kmJApdWjukoWEs\r\nHc8K22vlogMd6uTtimNhdVVql/AE+YsKQI5mrUdZVKcoMbh9jg/g4/7JfdJU\r\nnJ55uM3TOr0qJKWCWE5+9ZG2FbTMJkwZGw3UeHlOskR5MEpGOzxj4Tt/8A0e\r\nWwdrUyjsoq1vQWTQSVX1ogwAFpOtYls9z7q/iwVM+0cU+uaPkKi3swz6qwmj\r\nUAfohV97dEfr8LAHF3shCYxawsAuRnuXa0o=\r\n=mNln\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.56167f1.0_1651252400546_0.0985385642152361"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.d186901.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.d186901.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"^27.1.4","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d1869015a19ce329fdf9621d3dd81120e3b21013","_id":"@kaname-png/revoltx@1.5.0-next.d186901.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-4v/G5zD+x7tE/VYOOiQ16Cri36xlKp8yFHXbQ71wa1Iq5Pg0TTOgYOP9XHjAGuL9eKogCbe+8NkbdYye9fReiQ==","shasum":"40633f439beedc8b11f384baca618d84cd636d06","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.d186901.0.tgz","fileCount":347,"unpackedSize":358197,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGwkZ6Ks1vjyJcpF+qGi8WWuA/UY9Xh9Q0thur9IBeJ/AiBf8W3shcmVwTUPhlTp+fK6o798nsRIHcU5wuo+jzJKDg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibB9jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVSw/9EzrCLUNkddG4koJX+3+LhdA0vwjlO60XQ/TYI8CyhGZWNImz\r\nurMXnQPylnQqX8hlZL/kbuG92LQnrNT88TuMAvsMPPXkeiKuog0ujcSPR5XJ\r\nG4JFYZyZLiPMVrT1WeAtRkTthCC/pU0fUDzrbUEjHhGsf9UKkaYOLpmprD4N\r\njkDg5N2LpTNJnvzVmn/zWW3CpzSeulARon7+EX/Q4j6NN7SIg/TrtGvxw4Ec\r\nsggWyDhaJ/vDDjpInwyrghwd4Lyh3OSfPJKfmyLI0LsmYLi2kjOIz3mfoKU6\r\n+1QzPH/TpJuzPkSOEcgLaQHdPvYQtiI0o1bq1x7ERQnnMtR0fTUAJ9DdmzsL\r\n1rDFldi4Y23lgInJPdWIMrV+YDIAMSYTRr/xQ/L4OcpW2Hsy4M+O5TLDRKgU\r\nhoxS//1w8CPmf3cMHv8ON9ECuoEiGgD5Ynk7owuEFnBBk+AqcE5aM3b7CZrZ\r\nuXjic+Ylu34O2TAHcahuxMFJJJIt+qAK5Zs7fLm1NXnjRZ6p4f7HmWDRUNNx\r\nBD41HZd5lVkjfT6K1sg0Rrk4y6mSe22/HRPTYOc7vQ1E9xApND2isw4KEHPI\r\nGELo2u+McENxJcXllUziWT3mEaNt7W2uKVD2VXdxab2u1NLSgBrbRuHICpNr\r\nEcMYiOFQlPCVjgEw5prOLyHvZgsSgXCJHhA=\r\n=3vYA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.d186901.0_1651253090894_0.7080993047559594"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.842dda8.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.842dda8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.25","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"next","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"842dda8470ffd92bf2a31759bcab84d1361957cd","_id":"@kaname-png/revoltx@1.5.0-next.842dda8.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-0qiT+04YKuj+v9kx6V44wqjN9CQWMMeM20gqt5Qmob4qnkM1Qm65HGk5a1tdnt+6v7HqD64M0q53KrzUNv9+9A==","shasum":"892340dbf4742843f1a5d9f1b9807e67c6e0afd8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.842dda8.0.tgz","fileCount":347,"unpackedSize":358194,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCr695myS8iwBcS/3+CWINxG2QLO8DHEbkS/3ouEH2BKAIhAMr191eTTKsMFFFnlg6R4ZUa1DLgUVFCLrvKAFF/MABg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibClZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHKg/+LpTr0FEQnnARRC1LAvjNeUIMikpmtSqDAPlpTknMIvIzlut5\r\nxZKPmuo33Qcgj/sYM9jQM1kpZtTEfjOjutP3sB5vdUmdpHYu0VY8VGA8LVof\r\nzfK7nJRKYErVWRG2nSUKMoMYrWLyPK1KTYOS/xba+U32Uv3Ik3FT3R0yNABS\r\n/tq7YNTYAm+ouaMLsGc1maQb5/C1NSXq7UUn7sfWtgYxiSyizSxZrzo53ECa\r\n09jGlFFQi9s15vsSyfILPhUobT154xtRdPq3OKiL8ETwaDamDdTgnElok3Bs\r\nEWUZgruMhaVtXkK0yaQVD7wYOyjwCo/jKtCnhZOHzv9Vxfob+HXjfOu5FnTn\r\niD1BapkOax63F216Qu+P0XtvDUZv1nwSfBjT+J3CSVv1QZiFoeednVGCOUjd\r\nqW/f0QxGY8gt0dEyvLF5MvktJy3mp4enUYpHRNpyQGLj6q/4Xlo5It3vwRbZ\r\nqlIPwEBZ6R+3l++LlDD9dBxVMBONyusRi73O1SxzBRMlIq7w9teCvvjQMFrF\r\nfHN/9Di51E0QxqL7HB9RwiSfOyd/StuQaKCwcaXwDyIUS2Vy1ahurVPVhG9H\r\n4csCKHDvl3dVOIOy3Ma4AkIJ//3ClMZOJuHWzLJCk8mTyzoH6l4kdTr/+lZg\r\nWzYbk+rtVLO3YKNsZhXaKjQBgddJedtu8oo=\r\n=N8Zq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.842dda8.0_1651255641422_0.1558190307551277"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.61209d4.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.61209d4.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"61209d449f5caadc65f5b27bf07d430d20ab9665","_id":"@kaname-png/revoltx@1.5.0-next.61209d4.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-KG2jhJNPulSA2M3ca4G2H55ruC+q89UVOJdXFL5AtNXczcT0GvebGuOzvoz9fw45F3Czxxx9j2SCjtrlcHQbBQ==","shasum":"dbe9b838228a8c2d5610560b4762b4ad2e6f40d7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.61209d4.0.tgz","fileCount":347,"unpackedSize":358204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGk4dvHgGFrbO/A9IoODAFT+ktiu31/8FLcW65n2Fx7/AiByoPOIfF+IQS++RcUzsZ9nDO2bUNovr4/CsnLrreC6eA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibCnEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrQgw//Vb/3oR58bMlHzVxIHL2WO5Q6DkYzEdoLFAzmnaolb0zqnt59\r\nN1TcQ5PkLrrGXU4LOm5uPtDVu9heF06ZXGU4w+c1yK//MDOjjoqN4Vdgo0U2\r\nMzSiU15IIoPQfsjidNCBd3usHj0/zh3lSr0pf2HYTHC7zox/Tf3DZNaC5ueI\r\nStmJaf7TYdeulCQ7anchvrUPU+tBgiKk94bOxQUx8jaICVHpTkZ5l2qd6mF0\r\nRDfLbyPw5ttvYGU+DeK2YFQh+ZfCl11NFNKaac7Tte6K1XUarP0CY81Vqhnq\r\nfCUkY5nt0dniwDhaV1xoHrc4uGNZ1pIhb0CCTKqEG0aLuMwxDJ2S1AvSXD6U\r\nLZXVSQkMLOrDM+q5R7f2qOWm+H8VlpktY4/D+U4lEcrCG6SpScN7qFE64Wmq\r\nKTKTO1P1jJOPc5pvtpeyMNKbciH+64kDylBI29rmYx9Y/EIw7ymBRGyB2laq\r\nFR7ItCslnEdWZoy50guVrApNHaTODIz2nnLdeBeAT9f56YRY3W0oAWs4hh8j\r\n9kHUDM2wMpn0Ft8FMC0WRR3sgiLl3CqqyPn10JoNpugNkOxRHiH3Zrk0IoXK\r\noGDWPldqhkn/lVgtAbEGhqMTFFEJ6D3VPe7tFYn/a6e9W/anNjHR4y2iJJC/\r\nBB72S1tF4ar6L/0LQzHq3OeznuGj3cBmkZs=\r\n=gUGk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.61209d4.0_1651255748228_0.23421575110391402"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.9d6b837.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.9d6b837.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"9d6b837c013d7d5f9964e55136527057214b4f30","_id":"@kaname-png/revoltx@1.5.0-next.9d6b837.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-OPRAx5chpGcsmnZJ23h82y9mQmez27hsSV/gNHhdDo6PgZIuWMEHPjnjCIkzm4e2PrW4N3yPboVXgV8vKdGNuQ==","shasum":"e34043a8687237b4e01dc7800fa4adc6380c30b5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.9d6b837.0.tgz","fileCount":347,"unpackedSize":349557,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEfBeZrzE9Y7BX/saLK9JHvNAdpEKJiZNkJPPlvDO50sAiAXM943BFdNub9dTS/FGrS43OUdDT5EDB1kH8qcoZXmHg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibDBNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGag/+LENjqv+YZXaNA2XyRXc0TVmKE1l1PR/DSxt4te1G9BCrExzV\r\nwtqEgTJwTkPIvwxQq9iI5CblxIh2f3GSJcIhM5zhGWTFevKbQS2nGZn6yunu\r\nuISONgsKntDMCRt7myJgR2It+kB5v3ex0Ac2ninkJswvkBb5KhUGKh8o1G8c\r\nQkIQwAVsiL32PExz+85ZgUt69LfMm2AHBWD0EX1M/6r66ilw2KOuSHOrzxq0\r\nKi4n0Rhexhy/ywYoB7RpHSdqdM5YAGm7LrzfPtcDrsAo1+DoeydfysvZAvJh\r\ns0wcKli3d8Vm8nYPi0ZhQFBw8av6VBUSyH39v1JK/5R1td34Af2CW2Ye9SkW\r\nPL5b4GEGXOz5NsvO04DemQ+l4i8LfpdTlF+ywEPYhWYU2t3cwycY9kKOjqE2\r\n9bfg/kUxusjl6/ycDoKCV2pi/hgwnlfl9GB9qA3/WOhm9iBcz47b0thY2B7p\r\n4kT06Kj5pwEhtgXu9W2bIEl/pKGBFkBRdjH1p/FDX+A+zZvyXsUUSMxIndqN\r\nlUoBzRv0U8gq0g85wYiCycdp4PALoobZbGHYmkqo1d5GhRucXtVFB9kdF3ZG\r\nH1Lajbx/tNctygzn/2vhdkknVONQyxoVqhXeS0C4fhnUFd2z//6iVpRcCQ5h\r\nQTSt0vdSb0/qmSxSRwhjrQ4cv3+YQaed7pg=\r\n=dUz/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.9d6b837.0_1651257421016_0.6700116123419724"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.cda13a6.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.cda13a6.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"cda13a665d71615af630c246ebabb2d5079a1d1f","_id":"@kaname-png/revoltx@1.5.0-next.cda13a6.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-t1lSPsKUKyrfptVhLm8qKSfz5YryCGcI+7Gcp+IX2X9Apg/PEbhpqAnZoS5jVQi5cOscOpchimwDH009zPunZQ==","shasum":"26c692785849d00e741a7954f4a4eb57e7cc8769","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.cda13a6.0.tgz","fileCount":347,"unpackedSize":349783,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICG/1aClF2IN7GicOBrQifp6vrDFM+Qa7DFDiUEDQ4MMAiEA1WJrc1VfWwbVK6DB3xyNplaoCc4pdMetqsoudFbzEGA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibHgzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo3cA//cz7oZoeKMThEiRyAMB3lbcgndqcLkBoe25g6Pt8nAySOQr2e\r\nXRJLHgcm+Fjb676038WWB6hXdd4HpK/PrHH3ZHxtYzp9YdG5W1MKs10+X4/2\r\nyuAstSUfgbgOiE5eeQZxoBSlIQDbgZ7DONp9FqtNwdBQckXVuvmU2mZdmG9S\r\nKKgZR/WL3TVXy4xCLQuikw8gDDhDYs8czvx2Q8P3qNOfA7SgwNixO74HetWC\r\nbrdB1ow2v1i4MHtLKtozXi1nmLktsYX0YUIwUoiBvbjkMnKj+RVvcUYRGTU7\r\nLHuk05EpjEGdkcdDWvb6DYo9fFhqhpDlaTjs7a8wfa8GWbOE2g5Dgyd6rJ+h\r\n9xFgbWllmDsOUUt598Wf2YZYLa8nGdfu5dKLvXjGTlI6MJBibGWfogQ+LJRi\r\nw4RRtjl1JeUgPZGsoIrDRvFfgHgg3pPvbSSkR8MPNKt3R8+Zo76MpxvX9JK8\r\nyFc3dC/Lh7lkmKoSYQMRHhhd3UhpLNti3ozddQdq5trC6QBLVTrCCAlIgtlW\r\ndQ2GwQxrk4oDL5UsYuoRNjbOmRyWaiHbIf9WCB6kbAvvQu0mJYLAumAjN6zk\r\nAZxrxWcyzouS5yB4UXMtydzrUzsd4dPVq8UpiPDqf3MR8TixlWllmSUdLWJd\r\nJ2HzHhejuHW+XIC77f2/7Dz8i/idMNoeyyc=\r\n=jIsX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.cda13a6.0_1651275827506_0.9227201400224034"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.93d9b7e.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.93d9b7e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.21","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"93d9b7e66043435f55ae904e6a8f2a1f2b2fe208","_id":"@kaname-png/revoltx@1.5.0-next.93d9b7e.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-FJK8VKhQCxZpDCj8KwZWl36M7PexfDQh8xmphORTwXXeQU/0XzO/JA01o4LzroAtjHShXFJAocgR7a/azhsXxQ==","shasum":"b1a7b2b8f9d4ed82ef360817b22afc7b30da8641","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.93d9b7e.0.tgz","fileCount":347,"unpackedSize":349711,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8nV3sUxqxdSzXMMk0vydKVE03cAZOzCGamLg26WFXZgIhAOIRvSCCHUytv0gCRjp72D+JWZjylWegdlQ/+1Y4CGMA"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibIOIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrxiA/+LOiIi6GLKwXzabapkX6d+SxVpLUPCSUZ/jdV9iNDXEZL2eJw\r\nJfpWoUb9O4UgX2YoMtDTI9J/rcN6nxvPDeNtF2A5f6nIc3SNrBkIhdD/6bUx\r\nabyKaIHqLwnCpx8kWOu/XbHZy9LT4bu/eB+JT+3GHf/S4kItX6wwt4RV26xq\r\n1DQrdY5kZ74hKgg5AFW0LQeOhvuya4fveTIlDMm7IaDXOtwRAV4MZQfqDnnC\r\n4YgLOJwUekBEcKfr7JvpqU8D7XrbbHrKVyjx+F0SaMEuNXTM+pIBeILl0VXM\r\n9PjNhCxbImuE8LQGcxeKz7CcoSpRiEfWk9QFKt+bgbZHjl7BtmKEGiXZtDEA\r\nsIW6l4HvgKVVHbGrjq7oYhypgPuSFpa64b3jhT9/RLQ0GcKGoVl596E7LBgi\r\nCqMWFi0Q0jDvC8+HblagdS0fioN3tNbWBRCui+GyjQhbRhODW5DAVvX6I/U/\r\npXujqxk+29bYSlQwbMfwLeEA8jGAPRDoh1mZ+jtagqgeSo5u+etLlxtFlZ7s\r\nPYMMzHz1JKfwBe8AccXG0jXb8vbFizunrtR1nADn3g59guWfU5UruzvDG2uz\r\nHI59Rm+R9GX8T4d0cyYDYNndDGVmYE1O/xQmNndwyMu5qg+9upNaUxwb5OmM\r\nrYgAiYTPWHwqj3JU6wg4429LNSEbo0fhLYk=\r\n=taM5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.93d9b7e.0_1651278728159_0.022082704487961013"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.24360d1.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.24360d1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"6.0.0-rc.20","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"24360d1cf58f1501e7759c95d497a19b6562d7c2","_id":"@kaname-png/revoltx@1.5.0-next.24360d1.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-fqIYn/aPo+pEK/MgGAjYrBU9Mj2vvq7XODnl0ZAV9PGw6Iay4zFjIparllhGIYkLAtuNOT2DokYXvwHiHgLhGQ==","shasum":"d53e130955d3c48da8b451306a043949946d0591","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.24360d1.0.tgz","fileCount":347,"unpackedSize":349710,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0MgKdo+Grv+Xptb4mdtWsY+5go+YdFxzKYAFXjCxo9QIgS1chtYrGx33J5cALo8PxC85Pp8UcKXqbHvDLceP0iws="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibIXXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrXaRAAkaOFDxDpk8N6aypFnc7CnRXee5bgXKfmzQ5aJidhnurZiPEl\r\nMXHZ1R62aJXZaNy/HwzDq4IRwK8kAhx1hAukC+m3BoX2T05fs3guQmSMlZEJ\r\ncKwGvecAdqh86DRXLRMJz8gVDdi9+oi7uGIZHJyWRbMETVtOa+2VfIQ3lQn3\r\nSkHfcEt2JPgGe3L+7hWf9qeipJDNS39a661kXV4r0h6GWyDBmv9DC0CC1QwN\r\nFiGwbXhYwu7kUTMueMx1mH7wkNIDG9WQw3ooAhqQn8zJtvdHJS47WJz8ZdSg\r\nNcKK4xgrvFUZ40AgfgWfyBl3ruOoxNyMztGCehGV8kFogliF6+0KlosOXDve\r\nrE3sVZvmRzcajeol7LctzQ4YNnhQU+tLJM41f8HLaZ990ic9KCIgOkgbAaWC\r\nrI0BIIBnIUGjUbgrdbuhYXA008vtrUz0g2FGF249TVijsjg7oDrptTBp+3eD\r\nbWO0qSDMQmHmJfEf7FGjxFrcQ8SfdckKv1k+GhHjPyWAXKYe6PX5fpWHwzmE\r\nouNmc4wKM3DowyUL7A27H//cG8fBsMbYePydKTw0aIWMDjRAaw//LhB/M/CL\r\nSmyxP0FQ9SQoDnEiSD/80Ba9k/JfOfUg6BI6Jza1LWcTIIKf1wVluISrkfMi\r\n9VP2p28BbNMvh3/MyGs+VPB5amIKnLYqZTw=\r\n=khim\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.24360d1.0_1651279319696_0.9763367358241231"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.94d8149.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.94d8149.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, { event: ClientEvents.MessageCreate /* More listener optional options*/ });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'ServerOwner' });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext) {\n\t\tsuper(context, { name: 'NSFW' });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments and listeners.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"94d8149f84c0c5f08b9037da74d7fb55619284f5","_id":"@kaname-png/revoltx@1.5.0-next.94d8149.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-h/Oeni6qyO9vDUHjgt1KggGQEE4SPVxSNTR3wqnQ7XW2BZrEzBBQ0AA0VIC2tBeYmSlFfrG4GdYL5J/Ffslo4w==","shasum":"2ca9c606726c7d6b103b037f78c6ce4aea48e659","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.94d8149.0.tgz","fileCount":347,"unpackedSize":349711,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG6zJyKOsyvl88F3+A/uTprNsoZARijrgCLNSx6aURPCAiEAmQSIHz1oiKsJpxhb0TL7xWgAQwCcMW1IslIBv6MQYFU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibbOBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpATg/8C/5ODsC6NkvnnZMWX89y3jRx/e4hqfZIaoJIV76MC96VbtDk\r\njRP4wPLXGepdLAzuEw5GvhqK+Lti3vqyDThRDlCL80odlWaWG6ClM1xMhcND\r\nWwpVavCXIAVCSywiPYW/F/dVZWaMUOh8sNHsMRsMNjOVS8FcnJQ7lA8BdxJR\r\nZ8DFxQFn7EQ2QMEj0DNYF6DvWkZiTtNzwOXz/z8MUDQ3midsc0h5lBS0+GBV\r\nkdZ3OKOmzxerJiaXDH+aR4ObKFbRn/tN3JMgHo9d2FB3+BPENiTE53s3wYTB\r\nHUWDlJi6Lie96NEexbsdOLzHXA1U9IWem+8qymyLRaVKzeUNcf1cAX3y5P/K\r\n+QYHdH841SQDkGuCbL80COEQo+31rU7TlPX7GYB2tDM+4FoZvsSTxxmXr3QM\r\n8va7vzt0epjEKlwJ2/JSGhIkbZfti2A/6lBHJ7i+C1z7C2Fz6KkukXScvTNv\r\nxpanVkOzD8HQWEzjMcrSGVMD69kW8TpPvOAjaQKraAd0sun9zPB8KLxj+j2S\r\nKsHNP3ULiok95PhvKaeJnOqsbhlH80KBBAsfa3vrzZ5Zj6eANwTli1T7KehJ\r\n0LKxy+FhLf1eOXCOFBEWc/i+2yCy+HOiYNd2fmdb44YmuRJJyP8sswIpm9i3\r\n1rai95v0/wj+X5rvuatO76F7HBndNJr+mEY=\r\n=ikZL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.94d8149.0_1651356544851_0.9691715324523458"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.e476b63.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.e476b63.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                   ...options\n                   /* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, { \n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* More listener optional options*/\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context) {\n\t\tsuper(context, {\n\t\t\t/*optional commands options*/\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e476b63ec270bb5227103ef481b1583cc6a18752","_id":"@kaname-png/revoltx@1.5.0-next.e476b63.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-pPSUrU2nOSPRW2O9cDYUjX5G+3NrLjH8uVj8oG1I6vudnsMTvnXW0CLP2hP8Aa9U0EUOSDPNcLv+93ABcTte4g==","shasum":"f62c2134c7390580341739ce3855ef77c19a38e2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.e476b63.0.tgz","fileCount":347,"unpackedSize":350162,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcYmJCdM7aWOw8akZxn5VcpbhsukZQnAtJ+J8MVon5nAIhAIHwu78Q5RxeXT2WZ/KUV4DjLozvNO0JX0XLAstISpAv"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibtgoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/RBAAgsX52ambgkTr8gtiyx4cGtqQaT/VG6w0DbHO5UKeo2VUJ4N2\r\nu1LsM0tXIHvetljWJ2LL5nwS8mrvMh1A3SZGkXY8x48ugOJFQN5gZ3p3RCbT\r\n5wTsun6+MHuG2zyuH4EnZWWOn1uiPAIXjSB9cW4LxYqKE/viqt7vCfepxGqL\r\nakA0pPSiQz/ARnJ51AQuoHjaFOQUxzCQgqRJwu4DXChJKNH+7iw6MI+EJ9er\r\nSYgr/B2d+CmJ3eWHfRXIKQDxK0VwYDCvln5YNjMyQIKUXhYGRXON7dFOXd0W\r\n/mW0HYk5ZKTyDTzGf2Bz0N9AHk/kxmcZQ6KPU+HKjlozikSq0KgXFJIJH8aX\r\nCF/ELt90MMQZ/GjnFDPGII4QvHllFarlfWVz74fwsJ7b1N3yrvYgiL7CuCBN\r\nfTKXnSiL5upZO3I2i6j5HDWk71h1J2u9T8fX2HJli20O78M/t0kVkoTwRfD8\r\njyneylDIIJVFVq8lQztwmsy1AFKuzfNP6pvrz5dNVJUgAnSt56St4Rba3baQ\r\nif6ctdWPsBISr8AJ6N4qKM61W+ki/BnbO7eXNqNtLwMXTYvY6VSthsj3Wsjk\r\novf15trlCwg2uHLYUKPF2ecEBok8uuMA5ha2xJJV8e+Bta3n5CaUQTLGZ9hB\r\nPpEp2DSMme1ESsMBwRHR/pT6kbGv+tvsX3w=\r\n=nyIR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.e476b63.0_1651431464770_0.6079401788582863"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.61ab69f.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.61ab69f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                   ...options\n                   /* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, { \n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class CoreArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class CorePrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommands extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"61ab69f90c84dc91ff32bd7a1b9643cafc48e475","_id":"@kaname-png/revoltx@1.5.0-next.61ab69f.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-lGyd7khqMfEuWWBrwkqrP5H/hAQtKvJuOMUhLuOek4yDNkSEIFtd9Ijp4mKowXZQTxJeHQSgEdpJwtfFEOSuxA==","shasum":"8fe3f6560c9fb88e0afca575df6dc758e2a2b726","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.61ab69f.0.tgz","fileCount":347,"unpackedSize":350407,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDTv4SlgqirsutTHCmzQvMufLPXYuQ+2yNy8ANWNRdiHAiBCRp1KAFS+rVXBhpF0HsVtkqmuXlex8R4gfkseRwVWrg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibtj1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqKSw/9HnI9BodDsauQWjG336B0+wwUEqeNmqs4zbkiDaJir7sTPnn5\r\nVVwPnXwn/v0klWRzpn02hAKyto05UpVyyKltlT+dlWJ7M5aJWeMXF+tGScjR\r\nOk7mvxJJ9QND8E2GZqp8wfUgc5GMjEFtfidYKCou/N4gKHa2exEEb5zYllSu\r\nB3D9ZKWV45fJjbTSz1mwvUguNoKoCi8HuDPper2ZLBRJh+YzzCJOVs3x9hx6\r\nMNejm07hT4/mJ6KEnNDnkf0DDJAeI5oxL4diiJ1ZKcrI8RHamGJftPOu95oR\r\nNYsPDO/r8bRZHO9CMVA+LG9EiEk/ge0ktYW8JywINGLvFVr2viK4fY/1jWoM\r\nxp1/lVAqFhwnA0luBMEiUGKG1RTTKZYDKytDBCuwYmJKgdVC77xoNjNyBENz\r\nDdqGzrjw5ApUkv7C/e6VVilXoLhPVQN+mwzjFf4+lFjtDY2tGa62eVS3Zhqr\r\nAnd4vMXKx8R4iKwHsmxtBAyX7hD+LJbUiHI+Y4nQsvLtBNQoRqpckIszD19r\r\nLg0gvfxD/W96yFJ+vjyiYk7cGIvc/w8n9iEFYd0nwh0VsJsJrWBnTDwDEIqg\r\ntlJ3W/ZAwMH3R8qwl1nedIhdIig4N7cXiYO0rUleRtFl3F/nKAu5wjkOmrs7\r\nlRFrYnQOwmZKyIenTOSw4TpBmgVOmfVfQZ4=\r\n=4jpV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.61ab69f.0_1651431669621_0.9481902660410477"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.2b397f4.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.2b397f4.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.4.1","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.0-next.3","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                   ...options\n                   /* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, { \n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"2b397f46550e25e5e66519fb6371adc3b1ca8638","_id":"@kaname-png/revoltx@1.5.0-next.2b397f4.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-l26c9itJTCqlxpVRYp5eJr2BA0IbUQl/PFfakp8Vc221tSWYqg3k4spLg74Qu98BrjbHapYBkAabv//ofIsCpQ==","shasum":"754c96d2a8cd35bc96f5d05e99ea43de0fdecfb2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.2b397f4.0.tgz","fileCount":347,"unpackedSize":350411,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF8r2nxc4k3TPAu4W8s+Q9G5+4jCqs9doUEaAvVIWFYRAiEA46OgXUzAfr0rowNNX2AeX3JhbQXR0N6pOj05gMWSl6c="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJibtntACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonGBAAjzEdWenX2O/asbB1HvSYjcYodBnhBkRjDdJuIdFoW8iEcIY0\r\nKtMCoNZJYGATly6MgPA0WywCm/d0U9erv+2uXz7+XbXIECeQ83rYZFoL9LSl\r\nKqrbSntZQpxgHqwbopp+5B17tOT3/C/VyTdlJVn/dO4+cT6oQA67oeYJPdhE\r\nTw0V5zUkN0cHMKeEWg3bnm6V2f2wa/pIoXssBFBM2arlDOJHO2Gw7fYxm3B3\r\n6vFWhIJLnecPCYZ5j7zTe6Y1kQa4G/PK9HixMFo8hJpXzC9BCSAP+e6pdKPI\r\nB4nAeO/NlpWGHuwz0WQb+Zba+7P/Ge/KukgrRZKL+QFqA8ycjbn7kSDiIXHK\r\n6+GHh0KLfpcb0ZBuEYfrDdOhctn58iZtvLDkaEDJOMRyuOin9i9axWhQANYy\r\nTrpHlD5ukjkYrw3z0b9muyPacRjvsw/VLD3zlkG3DBDM0+eF2kEfaEYpW8I3\r\nu6u3Inkt/YzDsmp6akXY3+0+XXSEtHb8mlfyXqDBVK8h3nYz+3ErOiM5huZs\r\nG42EweBtdsdYq7dfI8evo6MNvf97AkqW3v12TYR1IzjCWDkLKAaQhS4sA+Hj\r\n3xp+J74AAmBkK5EIBGNDi+Oix6JstdNZzm5g08h6rf6zWCURbu1XRmMjSAFJ\r\nUVolTuEpvnWK4+/+Q3DeY9ayndzl3u/NLu4=\r\n=1FUY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.2b397f4.0_1651431917624_0.8766869258171368"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.e65fdcb.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.e65fdcb.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.0.3","jest-circus":"^28.0.3","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                   ...options\n                   /* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, { \n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e65fdcb9ce6cd56a34e93b42e22c9cb34b5a55a6","_id":"@kaname-png/revoltx@1.5.0-next.e65fdcb.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-rt60QqeZhtx102Ty68C1Qn/Z+2vB/3vCrqIF3NJQmuO4DaEML9f0MCX5hMRwt7Ez2j+4yqkh+A5pOsxeEUclxw==","shasum":"2aae0a06ac0e564a95df1eb1c0c0da2fa7989950","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.e65fdcb.0.tgz","fileCount":347,"unpackedSize":350404,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb5yEZkI9GdjHWVR2LqGcbpkTIF1wMGPUlzzwHMHWUqQIhAIZzTWKU4RVVHWQMl2q/c48mTkk8Ko2/Y5wHg+0LK+eu"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJicrkiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrGbBAAoHv7qdWs9iFSqw33CSvXqSne9alRmr4g32Dwm/c6eh8hx4v8\r\nGLuIU4OUJY79IE5vHrHqoKDhJQbQ4irB5EgJD1RS9fZmj2GJnlfTNtdqeVFf\r\nXNLPn0FFWRNkgKnOPArRN6rt7ExlsxlxZxHm/tITRskk7vU4X2QU9OYd76iH\r\nlIV215qyxIg1LSwmIWIlo2US3cRj4kobZs9WNUn2eDrTTgWFtJNpJZLJg5LN\r\nsDeRJrdf4sMESN+2X9U42sIk1JmprXSoHcxzsqdtLjYADSRONvnLS7jSxKCr\r\nOSZmZnSm6yNL140n7JaBHpEuD+3RLIUd9R1qb3g2yop7ZArAl5bR5LmqpPsF\r\nZTq3yrUrLUZ+pjewuLUvX5aGCNzQpuRLPtTPhbTU+rUWC5KK3DR/m+tkAJjW\r\nKTHDnfymZWZ26Z53JYqpKsGxGuWDCVH89LVvRIggvv2gBuHTYvUP9rzVVnwX\r\nDeDHvCHoghq5FQ64RMf9KFVvTw1TnZD2Bax8MAEYC5CHnSvuZ8D6baIKIxrs\r\n8h/JmBvXwlsGKrDlRiMojmMBoCKMIVnKHWPM6p0xe1S/+XJhsbd+H+WhaN5G\r\nEVV8x99yebtLSYr+CuCuOiKWRflJ108CxtZWo7Kb52yzhVGjPzQ9ZCSXJ0Ry\r\nfLspcE0V9sA6aI4rimiA5gwaI4jXvl09RZ8=\r\n=Jeh0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.e65fdcb.0_1651685666681_0.15651255250868146"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.d7e85ad.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.d7e85ad.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.30","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0-rc.24","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Bots for Revolt powered by @sapphire/framework.**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n\n# 🔎 Introduction\n\nRevoltX is a framework for creating Revolt bots, powered by the @sapphire/framework Arguments and Preconditions system.\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───client.js\n```\n\nIf you want to change the path of the client instance, for example, to be inside a directory called `lib`, you can do the following.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!', baseDirectory: join(fileURLToPath(import.meta.url), '..', '..') });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───lib\n    └───client.js\n```\n\nAnd so, you can choose the place you want.\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                   ...options\n                   /* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, { \n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n                  ...options\n                  /* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d7e85ad7729f902bbe15d094316951be0d6cef30","_id":"@kaname-png/revoltx@1.5.0-next.d7e85ad.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-dXhrMShNU7BQFHPPtm2YriVmhmsWehkBvd0ygclatWO15LB14NKJKjnWB5CTAzRIGa2EPIxA+2Vnvb242WI97g==","shasum":"9978a9e1281c6c8ac8e33070315351767bcdf8ba","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.d7e85ad.0.tgz","fileCount":347,"unpackedSize":350404,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2oTTszVNhuE3869fJU7DQE0e1VmZ/Hj89/W/ABNtZegIhANl/cnbu6LNks9JNhOFgGMF8/sFE3tDjxelQnV5UXTbf"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidXxOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxORAAg3bTLS7EQdcpbuyUk0BSuYXbSbLGx7D5u5ImjvhVJ09p3B90\r\nmG9nAmKMsygdhCnq2124gRWyrsqTn9+PJoZJ0SjdxXPXriKRYihiujOPVcdx\r\nQHfljmiLcia7MW6aaz/EZctA/oTLL9rny8c/DbK/VfnulHwKaHskpbWIQjo0\r\n5ANCK3rHRB+D5qzpd1fcev9mdLSqNOoHVeMRXnPi4eVKqT/rPCdvuf/4hXbO\r\ncjD/jSgH424WwRHQwxS2K0PyKupAXYYGMh+HShhx8dhuGR7KcX3j8W68Btu4\r\nWF9z1gHtsAXZGiaEX0DaQycA/1Yy9abQ/KUwyLYf9Zf50jVe47K3WsJVjwnd\r\n/TJ38F8H6kuMhKv1Be3z857nW8EHUFiEief3nQ1cbg0ecGyslXrLSIdC7Ma/\r\nQu1dHnkTBYBOhYwvNRwqKeN9w8lBywRBtIZfdpN7RnBVj+F4R+PY3KKnQILL\r\n6vVh8dTe5FyNosGK/KN7q+OwQObYZP4C1Qmf9c3zSlElB0Wtt83lgc9yVlkL\r\no5A54Zjo2WQwkk2o/ClN4C+wNIgUKwMWxW3oWxo2rYE3ln0XotVFh3pZ+TCX\r\n50XLn1BsttI3jVKjwpF0ZfAxyS2pe0J9v2RPVMMIU8ORGOxXXVOmLcZRTOEa\r\nALDqtDqO2mA3qG9k5hDMY17PtZVNsI6CKTI=\r\n=vkiv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.d7e85ad.0_1651866702023_0.3159718686874866"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.24e5f75.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.24e5f75.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"24e5f758913bbbf3a7ab73161f47d2cdfa431b84","_id":"@kaname-png/revoltx@1.5.0-next.24e5f75.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-smHUb7GUUIrXndBMw/U+U3n4ZP96fMkqAvHdwngaBsZE9VZE+kGRiikKL39ieG1sVD590keLw2p3IobcDfdBSQ==","shasum":"5a9e9a32c7e0cc4d38038a473132f49426368f30","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.24e5f75.0.tgz","fileCount":347,"unpackedSize":351431,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEyP7svC5bBqjnOGxrJBut3eDxLwazf/FAe1GZqJPXwRAiEA4aTaEWDGtWKk+IWm/dklX/kNdg1dshGSfobj6WmORw8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxIbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+fA//dC+8dH8yGDNhyARvZdKZj3FbKf0EcUFMFllRDIjIePi+UWy5\r\nljXGIItftY8S41onU93C0pfnp5CAlGoHOR216h86buTaMtdyOvS0zrurM7Ih\r\nnyPkbSLLwAkgmIo4GRqN0zoD+2RKNVJeMilcEMd9y0ko3geOrnvwhtgw6nP1\r\nCfa1P9Fmy6lZ6FAz20LZWrlPraaenRthxGChZx5EF0hBPTjuUE3x7Rux5PQk\r\nkntOxlgEe8+zR0mL5Br3hCuF8Is3Mctruib8pAp6qtBMek6SUFpkHLZtKZa4\r\n5WKvw0ZwU5J8yLfrfP6+w3NpbMlF6rTixt9hD2x8BN1t/CL5IOaqDGjJ3wbB\r\n8ZDcva9EsCII1yoHFfn5EZ3oVIdO2ij/cIlUU8eMq6CpFK8sq/i2P4gir8nH\r\nu9E5nDWkJa/UYwshwJrWJJYX8D7uyGnffHTqQgXC/XuZn7tUr0OCLgwW6KVw\r\nLGNmUDkJnKJ2GBzFWby0biP0Y4iMInEDWt3cjAtv+gUm0fjy54Ky/Fl6JRI6\r\nViAbeoZp0beNOweOq/cV4VWace91xPpJZ3PDsW763Qu7UYWEVNB+cqlMZYQz\r\nrPNBQYegzh8nKEjfXkaHYgsjHOKVJd1Ihz2L2O+2Fo52R8rv8GbKyu8xSdgb\r\nurF2WPPof5gMKkFl7jt6xu4QkSl3AYdLq8E=\r\n=54Bd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.24e5f75.0_1651970587312_0.38616592067683086"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0-next.a706d36.0":{"name":"@kaname-png/revoltx","version":"1.5.0-next.a706d36.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a706d36766d4d3f3537ba9b35c87722e4f3c571d","_id":"@kaname-png/revoltx@1.5.0-next.a706d36.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-FTGa/Z+gpqDeSje0G9DXqRwCb/Pg0n/61ezj2pVzqF1SBSbl4e7xK+KH0Zru3aBaapkLWN1qGCEYwopODchdTg==","shasum":"bbc5237ce172c26ee3d4e88f364d1bc548f2e16f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0-next.a706d36.0.tgz","fileCount":347,"unpackedSize":351483,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvz/T5E3KO31U/efN7YKlTyRDne/Db/511e6U43pmd7wIhAOHnPe2+ljeBrO8KZVs1W7/XgqbPvgm8KikgrbQjrNRm"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxIsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmokZw/+IZsI3bpoiTGL2cps/LDh0gn/QKiWAIpMxnlDhY4stggI9ZBV\r\nrOJ8orio1jvZpKS5aymortmqVIdNzR7L5rTivjGBXVCgpZ5/PSaIYllif/oU\r\nK/kLeAjy/T86DL1XFqqRpjEHMdrorAKPSkrV3AQxkOe0mDxqSwCYqjrDEmi2\r\nDUGiijtf1C6HzGhh4ByRF01+TlFXfUDWQpXUyDOqRhpTS0e2fq2eGYITKzjz\r\nzTnLBMGjozflCI8/qMmED9Oce2zfaLvaZgehKkpJ4gBGEaU2duhhYcHoDIUv\r\npJRTm20dRmOdrpV0vq7ALQVxkghyL0mTKPvR6k23roulBbLNVH/HVYLHNBDq\r\n01ArOyaoCgnI69ajJTOc55y0/YbqVRiInaXUg7KzPmxozhU8Dl0o6AkV0Ie/\r\nCuVjTnG/EcJtaoIHmBe3/kqyx5RPOM437/+Xi697JSAAg87M2zENglm/a8O4\r\n+MHo6Pmz/nNNDhuDA5R6tm3/Qut6bJRNf/Y2nptIEB1xssj68vdG+OSq7/O2\r\nXDxhXJyP3bmG5lYvQ+tSwwLeLrXutsiztVbPG1E3qUjEnE9mS6mYZNPJszKo\r\nh4mBk9Tvef17tPjuvLnajr+qT5xIYwfURc7Gtoww5KXCjdWv7D2CJXvr+AIL\r\nzlKdPnEKuO7r6DXIbaCmaXWLaQ3AvTtC0nw=\r\n=mvYq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0-next.a706d36.0_1651970604629_0.7724409556925436"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.0":{"name":"@kaname-png/revoltx","version":"1.5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"ca2ce15ca9f7ac9dfc8542d20a323110b37c0210","_id":"@kaname-png/revoltx@1.5.0","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-k7WOl89B970ALBUmcj6iykQEclw/GUhbJxxfNXg4jn+b1KDEO4VepVxu2SF8aurvWKQqPC3P7Hli5+M8RO0Raw==","shasum":"ab439d4cdd72c25a96a74035e063264ce930fdf0","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.0.tgz","fileCount":391,"unpackedSize":396205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQC06wv0xIIO15dML1yidW1Eh43P8J8ZzEr0HyVmk3/jJwIfAsM8apW6skMBUK31OzSyE4auK321aacitRQUx3e0aA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxKXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAeg//VMfh35QqJRqWk/MliiYVjK92dNnyiLvrEZ6M4IeI1JpbK6MG\r\nx7FUfijsy2IgCQ9f/HG2lukJ9ntRSdSOy1U1PX3W0yzJ2wBsEx2Q8xxv1OfA\r\nUUcdVltTqiFEslLffYBJ6KOAI5NTe/OzmPlzxU5KKHeWYQej3A/OfkHASauU\r\nhWtMiMvZFMqtzbyOdZhKLauSdUeMXqrcT6C6qU7/wU3YZCJH3TloZqo0xJFN\r\nrHXuo9zivdMeLqOH/8rarjDTlnx+9rS6leep7gbJvQOQOThfZ3uXeZFe0bac\r\n7QRJIH8HGQgbaXI8FKQxF7imkSO5poU2EB/lWXEVjOdwKwzntw0/geNFXmqP\r\n2cA31ZGsVSF4uP1+eEHzUigictTYdqKBKLh5JIAe15YaRXO7F8QMoxdbfAoN\r\nBvdDdqq4crPJvTH0MeM7NXTKnNPO4jnF6E31tPteqSwMuYLz0diF51iKv1mc\r\n46EJcbKUxnc5eOiUAaEX8NqP38Gc0ik85WWhP/YbRc81i9Zdj7GMD0qug/wo\r\n3GEGZyc8rSQU/B/f+u7SQSDc7wB9KtmpIqKzbMcd1n090nGhWFevuGVbMlr6\r\nf5RBbE/n9JSX/sCiFzlj4FdH4RK7JfQpuImd3XS3NSJlUIddJm6dcGR4n7DP\r\ntzWiEf56icTrKpgDDIqx6BYJo/BURHhj5K8=\r\n=ua/S\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.0_1651970711151_0.6823128448120059"},"_hasShrinkwrap":false},"1.5.1-next.ca2ce15.0":{"name":"@kaname-png/revoltx","version":"1.5.1-next.ca2ce15.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ca2ce15ca9f7ac9dfc8542d20a323110b37c0210","_id":"@kaname-png/revoltx@1.5.1-next.ca2ce15.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-Iu7ic4ZSwkqX08qleoX8jQxtNnCGhoa68frmLvVjohW71HtdWF4CjzluAIkFQUxXwf6/BHONozW5D0xPcY4BqA==","shasum":"9649516044a6c4470bf413d9e64b41afe75f09bd","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.1-next.ca2ce15.0.tgz","fileCount":347,"unpackedSize":351483,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXQImlzXe3A5IuHVKZUQtzZ6e2/TVuLB2QZZIhtuduZAIgRD1cR7x814AG1KrWA+75U5ogTGzTJ7BLxK1MfFJVpfI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxKqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2cRAAnOER0Cf682RjmeWVbvlsI7hUaWHDtfCmYjnNdM2P3vAeLUAu\r\nXGIBmkTuMIrE+VRYBJoNs5NCZnSw502aXViZsPQJXLvPUw0vqBw9c4X6rMZB\r\nj/DVXamuQZhwIi+iLr5z5BXaBZpdS5JKxWwLG0RYXk3nxqvCuxoWXd22ow6S\r\nz+jVsu8G5/BK/796kpCH/IMy5zYu5hiXKwbPBhDYZuTvPPcXyPB3yj/1ip2I\r\nyhlSDS+i1+e/z8BCVVi6bNtkp8TYZG87mWLYqg8MwGUDUqTqftRmStt3E+ZF\r\n2MOTWy9xtXHScXQi/R2+TSWfh+tlZMTIR5d2H48M8rilRwQ99MISpEI4P4jr\r\nAeFvvrsklxBwa+NQqZj/j3mGy02uvWDl3eKjeHV3acccr0xDbNq/MBqJk7Uh\r\n/t8Lcpzzkc21QfLMYzSeBa6zNoxG7AlR0vEvCtyPpljo7gwCEp7C0VbN4dG4\r\nLYHQj4SGqF2vqXUZGMXcFRUob1Pv5O1iRboxdqIzeS1Yqe5DvFiJz3GWbn/o\r\ngDtpibt6nhbwmbWW3YXVOennwvPzl1L+4KMamqhLB7aguTWJrH5XYvF/pcbt\r\nQ681kDEf8rJ97Qu21hZir6scoz4ktoeaTasLyFoxeuOX+yM7oNNOHyRZJyxa\r\nsg0uv98UloAkx6R3JJ3MZdG7CXC5W92m7ck=\r\n=hT8i\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.1-next.ca2ce15.0_1651970729889_0.5167459450231919"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.1-next.4545506.0":{"name":"@kaname-png/revoltx","version":"1.5.1-next.4545506.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"4545506ef81521bf802ff0554ab5059e891d110f","_id":"@kaname-png/revoltx@1.5.1-next.4545506.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-VwcAXtXwRwSC4sXCmUHCbE5Jln/taEnHLGKnSvG0G1q5aCkvodC9E/hJ6YB0uxUl/bJmFFKACY4lbbpAInebrw==","shasum":"f2a61d573ded7a47a669a5c47b0b75919bf1fbf7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.1-next.4545506.0.tgz","fileCount":347,"unpackedSize":351483,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6JtsLALKzLrFXTarBSh9+R2LTI52S1PWxbgh/vN4f9AIgU0tQimEPrW7yHAiYdDufTQQPlaX5AgCcLPgTQj8jkbA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxQDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrNXg/+IlsSj54U/Q+mAAPQb6kP8VwDUXemR0lSy1X5TY5cuJhNp69c\r\nrs81lAVtYRf2Wd7FouM8E+vdmVDhbQa0ONoyzt8P/viuhLeU+x3Tm83Mbips\r\n5oKb0Evyqc1+4C++dTdzCGnExaBJWR1d3iXsrgf5t9LG08nRFf2Td4bLAI2C\r\nRCVLC5zdLJOfaYbdrPPDpaZ+gFS0yHiyrJ3OJHUrXaLooav6pKgxpE8WTrOB\r\nWgWQn/hZRNuZ/zZGp1j78EoxJTOZf71Ov3Qc0WNOVREAq1PA1f5rJBD+mvrn\r\nxnJgmCp0qDr+6GC+RjNFP1KxL7q96OvC3Yc5bJHAp8UBNDQSE/C+Q1WEr9nP\r\n5gc31Kehe5IX5lRmc2YXeW2G5WK6bpLIwLvOOqsRdsffgYBI7y2QgKffgtja\r\nzhAHyGUxFJZ6jiZ0DuCY/xnoM1Q7QKWKzGkoG/c0/0DonzQFC+qDA/6oe9eH\r\nfvkRTwRtFpVWas7Ksi99wwGeCqiLtBoWXxwdys2hVLkWtJyZRrf0oQP4FWv/\r\n/KEs0fp6R+JdtEqN4x3bKcQg1YP5eFem30bV+oKZM/EH6O9obz86xFh0XRb4\r\nYbD2G1cGq2OPnTf5ONLNDC07MUh7BGAHNlaUdPo8AGPjbp+Mpks2SAxEm1Gi\r\n9OEws2VVl7MHyj677n8zpmgTOfY7vUzypww=\r\n=ajCv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.1-next.4545506.0_1651971075100_0.37536327231396194"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.1-next.3d9f421.0":{"name":"@kaname-png/revoltx","version":"1.5.1-next.3d9f421.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"3d9f421b303b709adef3b9775fe244566757a330","_id":"@kaname-png/revoltx@1.5.1-next.3d9f421.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-L4OdoJw2mdoCDs65Bnlfa0/e0B1sWO+rK5p3vqXgdLzoKSBBbRbiNZ1r0k0XMjU7fEWWjZdxkaaZp3hI3TFuTg==","shasum":"f5423ab2a31a0317a2a2795193209de4e224f626","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.1-next.3d9f421.0.tgz","fileCount":347,"unpackedSize":351483,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF2+HQ5sxJX+KnhhYJw1H6ZvVG+SKMFgH+vDt1/JHmcHAiEAuuq1s1wDltw7Zctut8Ls4Nio3BBC2bXwEdLrTQTlua4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxXEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsVRAAo15QRrr5xaq1oI/AP+vKocsPHGj50A23V9rT7Wr5icCYX4wh\r\nBz2crcDDhzKZ3pT3QYrhX1VXrIpttt2Ejzh0hhGvbPC6y0uBPtBj7gKiLcHT\r\n47ydKcJGavqA27auaXi95e5hE202gyuEc36kI4iVedIbb9HpEJLUiAd8pP6n\r\n1zjoDmV9Ak/ixnoLhBciR4vNi+HqbRblAFmXl8SJbkrqZiMsURnUm/eQqlpC\r\nDHY66zhtsH4iDumfzpxpkdAkaA+2lJ85zFobJVP8CByNT2Pp2ygDTvqN7vdg\r\n4Own3tvMHqL4zr3XYTHw9M1Qt8Z6V8oQ9VqRw/pZACKwr1AUxA3orfLXInou\r\naYdBbVbEfS8+sp1iubEvsUpYr0V6iC/bHzl+LWd2rHifm6ej+6tW4RzFHSbP\r\nJkzN6AHzeAZoCQ/0HyFtfGOO0UEivWIB2RF775JbtzA6usebgGN1Ow1e2dG7\r\n648HWVpE0BTiDE1NZ4xU6Kit7i7WQxwmLQuTRsMZv1NEndjhnGOp3iBXKqcL\r\n0MHItX6T9JsT++1NegvrFINaIZrIzmCfSOm7CR6vgcHZTFmE2c5ZkEjAvmJx\r\nYP6ct1ytVIBxyjIyk2NllLeCJztHKDSnrmaq2A/FTGWZuvT25C7o00vrgLJW\r\nr0wyPKwZEEuKWaU2vW4rqqFGLcCUz8Hw1to=\r\n=xqlD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.1-next.3d9f421.0_1651971524387_0.6306800485356783"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.1":{"name":"@kaname-png/revoltx","version":"1.5.1","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"ee51c4b1393d9dc83de9fadff2f289e20442e895","_id":"@kaname-png/revoltx@1.5.1","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-nthY9JCGIpORrdk1IA0WiYort6un8Hm3EPX2p9UuguVpX8orJajASHv/lveguUULbcHXhBsnRv3bs2uNZkT+Lg==","shasum":"a7f1463e072ebbcf0c460327dd90e7afc9cb4212","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.1.tgz","fileCount":347,"unpackedSize":351493,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICuS4fnQFaCaPw5If3Fmo/LUptW+NpjLSZj/pHJKJcE3AiEAuf129QCYS4TEg6RI+xkBNbF/OBNgcUm13OzWIMtU/wY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxpoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoyow//cmW+lWNKIcBLHOBy29xm3rx1046+21h5EfJ5tuzIv1evurKD\r\na9cH6E7zchVaTocSh02O1WCyM2w0dyBrXull++K53o/yi3dZC19Afk9lIWrr\r\n/mXn7V9FI34xbDyG0wOcPr6QyD5cR3TpZfkYoxE3QTzPP8iqu0AyYVzP5WCC\r\nM2wEghHvWShoSXJ0tCeapNx+jENXMUwiL2BuD8AGgmtP/UBFLXmlQmxdkDdX\r\nYAp7D6Ga7nyEfITWVz6hc+Zjnjl0VSrRPb8RBkbl4m5O7Af3c2ZRkP7WWX9+\r\ntG0uzUhEwwLvuutggMgNV31oqhOHaPmcPs5t9IA1TPPZWL//ECRV1cVCjD9R\r\ng0JqoB50iXvcUCvZ7ZL/9oaQhLMPNLiPvlWcme/hPTwzoy9ZSLPfMcJZlOQM\r\nttGxDCc+iEf081qHc+/8GJ29bfXkr/PD4dHuq1rVYsUbdKYscwE8tzbC9TJh\r\ntsGKbi14HzftYVriAtuwfV/BdE5t0NM1ZPBXrEixtcoQlEuiLYftNBUw4LHs\r\nGzDi4tJ8CHQAhS60Lh5ri+sejnVgVnA7Q2QdLKphC/7kKSlp54FsjXuqRCWC\r\nPb8PeJ+EdF5Sd5jW/GVVdqPKYXnavu0zi+MkzxmWc1h2weQCYZvhFae/4y2C\r\nigQWMU4OX2YaVHMB6AODJFUInTjqlrHMur8=\r\n=WwqL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.1_1651972711827_0.3720955874227212"},"_hasShrinkwrap":false},"1.5.2-next.ee51c4b.0":{"name":"@kaname-png/revoltx","version":"1.5.2-next.ee51c4b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ee51c4b1393d9dc83de9fadff2f289e20442e895","_id":"@kaname-png/revoltx@1.5.2-next.ee51c4b.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-OlYn4KDRVkDbezt0ShvMbbWayBoqDxqY8e7BMg9k7cD3TitoVEAf0cMJzlecLBR9in8rjaVFORKhjhsGEKgnIw==","shasum":"a92378fed844a437f6ca0ff4da3970002a144c4a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.2-next.ee51c4b.0.tgz","fileCount":347,"unpackedSize":351484,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvg9AkMRONRTKsjhE5RX5h5bjHpmMkTG/l6NT5KKjNxQIgHSy9kSJEdnkZro0ICZ4TVjzcCZ1lO6iDFk/3ZJK0j2g="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxqIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZTw/7BALrrrmFcxEvClwrYlNnzz5z3Wrvyvd3abMsQGnsqTqfa2+l\r\nXOAcg2GrftHII9v4l4QkkbiXj6KrP5vQGfejkItFiqeTsVavtMBMyE4vIXaL\r\ntzO65ZJ/6WD6DplZwAsNjpIDLMJFYoO6CPKhy5b2tE168ZRXpaacQfKPVL9N\r\nSg3QFBDhKduQcUKKD/aIvhvznQy5A+MWWVqlqBdINw47IHT2600J5LFWIQAK\r\n7VkpRsvUQ8atF7ew+zot9xya5LrYXPnlP/GxijqfpiT2dZ5m7FTIxSN9qMS4\r\nWqgaE5lEMePdW4f6Ddtx/xXPFOojZXFomrVgXDgxLiDKWhGRusM+lKS5ffPR\r\nHqHo3NwmXs9E1W0y/s1j9cYtbgG+BmMSwf2sxFb6IZwlWhz8s/2DXLO55GHY\r\neYlSFVo+mz7vVe9nJ92BUH6Ps5h9CDfQfz6MEtB49PbBE+lpIRw3kgsVCel8\r\nr6ttKFGWthkSlZp0fEACrSTOObXCtdQ/8bMPCg+w8l6JU2BzXAuZhHMce8kB\r\nCgvMVP+1ikkMn9WTY/euIgqyfudh/EBrZv6G+tFp2uNQINosUnDlEJBnsr2J\r\nxiYnuujBjPtrMFxQNdxqjtdoQ3kCZERzlcofRvYKbuyGPhg/Qj+wlLiBakcx\r\n4R70wXqprYEx/d+Q8PhQK8VHMNpL78E8CFQ=\r\n=U3fI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.2-next.ee51c4b.0_1651972744479_0.44891511350752333"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.2":{"name":"@kaname-png/revoltx","version":"1.5.2","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"71064581ebc9d4af27c8d4a6dccc102f0bb0957e","_id":"@kaname-png/revoltx@1.5.2","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-cW2ma0bESG2T+09UiBFic5UIxbUQ/gwFpCKSfu9ARa11lR15QU2aBJE3sqX7X5lAlmipIn0ldC4i/q+SAS7H2g==","shasum":"e5254573d0c59834ee76cb6e64d74042555a8533","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.2.tgz","fileCount":347,"unpackedSize":351467,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADjl4Jk7+ZNdCi/plD7ImuQssRM7+OOG/nNNzCLjjAXAiEA6bpRwg6DCOVK6oqZlPDLAkZGpMMR8sczfBBui5pd4lA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxu4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoxuw/9FlI2Jtx1gt1r7VBpNEa3dPD14KGSu+mLpxywbObRK+QY9mFJ\r\nUD8Wu/rWJ7xrqyDnTMcMwj8yMsLWwUr9/Q1kHmmfjBIm6+Anx7hshShmSNPn\r\nvLU05tSC5rZBJH9abbe73z8/9Ro9CKyZk/ttptVUkan3VByXXlG/Fn4ElVG5\r\nmepMTjOgq1lsOfKZoYISm3bcsMOv/5dcYZSIWtJGByqIbubf9Gc63IAyyUre\r\nkLWtVsQhENh5O6rH2fQc9o+TXBmCsrX6EyqFf7Wrg1f0OuQ/DtAibM7owA94\r\nRA0sMx4TLpsVh3MLwTYdQJ2Ef8UQOvDPQBv4mLhlxbrk+fkJ6MpyZ5Dv3Amq\r\nw4lbZj0mkgjibgHWJwNiGe9VVkM7N03ab6yLl1fQubW1piNEhM8P1rtm5X1F\r\nvCEes73IRfFU48hUeu4Ho/qVxqy+T1hUenQFrf57ORFslq6u9LML2TLBi2RV\r\nYx7VNekDUpwqcgKEriInyNMG2HYRrFYXtHFWjQd6P3QC8YwZ6pIIHq1PPyuN\r\ncMMz4veyAlAqb5LJJZTaki86cIRhBVotfHTcfUPAjYpjG204QVdSUFRsrrn/\r\nVAwYvK1MChOJxts5yxCoIzax2Uoz9VSfSMiAeFo2HSlVGgGx4fg01AVQG2mf\r\n2QgF6fXS/hiPUHnvZwk8DlO2YkBMka67w88=\r\n=3fEP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.2_1651973047934_0.6281488941534199"},"_hasShrinkwrap":false},"1.5.3-next.7106458.0":{"name":"@kaname-png/revoltx","version":"1.5.3-next.7106458.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"71064581ebc9d4af27c8d4a6dccc102f0bb0957e","_id":"@kaname-png/revoltx@1.5.3-next.7106458.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-oNfDDJe07UrKEKlQDJubpNPTJ2yZYpCku4ObnwwNWBpHJJpxxk/5TupezkNvc5nfWBVc6MCTzH53eLw+YUsZVw==","shasum":"4d246795f0cfc986ce0cb80096bb90a65ef00b93","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.3-next.7106458.0.tgz","fileCount":347,"unpackedSize":351458,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEZMdxGIRsxzvbjmtqA7/qCp9HIyz2KF3qo+H7ZyKi+DAiEAkTjNZyFMCZs2GKB4LzELIW2es17P0rIlCFe3+DzvVRM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidxvRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBdA/+M1gKJm3S7R3mJh+lHfd7vZlWb9AX2M43Wx0cTeBDRhf6izS0\r\nGsS63oX2VO6aUt6EkbJWp4UwgS+/X8gOVzdAs4i+8U9bX6h1wCb9AAzCNWnw\r\niVcj8tRaXx8xFEylvNYUiwh4iimHTlMfr+wsH55xZh1NCIfQhHuIIJm+FzsF\r\nwfRPleazZYJwEMOhv4SieGpIzRrEV+yVji2skQJ4v3I0JLLvZxK3XAzy86Rw\r\nhR/rP0aedDIFevpFzDNCEFWj0ryUvwacN9oYu46tuQOiO/F1ro6ujHQDjsLj\r\n3jM8I2iQIoX1uwHJpcg3a90ll8vAsy79gQT8uoBuOL7QOFCLNPC37LGPP1+0\r\nLn9ot/jkrfBerwgWeuy2+2GvRsB+RNUpKoBLTe4oFKR6X8M+/9q2DlfLJPmw\r\n1Gv8MagCIoZNp+TYimrtUrARKFUohzh+gCzL20E53gcNe956iZCl1PpkvZDP\r\nahIJa5Y1u3pLNT83dIKf9zDREtp7wm6KHWvfpjWWV/6DZvXLLCxc02DXkDIt\r\nnNEBtd1aTIGOVKhMzIRR4jshwd5WMBecLl5O+sh3wiDkdCN1yGgkZT3oSMpT\r\n/SS8Ze5zeFY3Vp6rbZrzrbYr5Y2kmadRIlpbU2CZMsxiwM/O6PZoWdgy2deS\r\nJkr12rLsYwzao9pll//vvgMNDXNqOdgjepU=\r\n=ktqA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.3-next.7106458.0_1651973073770_0.10480448246323526"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.3":{"name":"@kaname-png/revoltx","version":"1.5.3","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"e4cc33740db35bb434bd4df83b4abcfdc7c2d73d","_id":"@kaname-png/revoltx@1.5.3","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-qL3d+MMU21+/0TG0V0x+2zvcSDvidJ2s9cMVHOATqxaB0Z8oLc85yicAcc3ShpOg3e71tnPU2vy6FdSQuE78Ng==","shasum":"1b9e2b77e7f5ecb3fc5c591d100a3754357700f8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.3.tgz","fileCount":347,"unpackedSize":351656,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvGAjyrOWSWkHbRQD0u/qr8HAfxeWKbfznA/MNLGiEOAIgTvTN+iqFL4IPhFjFMJM8R1QZrxuirr0W9aCdVmiw62o="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidy6AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcPA//YXbJEy7zLjZon7tRU0VnCoN5nXvDQgs1KY1XA7jAXNXqL6Dm\r\nin/A9sH/Djc36tx2jU9EbxwKVwKHiml63br1ysvBS5e+PzQkK0ieA0WosHQD\r\nvhPf0sRS0k6fzE+pFKPL6o3g/hvIPjNCwMWkbzYLoyVI/sLmovvKnUf+AnkU\r\nn1nsW37SzeaJvLeny6gLeh/0HB8o7Ah4KU3lQUGKXnDSo1KvyN7lMxzis7sc\r\n5ifzqbaiSrc08En/uPZeyX48JQ7EbLVR6PIozg+uVv+bz3Q7DLLqvHJAiPO6\r\njoObyiABWj1/M3NNHDR5qnaiSdS0Ejr9vooCIB5kz0eMKdqXLd2kAfSL9TBL\r\n8KgEPCq/U2TnvKwm0mzQbvcTZwnaOB1FzkhGQpwvT2K9QUacNXAq2BchfrCv\r\nMYY+W0lqyFvP+iUQiaD+rxK2dVnEP9FxEFDhqd/hpCB1YzO62LudpTnT61dd\r\nGzTeCdXpl/iTQhUjxu8Nuzpx1AoW5Yw/OIKoRcmB5CbZnVDzabmEgmbJqnlB\r\naxpdojMonKbXpEfB4+6Hz4jqiRqw5udkxNrlEYEPA/v3TyN0pEOgA3BC6pVv\r\nPM9lQKHK4yZc4ZFo7UH6aaJ07Df/ELJV+rN91um8THM8H5Y3HWJ91yyh+KcG\r\nM2yBejXciK/lExAHiMuoEY8cT0TJf1gYmMk=\r\n=5Mek\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.3_1651977856487_0.17498844499520505"},"_hasShrinkwrap":false},"1.5.4-next.e4cc337.0":{"name":"@kaname-png/revoltx","version":"1.5.4-next.e4cc337.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e4cc33740db35bb434bd4df83b4abcfdc7c2d73d","_id":"@kaname-png/revoltx@1.5.4-next.e4cc337.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-lU7yoDJ6Qaxs16LNq/U+/HCEtgUjjtM48Noxl0P5wuVkvLx9yUmHOEQIf0yWPamydvYV/I2jJ+1ElMlWW2JYxQ==","shasum":"84babad3912d53520c52d860e4eeba07be567df5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.4-next.e4cc337.0.tgz","fileCount":347,"unpackedSize":351647,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICccvLwkAsGDT6NtcoThAbXuvSv2MFUUKztyRxIpxvPZAiEAhz6bo8RV7JZslaKhc5ChAkCnH1cnOv9MYXzHuj4UVcY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidy6YACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDgg//aACOtbSTSonC+wEmp19Z76fKhuRehUfIk4whEP0kMQyd2JHA\r\nsPcYvwU7dhD+EMWFkKNZJfN1hbRJE5aJEb1dLs2JwR01Dtczbby+Vh8Cl9qF\r\nRadsdBulIBSDRFBlgWWNs90qvN70QrkIvFO1LKz62XH+iloByXmb3instPOd\r\nvi1/j7Y+0W7mvAkEMouRwQbLpyu841Iyraib/EcML8xznGsnFjHa/5RcdSAq\r\nSZEjyDggqtXIZLfRE8m+vcqCUIF/lss+RulCtFrblEF45rUwct+0so6SRTDQ\r\nlgk+teUkBFl8SfeWPMOZ6YAUG9ZHTsZhLdQWt9VpiYHNxpWO6D/eO1gaSlso\r\nI0d1oMzcFz1grXHuopWwPTuEa9lsWyykJhb4Ck30stBKBZjaIwRSz3LeeWl3\r\nrzixcGUiuEG0IOYk//iHEXAoBPaA12PrpEiqneiZtgSUT5roZ6C39hJuXu/4\r\n4h6daXuzH0Dwv+x2tTbfCxTSuLuIlDyULGX0BDf31n+Xlt7Gdia4M52Kr4N7\r\nJ1u5cWBGmDXzyMBgLrlJEAu0p3QQJj2qmYQcgSgC8CDzPTfWNYVP3OGp27Y2\r\nrjTclvCYzkFo0scRGOeymMOsB8LnQr6Q/w0cm3OXcE3o5LfjhWDxRvc5ALqT\r\nTYeaAgLSto3JzlkiAzIok/P2pc5TQy1RD8Q=\r\n=c5eV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.4-next.e4cc337.0_1651977879746_0.6252814555356163"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.4":{"name":"@kaname-png/revoltx","version":"1.5.4","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"fd33ae56de54baeb9a1267517ccc80350c0e580b","_id":"@kaname-png/revoltx@1.5.4","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-Sq7ohcP9IBgE0DoMp2sE/sYtvT51Gj4u+llLvgSSr9JbjvNB5BLc6kelK1cyHtM3tNhdQNEaXkoQCL2rdHFcjA==","shasum":"5c7139e1e29ca093a331118e5a306ff88811b766","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.4.tgz","fileCount":347,"unpackedSize":351670,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFxgpo0pxdg6kn2HccCcjWnKKbIWZVp5lFl3XTaVvXWfAiB/c5tWbFWSnqpLcclt/W3SYT1CsvtS6wQB4ZKWgY2Ycw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidzT2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrOnw//c5RqtqcGPKC0YX0YwQOPPe65t+ApD1DEcMRjk8frgDvBD93J\r\npsEIMv1uZ49qeIElqUz7a1gojc/UmGeeBz6C4X0dxC285KLgxvwhl+TYTkW9\r\niuGv4UxIU6KX5OHqEZfkjzJFF0ESRVUv9xkwPTdg4RjekehghLsXuW8QMvOV\r\n/m0OXNqTDP/LgQiuVe1Mh9lxnXeG1w/Yt3p9tDilPzDd1qaVwBIMnyZfjbVX\r\nxzDeECQiOZOShPs87oiszvcH0qI9lg1smpMKWSC7AV1mT1dtb1DDbNmU7Gqq\r\n9MxZcy3jI09Aq3hFXEOwdVujONFMNllU7Hg59t00j4IFNds5wUiCgnPlxzAG\r\n+juUx+gTJSAW54j3CE1TQtFUF4PjR87WeRsFWIyeRnyMi0RZhgBAafAwDFM3\r\nZwwRlRBjmVb6OD+sieew+yQhcXVMjtGWEnn7cEoq3BTmrXQGRUyMBRRW5ygl\r\ntIfd+PmgY67oJ6kCs5SsP9frsqiFxABNPbmdtIy/yFgYf3HYhhWJsfjZ495m\r\nHnMpTyNM7Hq0sUHcaY9Ztcc5ClAGYGW2Y+cazQeUdeDs1qvlOKcSzKBKps6k\r\nFn952r4UZHH3pqjwB5SIkgOBOb5Ek7bSGDYDlMbRPZg0AxgPpZ0Fy0vB994U\r\nLHAMg0YG4zwByHjcbaQxVJCjIxFvHdfdV+8=\r\n=AdnQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.4_1651979510324_0.9445638425631806"},"_hasShrinkwrap":false},"1.5.5-next.fd33ae5.0":{"name":"@kaname-png/revoltx","version":"1.5.5-next.fd33ae5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport type { PieceContext } from '@sapphire/pieces';\n\nimport { Argument, ArgumentOptions ArgumentResult } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext } from '@sapphire/pieces';\nimport type { Message } from 'revolt.js';\n\nimport { Identifiers } from '../lib/errors/identifiers';\nimport { Precondition, PreconditionOptions PreconditionResult } from '../lib/structures/precondition';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'NSFW'\n                  /* optional preconditions options */\n                });\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\nimport type { PieceContext } from '@sapphire/pieces';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"fd33ae56de54baeb9a1267517ccc80350c0e580b","_id":"@kaname-png/revoltx@1.5.5-next.fd33ae5.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-gwn4pagTrBRe1IGOyAa9bKJHGoBFWDhyno30oWtkWSY9bJDabkzymGSkg3vsUPZlDqfP7THLfrF4cTJc5z1n5w==","shasum":"c8b02626f72da8aa191065399467911259b168b3","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.5-next.fd33ae5.0.tgz","fileCount":347,"unpackedSize":351661,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEuLc4wNNNW9s62ZUtVwBPT6SCgud++D6CeYtIzQv4B5AiARWckFKXPBnMle30QT5p4TGgRD0vxRnzsu0fYkynk4Ng=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidzUPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoyA//ca9nxOqeoAKbOg4IdjsmeFHmLbXz8Ybb50LINKsIYCzA5tWf\r\ncKpPOuphJYHLWxn6yWPqMyS4EE1GjWGP2v4nUsRf0DAOfTuWzn8oCXHMa1Uj\r\n1f7LQgwQdmQ2Z3uDECAMe/2e3OZM912hi/mKPdamW16ftmtkn/JDR6Npvrlw\r\nc2C5xsUTaXEvyNXNngbA49dCIo5e2LX8Cd6CdmDdP8MGzPDqG8N9zpdXRDO6\r\ncuMSL2SYCs20v43mMz3uzpE/XrUZOcqovbK7WrsaiglcwLvcMPWUCLyVroES\r\nz9ZspLDnmxHMbxxCEh13r3fprwpROGHzeQv2Ytfao8veWPftJ6a1E3WLJdEl\r\nVu57G3sk/3U1gm4s+9i/CqomdmwU3I5nUUlofbMdgWgYS96I8Ex5ivALEqpY\r\nYZqjmy25b+Nv9PKjP3hZ13vL7WF3at+uNvfdbsnxrfL4GE2FbiRwzMrh0dJt\r\n5L42UnYJkLNbPt2/GSPbZpGOlzGi2C/O0eJALwPYdwKuF3YtEi93bTgiwW+L\r\niQWO20vLKmUeXJbunZ9W4TymUIIC/spXz3f0u1s6+SodAYJCGpxcr+xrH856\r\nBPl9WLQwvc+kEQ59IuOP2K8rVy7TsOXh1LxB3Xd0y270eq0wILZl7x9S2QOM\r\n4mu/WsZfy2g39lgdOJ2NXhjxCpxpGT2BHWU=\r\n=Crmd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.5-next.fd33ae5.0_1651979535448_0.3089972133378205"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.5-next.c4b0ed6.0":{"name":"@kaname-png/revoltx","version":"1.5.5-next.c4b0ed6.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c4b0ed6f7b138d24e2e926b196d41792b95eda94","_id":"@kaname-png/revoltx@1.5.5-next.c4b0ed6.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-nEqDhexcqLub8K1kwp6/sgGWCscPnIZXA7Bp2gtCWxdFK8YkdgLGouJcBQHK8vG4sev5YFEgT9tUkWHXdGiVOA==","shasum":"7f6f7cf4a79d5b3fc7fa052b99f09aeb2658e8d4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.5-next.c4b0ed6.0.tgz","fileCount":347,"unpackedSize":351351,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGy+jlecKcp8CxXT1uno0CbkeThcUA5Wm+SKwUqkBBrtAiAvz8vTD1P8W6cvfGwgRo+aKThBvdNH0tlYukV8gOOwVA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidzXpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmps0Q//f4et2bgj6ej0BW6KUhJgC85IgapJZE2IGLOagP63Tp0xkll7\r\naWPlcqPiTq9S9V2Gb02Ub250ctg+K2jse3HJOHGkBgr4vu3g8mf0XDwL+itC\r\nXRwBo/X7c4JQKk3WfMTaY8brNyfk1hgbM84ZCxEwxKzBDfXlFDfIULg9YBqT\r\np/Rvkd4ritfrwviW8mpPp/AVD3SmZbgVtxfYuQPt8oulZrdeWa4xzPWy8/ru\r\nwl10mGgOj66Y1GLPs0Mir3/ziRjhvyfAoWmUTGEAUaJn7N36y2u5Yg6+D7h8\r\nrEr45dq9vecuB59xzCmRS6ccdgwmaiaceQ0o0V/CdiPZCAqpO/+vgrM9nXWS\r\nKX0uCg4PEzFcMjUYZ9opY93YbGC9C0YQH5eCvtDenjyY5CVdl5l3VMchD+ZL\r\nVCtinMP+8QJ5mbMKtJzLmLgiH7fiI7Ejn1YkIKFcSIuKe2nVRFyaLcB3yAtD\r\nlXiP0AaAN3AHm/HtfqeVC2N/Ra9Lyh6m0wV5OId+ggNIxRTb9eumlNaVIOb1\r\ncKt6WI2jK/zVNXe3KqgyRB2dsVjY6kYTTvHaNvhc9pYeErk4jAdOSHohJEhD\r\n1vY2XchAnovP4l184P9BprTTv6UJkSbVBPgUUfQq2YbNR1FZP9mmJsjJvjQg\r\n1WE5gW2US6waqVfz4OgHF7xm6wFUVJ8+1Uo=\r\n=7/9W\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.5-next.c4b0ed6.0_1651979753344_0.0543884592024062"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.5-next.297e393.0":{"name":"@kaname-png/revoltx","version":"1.5.5-next.297e393.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.1","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"297e39364018f153aff573305defef45846e8839","_id":"@kaname-png/revoltx@1.5.5-next.297e393.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-1aHvkuDKA9y9fwifmBk9T6ZLMFjciBNvtJCNLd1FCSObAs5gel8sfZ8bBIqAQYYr7Y2un+vB9FEEG+thQv+QaQ==","shasum":"dabfebbacc033b5572467ae68a4404688cbd960f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.5-next.297e393.0.tgz","fileCount":347,"unpackedSize":351351,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHqNPoL+Y2DGZcaNriH15sjhNrUcvcwy70WIEvC0qcbiAiASP0VmGF99wTnQTKkmxTvl2ulC+joaau7iOwIoxdsDiw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJid1BHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqK6w/+KQiW8rlri/z9Hy88QnHBWjt/THeQeH0OBQqDm5iLf1mNGHXK\r\nHsgknBqEMsG9eAiE58aZGLe/cnqCrmAgMLH5kImjPSi01+z1ikD9/c0pU35/\r\nSGDmGaQ6Jx0VAfRAP66YHNFWBjA5IezjjMHlGxhH/vPcwBOjg0sPZb9VxYQm\r\nxZeyuOoaTQoSaQFtJ/Spg3PsqFyPXuQrjf8UI8EceAAOMTUIdNrsJCdfPMxp\r\nmmqMX0FPF7kZJf/txlQu98C4BMKBtnZGSN+bCBZ16qfH60Gh3ioOP77/Xie3\r\nXnI4r9ljf52xDxAr3JfSNwe7HghAgeWactFyPRuKD8jVt8+xAjTyDORusW3k\r\nEpJs4Bf72OuE92WyyndmT0LDHsl5SGPkxk9vpJsXl3M6ZnU+5efpox7jKkRK\r\n4sU3jJDLjEcpbAtn8LkYjlDUxP8oN31vfCCALc2uucKcGb/b/TpKKpxpzWP7\r\nWIF46T+d1o0B9+YGf66Gli2MssfVeFLb/kz82KGfQA4RiKQlQ8fwXWKNnH7x\r\nPpfLw305jpV/R5bbGVUXCgpM/RrkoEa9iSP6ON/dvoy/SFeus+W61O4r2CN9\r\nMM/pLYKihKUt8k83N5zZHqXWKf1KORjVqTfrgF7438+n1BTxipYkRKH2wvpo\r\nSgRyCeRtkwZkOcg+e6CXNE5McZZpXJ/kO0c=\r\n=qsqN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.5-next.297e393.0_1651986503185_0.1753516304305407"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.5-next.7b31bb2.0":{"name":"@kaname-png/revoltx","version":"1.5.5-next.7b31bb2.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"7b31bb2968e9dac39238b3405c41c68acdd2e70c","_id":"@kaname-png/revoltx@1.5.5-next.7b31bb2.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-uw3CWQvFvCsdEBfxyXLxmhrhubq6GjUjjBiT3+1XvR6uwZsei3iKpYrzlR5h56EZ3Q/oW02t47X+BBYf95Ko8A==","shasum":"90b12e86a7e43f0334ee8162945bb32375ce0536","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.5-next.7b31bb2.0.tgz","fileCount":347,"unpackedSize":351351,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJ/ue2XFWyT/xhvCf9g6BqF3nuXTc4sl2pu9OqNAt/fAIgMEYnai8kZI5bZhDT6lCW1YuN3QQfFPKz4pcnDf/duBk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJid4/OACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjXA/5AWVf7nyIUfHMfBNP5823MikSg0BYhupJn//DrbbbkviQ26XO\r\nHomfOV4UXXr/kSjdh7bSecXtgX0GNC+DMil6AX9RM7OwE2PFf6o/8GzyMkxk\r\nfyG1PmB6uXIH9oPYowO5kDmNgE3KFM7c4mN5UfLmupZkGydfQ/lGkKyoTHVR\r\n8ODktlWNZRK1rZR00PM07QCFVGkp63eoJO2A+9YqSmoYquTCFaZ1M3NiUMoH\r\nyskEtM4WyTQaIZ1AlrG5LsV/dN4B5yU1PWXZgpXvf8TplUZ0qsVdTcE8O3Vs\r\n+HPBZAva1cQ/7KdSDTnPBwuNlnbBwTxF5ygoNkpoSAmb28dz2ckeKJ1NJrik\r\nzuLGhu9s9FKQbIa2Ud9LuWfBBujvSfvbK0lFeZVoUerA8fYhApM7Rl8O6Fdt\r\nEBBfU6bc/Xm8gjaaAWDhWlRtJ342TanidaEbZcZ2LTUZnPJ80MpxBv7gJ1p7\r\nJSmhkdUtTFcbGutzFKWy4fyYPotT94Lzm9wiGpzLxdRgUF4YlY+dZKYqth0t\r\nOTY5lm0/mny5dK9LIuaBDjpU9JZjMzncDImFYQ56/DfSYQ3mwPOEc9YpLph7\r\nkLOQy6bGxrIGetFBFukY2Eiybn0MnjgpJJyz9/KK9Jo52+6Tr8b6bWj9lo7c\r\nk0ERhI4GMvKWP99qCCto2qorhFqul8gakUU=\r\n=AuSt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.5-next.7b31bb2.0_1652002766654_0.8312926615919252"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.5":{"name":"@kaname-png/revoltx","version":"1.5.5","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"1a851cbd2411fda1c1e299cd5f6841937b98615c","_id":"@kaname-png/revoltx@1.5.5","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-HmP6nN/C7yUIBswPZe55MTeJDpNEgEzoSEB0KoweCm+58wGsfhCSRLbirYljwY+Frz1W6Qv1nSRnz/yD3omiZw==","shasum":"dfbf1f5742940a8694294f3f6d7bee76ffb34353","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.5.tgz","fileCount":347,"unpackedSize":351966,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG1nVOeSmm+nRYKU6MEJPqsY8rRdu5l4odAy+WMWKaPeAiBzadORfRmmXsRDPn6hqda9xLmPn3HC55yNvVohNjEOjg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieUu7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqPFw//YrGN9o0hmjZ/E4YcgdQV8mBVbEqH5bnMiGWcsjd4T4o9iiaY\r\nkz4NWcnBkQ0iOYvhesY9OVSZD+9L7otUODhgS6IsBX8G93y2E8MYN0/ckuV/\r\n+GfQCwnoys3f0YQMnuWjtRUinswgfLkxlD9Ws88JRmHifglycIYVIKhiMF9k\r\n5p34uLFit7VNNgb1WjVTbLE2/2pjj7ZwrZX4Laxe+JG04pxS+2YtghKefkuI\r\nSyJgSDpp+JAviH7RGxNDlPmN8Umfo5Q6Liafee3lFy2PJP0pWWHz4Tg6T1Pc\r\nwVJczeFw3mr2nqIcYlAsUE73sMaezNGN7EC8iZAIz8HJT5zP7L2PZTlQX2mH\r\n2K9bTJVp3xgZYRsdlRqw5Vj4tmW6JFUA7cKxaWIddRzFc3Q/G1Xi0Bwu6PQy\r\n37c22URmeYPzQRzVbZju0mn5A59ssfBoEecnqbP+5EBaOoDi+k/IxIKA5yNb\r\njD/pFwAeqNibhr2fptnUGCXPyrSNVk/Rn5eSUNQc/xH3tjI+sARLtdlUBVhg\r\nKrY6pGdgwdXXtxvBTjgQ/pP2jVuXyM96kjEBlARS5bc+Auo3B7+nNzWVWnjW\r\n/Xxb+fV9G7L1pDj0iWGHix+PUFAWL3PJ7kMZAwXjzzz29J3JkASReMjNiyT5\r\n0KPapRYPbkzRilXBuH4WKEBwLDMV9i0Aa2k=\r\n=aOtB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.5_1652116411728_0.6595116605166969"},"_hasShrinkwrap":false},"1.5.6-next.1a851cb.0":{"name":"@kaname-png/revoltx","version":"1.5.6-next.1a851cb.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1a851cbd2411fda1c1e299cd5f6841937b98615c","_id":"@kaname-png/revoltx@1.5.6-next.1a851cb.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-wDWGqaFJUj1PL9oJzGMTON+jS/pXJSycs1qt7XgusGEZmwx3JSbH5V1pkgRWqr47pTY1GgaHc0uDY5D+CFrcTw==","shasum":"32003e628e23751c403ecbbd3933b8e1ec91341e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.6-next.1a851cb.0.tgz","fileCount":347,"unpackedSize":351843,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgcEwB1byTt4ITmkJsLQYkWNFAufNUbaSRWoOrteL0aQIhANRFjYzTIbwKIY2Bo6jO6QckBfeH+TUedXVncBGUxQDx"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieUvRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqgjg//XxtowNiVGs4bOKXRqLoc94Wnvtof9ubQwHE7I/B/cEMFhp4q\r\nkXf+jo37xqumID0IdFkAGtam0GzO/VFedgZTNJOb5RCOmVrdVngw6L/hdSzf\r\n84aM43XK9rge1tTKi/uEkMugjGyKc2BawGq5tgOHZ+vGZengHDiwKW5MhxNp\r\nNir/8C4lYOQSXN2XP9Vwj5xeAfW1Q+T3Ao3iQcHur9rDO2G+frYn5AbFuanf\r\nwndrdItQVJUYeRryQaQHlEnrNxbWeDN9DShxN2V7UsUWfPVc6HsNmUc5MheU\r\n84qq6ECTHCJ6uPnxGA6OOtjNEdu4uePYxpog/ggdERsce6oL5CHroDXvigqK\r\nk0frZCo8szzcnvtMMAhgORC9PjrUEj4spm6phvK9d4DEqArjXkyRF/HRSWun\r\nrIKVYjooOeAXP6DKPYSINl3HMca8DaZc2z+4Pyq4+UZ7gwqC4dfuOpHygtsl\r\n8bylw/qt7zzCbJq1WNjxjp/WjotTczThycfjd6GRt69O8AmPc70Om2R2KYXd\r\naUTleV8OMzffVASNQTjCgKIv46thsF15tZy8Kd9kxxkTWEVquszIjhtbvusU\r\nFHdZNcMzUdwwRjqMS1caO9avEc7lsz2w+g5xAOtqtbYi+ja2hOkjWb81Nr+U\r\nvvBX08okM+5ZaYGfgHUDcMLBJjKU2e9n1Vw=\r\n=bJkv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.6-next.1a851cb.0_1652116433587_0.09311829514255732"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.5.6":{"name":"@kaname-png/revoltx","version":"1.5.6","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"5758b382dc3851967da28853bf5bfc5986588426","_id":"@kaname-png/revoltx@1.5.6","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-x0aDUnhETp5d2NC6XjKJTRoKWc2L2o09NvBO5CCp9Hu1czUI7h66oWRvJQCtqVYm3OH09ajDZWfryl/pjN7EhA==","shasum":"66cc9bfac3d9d3d4a51f7f80131d3a7d990c6a8e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.6.tgz","fileCount":347,"unpackedSize":351966,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDKRhHknj498z12JY8SfvpLhCyCymDn8e08GZsTD5AqwIhAJWjCHoPXa9o1F6A00na/Odvco5UdWSMf4DhtpRFNXQc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieU8nACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJwQ//US+pN8VCbatWYNHFC2JTOpL40PdPiBDspOy7JCb7isu4M6G9\r\nQWEGQyeEqNp9BrPmeq8s6lrlJH+mG1yWdJy6E+H8iK5Z6r1pEG3dPQU49QgI\r\nxt57YUnt0DOt708k0l17OlpEiHY0XTbfiL4EyoeWUta74Tg98GsjcRRFI48K\r\nea6+k7JNIORp56meDadM8IXBaKa3+gbnBwbkDIbFq2pvgl5qVbwRboC6LfaQ\r\nSvGaloeqbWBjVnGZWpQxtGBBo1niUeavBxPbVTT6jBw6spIqNDcxVK0XuTjV\r\nRoEdaOG/F2jjTiHswFTHD7H7t8tqbGmFIA4+HzJmXAJzEwyX6ozU619jJeOr\r\niCPphiamIz2beEgQ4qRl1YnrHz4WZjrjOKftFZdLVjvbgg1k3jmr7CmDjxZH\r\nOPShR2u2b9uL3RlQbT1ItGTIj1ILUtC74PYLZzif4isIeBhTxuYyg1YxbaCb\r\nEFzI2bqIFFiuoNn4rbQJDa5wfMAvl93T7NjsNreOtY3pThnh/i3ySf4Yeqxg\r\nYNrUe4GchxzHpMfZ2botD+Xnsc6jRORIr+zKZCKml10K17USlHfOSljNIX6i\r\n6OYhUQBEuvPTGmXwe71nAeK8pMJcq6xaO1fYEinSc0FvUN2OgKI7XTFRMXFK\r\nRN6bm67hZPLthihRqnTZOeIobZfoNBZKkjA=\r\n=g1tQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.6_1652117286834_0.672621346643433"},"_hasShrinkwrap":false},"1.5.7-next.5758b38.0":{"name":"@kaname-png/revoltx","version":"1.5.7-next.5758b38.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"yarn build","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5758b382dc3851967da28853bf5bfc5986588426","_id":"@kaname-png/revoltx@1.5.7-next.5758b38.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-5Ncz/s4++7AGnZxCxSwwkxcgUxvNIPSxbc70eZltBKbyQWZGDPRMuw3xgq//IReV2p8WVuLPSONr+58tzxld8Q==","shasum":"e41bee96645aaf79165cc8041bc83692092206f8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.5.7-next.5758b38.0.tgz","fileCount":347,"unpackedSize":351843,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHKPGYxvWGTudkKu2RYlKXI6lUja1gIZfZtXMh2yCEikAiBLK62ROCuWoJYVFHnM4fta7pu91CkeOUL+zpVEEWN1XA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieU9CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDQg/+LV7jzGgmt13JVWDg/fNbYsU3nNoH9NUgK43z/GuNSFUm+SOv\r\nXB6XrDE0pEvvorxdazXcxIMcFcVSNSiAsgwdIdAOFc6iObSE0fX/mVuXLEaG\r\n/WSXUuBL3VIuJYDUfJiKZT8d0izO9ktVpg80wmb7y47qiT3QllAIqiJP1JUu\r\nwLvrsN+ObOGnVZlgxOcNWckBnRBXz6ddROTDOxXfx9Z/sKtAtQuKX7yk+VmJ\r\naHFd6lX6uXPfPpOpENP0xOIM22vrTvNP2CgyKNKVp9BJ6mnf2CybVFxuzDhe\r\nhtWr9/3NZ2omnlZHh7iZGEBMs3pL+M0CzdEsoD6+5WDONLP0ExAtZBJ1PJVZ\r\nUzZ41rBHOhXUuNKc5tQXnUUHbbuDehNPXBV1zuiUjokhGkxVirGz+aa9zx1b\r\nZjT02XellpV7FdHWKiqMhFK4fTrk6SgJFR4TZfFK5SojELqK8lbQzdY7TAtB\r\n1mN3SfR2udRG73cMWtG11Ag7pM7T5JMxgBhfgyhJcKtqn90WVjIwPt915Z0e\r\n1hYHG1Q/Kg4s2307ZRDzwU4G8IjYyhGjWO9BmQQneTvoRrJ+egN2lowTW3uK\r\ntZT48WcBqdHfRMXYUt48qBDLC55f7Ocwe5MmPJboe4NESmexlcUfSdJ2Wma9\r\nI01or2IIsIgs/7qMuUrXcrh/RCGM75qaTzs=\r\n=rr0Y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.5.7-next.5758b38.0_1652117314326_0.23545985124639346"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.0":{"name":"@kaname-png/revoltx","version":"1.6.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","gitHead":"d34eb32724b59828958c1d787b1b7961e277a742","_id":"@kaname-png/revoltx@1.6.0","_nodeVersion":"18.0.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-kx4QGhwJOfv17oneu5f0kuEKn8jSyuDPGwKwUxFh4iTiRfoO0wf9O/4fhdgN6sa0RDfWuCbMZWUKi3mwwIqU1g==","shasum":"1658b966ac798866f545848b8323096abe754fb4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.0.tgz","fileCount":176,"unpackedSize":267110,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHW6ZFetNb4X70I8roMPUuesiOiHBxz0pAKS9OYEWf7RAiEA1YuIUIZ+F4Gio0x2cpjGVRDhj2Z82edz/uwfES4u/Nk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieae/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkkA//cTAeuk1Agj7Bu0vs1/eYVZP+kztlJV8vBa0U6SUe9kujxRow\r\n+RvWKjDLVvyKm9i6hdAZvzGH9ue5yl3EMc0f1KfztK0HoToX4THV8ar/aoTL\r\nr7KchXG8O0nfNLHHljWX2eWD7P4OIIc5s6I/mZ3V7OvvZPaMSDYKyyRl/09n\r\nj3s93MTjOO+NpcVQgdbgNDF3bCZ8CzHaDv6oWuUxKRq5+N61k4O+8OF7n4GH\r\nU6ZXXU19dkeMjdPdOtUvzxc2DvYezHlZcT+KsV4HQgt5U1I23vNZZXMthNUm\r\nzzKMIZ2+ak2+N22dW75E94kuK3D+JCjNbdZsVtNSiuhuOWeRILr+Xx7m5iPO\r\nSdC9xdN2l55lDm/yxyGrL6/5uw8djTVD+xelNuViz2/z89vWCh+RUwUfnBT/\r\nuRKaGjy/ZdQVO2YCmPk5vy+4Cxgrurlq6rUwnloIpx+Dw/kFFlsU5pG0XOTC\r\nPVg9tUv1xqrjMd4EWLJu5eyno7c5HKFBRNB6BeVqwNfYq7SRksy9tTYfMnXE\r\nqjNSyQY4lLG7HJDmqAzmNS0TXtUaWYWsnlq+OItrYg8L+h9+Rv7/E3Ihjn3o\r\nL8HQyS7f6CQJjdaVcPAYfcctKvSOdhnj3CWltKZRNM0QfeRxplnKgT40NnEv\r\nHZwlVxirQqa5E3Mq2iSYRSa+aBzLaxwUNic=\r\n=M/l4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.0_1652139966908_0.7048037118036632"},"_hasShrinkwrap":false},"1.6.1-next.d34eb32.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.d34eb32.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d34eb32724b59828958c1d787b1b7961e277a742","_id":"@kaname-png/revoltx@1.6.1-next.d34eb32.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-794/zI0XqwdqZTAO0HAyRAmhxYDRJaSb6fuWldAYL0I5kXGsxVJWvAySPy+1SDfaXpd1uDHoP1lcD12KLjDzuw==","shasum":"19be6025db81aaeca824c7fc6498673ae921c14c","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.d34eb32.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEvqRB90mzNo43qSyPJ6K18xvMg7yHK3bgyxySzBbXyQIhAJndvFmrry43DlXz/6g57xC2FrocKUntA7DMhLd+7e84"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJieag1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmozoRAAmosQ+dhJX2r30PrgUiE3hy9U01r0ZuMH8XQuug0aCptP8qDD\r\nXm5Jj2CTnlrEW/7JdKgCIQtVXMMwyaq+ewEf5tRK6cRHNDeHh9nQxGQRBKIj\r\nMp9VwhmahgUb9pbBxdq9zIGvi/CWsPQRLO+nNF2VqRTwvAoVPb7lyHV6mENP\r\nY+DfKTlYIICSOXcfrUeoIYaoFsAERH/zMol6coGd2oJCJiwvVVm/klmZB/3d\r\nGUQHC4v2F6Bg7kx55qlU2lMPcEvePSaU9HFrWcJnqtPcTblGrG+m/Ps0ohOM\r\nhIUI5WRqYHAqQxJTu9sHX7yR9Da2SStim4J/Evf3Qt7i35pCX9w1vNnQ588n\r\nPRxxEFkT7RMl1I+fScV3e1InhknoOucHS0uq60m4wnZiH2F5Ztdb06U/zBcS\r\n/UgjyasE0axShHnX3sN51eziikL8zfedupf6Mb/RlmKe2Na3NplG1ibGPdkE\r\nXmkspoYt9k1r1EPfNG4oYW/7v2GhKVa9ej4hKZ+aKfSqY5UQQKYiCusLK6aD\r\n2FjbMyYcVg17tejnI/BpkqZ/tcUU/SMh2+0T22kFVRb7/hRNOYqn90iJVdDY\r\nvBO3S7xH6qcoICLu/dhEpS+cXG44RpNeLxx3BOOS8VkZwUO0wGGtqaOK5Orb\r\n6TPsF7G44si+yvnNZyRqyEHT8oOQE8CZR3U=\r\n=0PBR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.d34eb32.0_1652140085037_0.06308211152208587"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.f373ef3.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.f373ef3.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"f373ef3b30ae2183abcf7826685abee89d1492e3","_id":"@kaname-png/revoltx@1.6.1-next.f373ef3.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-YkvxS7mqlHsG7KTXVRiPokpesiUM/J2SBpRhuUpsID2H05mO/hvFIVbRllVnCNMU+Lky3cAOFl/GTBeQUByIOQ==","shasum":"0d27383321a75b49b1ce5976a933fb2cb377652a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.f373ef3.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgMEyNzYvOr9ei9eszTdacG2aXoSZt+UcjSaDcTkm2VAIgC1Y6aTjmfE8xWvnEVAZ7Yxzz/Cl0jtld02QSzBbXurA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifbajACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZhQ//UYTTxkplCcXx1duhLWv5FseTbxa528pOB+E9JsNpmyJHFk0l\r\n7o6W1c9al62h/iadHl0hlNAcwoClRobhiWkPdl1bm8NLwva6LV6zse7TTkB9\r\n3ldCUFKl+U+k8TC9qjk8EA+rZ0S+vM5Ma8+PemPlhRHhoLqzxXjgsZdoPHGV\r\nmE+U0qCcxp2CymcsVPUNd9+OEuofbkFy6V6ETQ7zl3uQWgNv8z8O/fuNajxj\r\nwNYtK8g4rgjh1YURSZxpBFOn1AFUPowuC3xJPy7QNDkOgY/I100gJdQuFjDL\r\npJlCGCqVc8T9u393DMIyKjqYAfoc1ATuI/2aY/pU3SmOexgQZoX8I4e56fqU\r\nSQejvZsEq1gpxuS6v186I/rOCAXD8oO0Li6JGAoa5eC9alEFpH4EFQVJ2vBK\r\noUYaEF8de7z52f1ggQ2hXJ4nyz/HVattVr0qaHyUFrvfPeP0uOtCKhGfQVto\r\ng0+veMP3tAtwNFbFPRyoxQqWyQdrkfLIVd93IcuclEpDzxJPSRraYntHq2A2\r\nxDeg13JbXfeStlMVmRljLGARLuqHR2/Y4fb+KrOA+Vz6IxVyFE4qGtR4e8Ma\r\nEQx6Bfou/KQLVdkAOK0U2Cbl1+PNqXB/LmNHrLNCLoYTZGZkmO65idBV+qDz\r\nvVWrW+HMXmZwgbSGV0EZgcsmkuOffUXrbT0=\r\n=AHUh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.f373ef3.0_1652405922839_0.4989156099244254"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.7836913.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.7836913.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^7.0.4","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"78369130fdafedc441520a8796657c7c62a3e9fc","_id":"@kaname-png/revoltx@1.6.1-next.7836913.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-7MME7uHCvee2f91yqD3IXUeMm4G0h2OpIRuZHxpO4KQchXxFhz1MTpJXjN8nSONUx7I4BXp5ZktUHEGGf8F4QA==","shasum":"8caa21f7fcd5c058ec7ce46748c94ff96e53b64c","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.7836913.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDI8Pd2OoCpTDqxwbCjf2Q3XO1vTLLBfSNQfHwSb+HkqAIgBIrk8L7m4Pc9mptQpsTrYGuZqj2XXN9pF68BAdj+6rw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifbbqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroHRAAkrdOxdIU30qn3MaYpkajPY8yaOkIy6kfJVIL3yUcY2ySbELE\r\nAbq6YDhn9/XlGpxqjqCOs3uZuGJLuijfMKEX8osY0RUrDx1n+a0u+xVaI8Ed\r\nsQoC1ujK42sAWY5lzoCkvR52zWoh/970X7kVgkZum7RbNZRteQPMIE34R0Fr\r\n42p+Fa+o/V29xVAvCu1NPhaJbRxNRcvaGjR8VaZD8L7rEvTN7eMxnax90SuK\r\nxK2zpfRGuM5tqQuybm5QKvxp0/uZs7CywNTzC6NC3VvITIWY6zO3gUvbWubq\r\nXFOQw508Fa7cprcdjvnTp1hS2n3SOXhxUYeuFD79Xz1SU0w6HP50nTZdK2nl\r\n/Q2jEnBkLXMHm4xywzU7XEmhIf/+kfyFZLxRkoH4uvN85c28bHn7Kec86Ahj\r\n5C8nIIMquZ9kwrqCtAFG3aOE9mxWtiR2Z9g+2JlMs9O+yZStRHN1naZbuFxY\r\n2YtPZ4idFBGHh/ptHbBNw6lWldrK4jsoutuYXIvIEtQAkwFDPnEaAzTGBqdE\r\nqiDsYLl+frDhb7uLEhkXhrioygcK2TllLbU7VG22S4EeiP+hHkEvAGfzzifm\r\njAU7dp+56uhjS4lfAuP7/J8tabZk1bzfDiq+iAWOr9Zxvtb4QUs7PuZxmxK5\r\nyPT4g2C3g6v9K6FOrPknKCg64Enuy8P7wV4=\r\n=j/TN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.7836913.0_1652405994609_0.01890766833252222"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.dcec624.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.dcec624.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.22.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"dcec6241f5dcf3b96d452949c632f099577799c9","_id":"@kaname-png/revoltx@1.6.1-next.dcec624.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-LtsIBALEqfvbYRCk1Pb8ms9JVlh4RWeQ3hofD5Btut7/ZrTA0ziqMXDgASE8Q/63/xZCwM3yofXt8ATvM0kX7g==","shasum":"75049cd1651eab977a84c232d03148ff7642db69","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.dcec624.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEWlZmEyWTeET6IIGqBiY3N8/pkPujQWvL26WdXhg1ZjAiAW9hksL4QJ7iuZge4CbZ+S2o9B4hkWMgJELvkYTMm+Uw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifbeDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpTjw//TRpDZl3kp7Zvhx5vRb04GImz60Sovi1IKjhCk+fNuTYtAxX+\r\n3GaglmEfxn/9VL/RU2rlHXTZfDhqD0ZRcmdbtKu7ofHPSIneYLE4R4DdScxD\r\nLpmwjw+ZMZaHggUpo5EnQAL1qpzhCNMJi5y4gBOS4ElGXI1JvHRKKYryX1L3\r\nkqX03FkHjQgufNS0haLsOEbA3XZK+u5xBHDP9XD8VysmxqeF6mrZlcmNe01Y\r\niQCuThWCVuAnGN8ws0Ee76yeznm4TNJVVFjw6mYXEOxbKNoq4oFvLZGFpNGD\r\ndrBLz0Xo3p3KZvaEnB6wvlML2eyCYrOL790tnYPab1mQGX76IN06BP4og+zZ\r\n/hY41U+ipqnzRSeBsfe1NTt5w/bGmgVr9g+YWwaL37TPh/ZU2nqv2W5tPozb\r\n2y45eXDotaZR48N2bgNsO2KMgjrINhC4thH6YwNna5QT9v2ojUg8Q3k53Ccf\r\nqOOsgHcMVPZGLsIt00UxlOXoxdheG1yGw+pyVCT33EFJOIImyysIq2TqH4BU\r\nMHyEUE5nKuK69+AcfDrFDvHkZ/qgD3pQ3CXbQXIihhveL9ft3rArWAvubjKn\r\ne+Yk3CAt+jBfsWLzQIEdB5kbCvX17tWla8GeX4It9KcjkKHVTbiRhBDZ0Wch\r\ne25luwA1ArQLwNl4r323EHmY8+IBS4hhMvA=\r\n=mSMy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.dcec624.0_1652406147578_0.9170749624905592"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.a627682.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.a627682.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.2.4","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.8.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a627682eba4bcdc561559fcd6b3184e2e0b869e4","_id":"@kaname-png/revoltx@1.6.1-next.a627682.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-IhAYtqkIzyw9yQmchFN+TG6/yOTd59NeHF1aNUG5xCEuGy3KG4Mmcn8cPnaPProOyQBl1OQ+/kc/KhYTRCpOvA==","shasum":"851bc92e53e41e5fd717c99395aca6454be78455","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.a627682.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD5gbQTIFa79C43oHXwzy0fEOHqOIQcWCxhbGxVYuIEUgIhAITW2ahZOJBucsgG0Q1QT182za6/RxPm9/JaZkPz9WVZ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifbj4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpa5Q//TsYKkeu0Dh+sGEWVnBefM5j1kqX7fZclAtTj/B1gsQQ7L2N8\r\n3qlyAgiY7zfJVU1gSSVe4wHTS+ulR+jSrvjv8taj51rI6od13hK7p2R1n/C/\r\n/GCU82+PVRCvzjI6w67500eN1EpHoOkxbwLEo5T/GkqdgVQ7L/cUZGFTpBeY\r\nxw4hxIRfSqw6SCWrAOckautlybzBTPGx4VM4VgvHhrwdYNID14p6vO+W/hTo\r\nBt9oadiKi9ofeissBzSuGSsU9UtDFGMtnqnwnkyqlUffmV4TTfrf6SMO4Vzb\r\n+lARPhZ3Cl9ADYxsy6AeCsF5YgAuN5IXnL/33pT0ekgx2tJeeRhnmignnnXQ\r\nkk4eembDPt6jax6EzIOHOIT+1qmY1KFiZ97ee+zQh4jGrH9y6nvX+MibVsYl\r\nJry6BaBcLts++ZhcxQnVsS2bpG3aCFUxJstFcEHR3YILip2QHFpBB/uXM4it\r\nM9g35p9DGy31Ypn9E7RZPL9Yu7aPurrtGojKxLYIrElpnF4fzvzIWlW91qoI\r\nildCAOzVkG0pOO2Rhb7F1VveA0XAXOdWMWdr3X4O/WY164cATmo61GlUsF2H\r\nRgk4QJTsJmO6LLFgCfmdJyVAhefkxrMFGJiPJF+2xzXZC5IlqMV+lsjIRMIO\r\nxuYV/EhP/07yosxMFHDcp3vf+uCXB3NZiac=\r\n=mcby\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.a627682.0_1652406520726_0.42097770969362114"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.fd7cbe5.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.fd7cbe5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.3.0","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.4","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"fd7cbe599cdc34efcea299afd49511bac92fa199","_id":"@kaname-png/revoltx@1.6.1-next.fd7cbe5.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-jt1v1MauQxtEoidQaInB1sPCbsj/G0RPEiKyAe+dlSNmDk5TlpstoOjBJk5IEtyEh49kaPb9tF1wfZVpIku4nw==","shasum":"dd7be4d4ac17cd1ab55043920291fb7820a106a5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.fd7cbe5.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPI5VAyRaEt10FIDqjnhBb/9IWU9uWt0v7RsYNUzIvBAIgZ3s+PqdbMbeJPoPwQ1JVETtnQMtWcKwp2GZgNheuzEM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJigHk6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrE5Q/+OvVa3uG0VtSX99gYhueCoauZ732MUDkvT0s0MjcNFcA4gE3Y\r\ndU4rycra1xsH0U8KmjnefMbty2RiDFNW7SNQYvDZyHQQNhuYG2fXXJ2Qh2MU\r\nVGEuKN+dlr7hrJLkzHadEZlXBRUCfTF3NswI5yuSPXlHVm8pVmAdH13tzVgJ\r\nv9T07Q5Zd58blZiMafgt8FrRbna68/LipNqUgIGns/ZLdt0mG6DSaU/O0BWY\r\n/JVxe3kzW0p+ZTpsKTi+bNi89+cdqR1hXiBxtuhsrYl2X4myAPStMmf6bSf9\r\njRfS5ye+L5vB1jL57Ec7Z9oD6TIn8TtsxKV1UcJQJAIPLnUU3S2tX7MayBid\r\ndDnmVfV7LsGWHNpyEznlVkfwzPb5JFtgc9rnWcOS+jzm6rYKXnSvC43Ql0Lg\r\nIvjJ7V1AgBZJ7Cs3daWJ7pzyEQAiHGvfFrdmaeCGX9bUFASdDiH3OhmSPoyX\r\nidL6VWb1NbAhnTrAPhN9VEPlSSGPM6l+2cZE3m0qOzz6u/c4GZMO0FAKTFUE\r\nGvz3fKptQJQHK+Uc80BEsEvBim1ofu8bMpwERhlH09qw45LTYXjl8EYlgkoi\r\nI9cLKITj6wlfuwIqSRI7hYWwmXztL2gHDpotHDeBbrMiV7hYN6nD68Pf6QDo\r\n63h6EO5Ju4rVxoj7sAtDJTRLWQ8cfPOOe24=\r\n=L+uM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.fd7cbe5.0_1652586810071_0.6221176639067627"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.5bc7f46.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.5bc7f46.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.3.0","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5bc7f46d86f9a9e4599e43123320ce0a508af063","_id":"@kaname-png/revoltx@1.6.1-next.5bc7f46.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-eBvsPEjiY3hVxKW38Vrwr5Td0oacnqogp4wrCrroVzpUEvCTA4pkAXvg4xZG0IkjtYj2+Af3jE4jZh9VKXg+BQ==","shasum":"738cf83ac38b8a5536e4c2a12ce8242f6eeb6b86","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.5bc7f46.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMmjaUizSRLJI6ROeLPaXhZNvN0677B8lfug8lr2Ya8AIgd2HtPIMblHRjCeSNJnotirTcS1Hxs8FEl/9NtitX4L4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJigPx9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJKA//aAdGawkpW309JNy1CZVBdj7Aq+daIxudJdASDN+/mXij0li/\r\nWVLBNVsEtDYpzA1iZdxMPIsH+Aae5QjOWFVko92m80kAfn6W3OcEgEjb3tVB\r\nag4DcXupqA/9PH6ys10w+yOHiRVd5HEq9GVze9GnEfEa8cSFJpbhhMI2d9Vb\r\nUMcrd9EvSNBOHfKXO9xrC2quT6lzu7XStQIGJUWNCW8TsfhazclIM2JufhDV\r\nnUuSlqoe9J17160DFeFmlkw303bLpiGn5HCsg3QqTkU5TBLvm9mXXr4JYU/M\r\nbG1vf138khocMm6hOcw3VOGar99q+ozmBvGxsARiobYCE3Z42Rce3jWcLxac\r\nL5sn9PM9RkFaSrYEMPud3G7nSGK5X7BJHCV+OxNPh2blLze+I/U0S6xlxYil\r\nynWhCSiZi+XCB7/n3WKL3i/EyuKo2KjZoiMb2eB/qZ85bOznM0tbkI0pkAzT\r\nEh1XZgMIrf0xLzZhVVpR6uOiq1pc7F4sun2V+XZwBsdg/47keleOBETlQbRy\r\ns6Z35+1WjC6GwaXDLbNDfcJPLE0v63oM74fVISBQ/Ckr9IWt3htz/jbMGuff\r\nVb1a2hf9PQGtQjF38YZsVXhc40HL8sOtOw12BVZ7gxGjcP6JptBmy14D5aEx\r\nDL+PZ6b7cXn5bRw+nI/YUwMk7Tb3XXes7RI=\r\n=YrwK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.5bc7f46.0_1652620413275_0.7514457049503109"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.0ff860a.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.0ff860a.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.3.0","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0ff860ab5441e6832d6cd8cadcbc0a44a8054082","_id":"@kaname-png/revoltx@1.6.1-next.0ff860a.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-CSXTd3DWJPSMtQlwkPbl3HqiheANI3JNFBuKtODm9+QVWZ2Dg+1n0LLbs09S4T/nVpGt7LXe2BHjXFBX4SV+MQ==","shasum":"f90f63dc9dff97d7cd59ee7cb56d4057bfc288f8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.0ff860a.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFW8nvT8cf7XfJJJQmAj6Qe8XNbFuTcc7Efx71zLZG/rAiBb9U3fXHIHv/gCljhcZjTJlp1TwJkLDCvVI0jtczNRWQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihSIzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoX7A/7BGoTLENSrwlHe8/bUHSD0GxuM2qHlOfZC5jlmMHelpRSNCth\r\ntHiFOyQzwoixbH8lPc2B+F9uSF2hCkI6xIuLY6PtSEJvMW493uMB58V5hLSf\r\nd8Hzkj5L6UPhg6/TVYg2hjPcy9qYy3Wsso95VaUtLnvo1/25VLUwMyjuSBpd\r\nrtP+MM2XRtPwEd7rvFRF3kCvGdvwMW4Orz336/kOukela+RQISjH+VOu0P5O\r\nefXF+CCwj2fq1oGHGqWaSMTGWTq+6cRcHD7Taj+OQyrQQ5CZ/gw5GRqsMrQr\r\npDIjT6VsHjMgLeApF/THimnSIBxFAeyGEC2IggWYVTxKixi7b8ZpcSq4LPVn\r\ni5gYuGaM2OELr06FoeuhCWmaWhF9AGZWly4bQ0KuNzIXvu1IctfdcPdqTjbu\r\nvP+NIpHuVcam4F47VOPW2ViiEojDI824OQXdzEINsqFkZ3dKZRGfK9Fpwk52\r\nz15F8aKSofwz8fYXeznc7BAGGoYj9WDmhTbV3xgwAIwirMSNr/DN2q4T4eFk\r\nqwK0IytipiuJ0VaOeCFXm6h/7a408fK7uXdVNcfzarXnA+1oLLCH6K2Azv4K\r\n9UV/SrlKjwsHe/Lid0GsrkWTkkrhd7z0kN+GwNIiqgkmtgqGbAxR1eOHdjvz\r\nXUJnAJfWwnwnmwq0deI/BTDnMFGlzBv+DD0=\r\n=dVBH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.0ff860a.0_1652892210847_0.7387041832299497"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.eead66b.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.eead66b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.3.0","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"eead66b25aa1ca189aaa3da8b6ccf8403b8e0e68","_id":"@kaname-png/revoltx@1.6.1-next.eead66b.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-foBWNTNfAFqPsk57xRQX/KG6PDo4EM4Xgoyt/hKF3TlaSvIAsz52JO3P/W7t3VGsrPODaD9lafH5gcXE9TZ+ww==","shasum":"2c91fc1e11e7ee0395c8feefef2165e3604a94da","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.eead66b.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDwPL2ZsPWkSMcyPD5jQAtdbLD6ffTq3cfiBLw6XeTvsAiEA/2pi62dDf5wJbCRw5cFjw/cZSN7MC8jkSu/VDmCmiok="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihSJjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUXQ//Y1T6idyHYyq7MjhVLozEBouIdZorGXHJvDVPk9rCd/FFfvim\r\ntYPUjXbBhTIJovELZFpwkoH1tX8pYHipC7KzP01b/5TtYctHhF1OOsvtbzup\r\nlpAZks85yPW0pEktXJjuXk0EWDmK3CHjO+uyjmK1UidUA5ldCA1DeO2v551u\r\nvJN0i+YzKH3Ywgu9WX+eFrZQOgNxdHZll474cMfXNSDncUxIzwHmn7zEOD9B\r\ncTjYlTMA/9jRslfvBsXPRI84QoglA2xioe29xxlT+yPgFoIsEMhkhtAC/XKM\r\nn4OnkxJ0cf7wNfqxptW1KuNtJMb0ONzUg6fXXh8nI9uVb4YSGRNjzY/lLlPe\r\nbaIgjDBpGCprqfLFLU7zLsAmUxysUQZ7LzOmZJeNPo1UFcvGsrugy6M+LVoT\r\nmJls9ae7lb0v9Fks24OwrYX1Zxek5unEa/IpPCff8z/2/lo6mhlWuanAMBuq\r\nTcnv601fTTOr/XkJvy9hQeVehkFLMZ00Skv1yE+QuJz5sC6iBi/47D3Lv1Zu\r\nyjHi/eJUyTfrRmIGY4EB8CRKZi8d+zUzT+QUvXCBjPbhx83D7kxwu+csYYT0\r\nZVMUmLcvcHoT1p39mmX39LCUmqyMSwdpCiDGydFDdtueEPKGYfSiSuTw+wdS\r\nb3QndA8WcbBgjUcWgWfjI+K9bDumiSPSDJI=\r\n=OP6x\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.eead66b.0_1652892258990_0.21524987949770513"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.8642a62.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.8642a62.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^16.3.0","@commitlint/config-conventional":"^16.2.4","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.25.0","@typescript-eslint/parser":"^5.25.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8642a62e44c44691349faf46a826cdaad120205e","_id":"@kaname-png/revoltx@1.6.1-next.8642a62.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-fRrX3Jvx1jwD6nD2cFGOG9FUEacT72uEjdOweonVIcxO7cQLAR4m+G+4Ue+/B4kw2N51QzpGNf/NiuBGHXDl5A==","shasum":"66484592ecaa4a074848d33325864aa99d115121","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.8642a62.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFpFWLbzz/BQH0NeNEyNc3nHPbJZ1OKWLnFrVivO+i1QIhAJ458xpObh1yKPGoFhENrGnYhEMAHfYCUo/tjGhE9OmG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihSLQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrowRAAjmfdP8TylEq5OrZOCLWeSzNVrCGLcW6fqWjjxldufGXHrUVq\r\nXarMe7OvKoHk9WtisHZYDhrRzOer2ctP7Yyu+Ws8/O/fi79o4qqEzDG/CZCc\r\no7aMD+3/qbbbAA2OMj6X4c17Kanb9gppux9DkibxLsm48avNI6VCxfd3hoAb\r\nGYEWfUpSe2EXU3CmebE7itb9Br/9drPTxy/46JZtgoKCd7bruP9cUekRjfRI\r\nEeUITh9TbGrZMFxPw6L/USYlOY3sfbf/Jd3IYI35oIejQ+PWUrVYX+qoeldv\r\niYfbMgiBaIR1t+K/Brn/DdXs0Nny70WvJpDse/AvSZvRVdTNJvn9L6tVsEFZ\r\nS7zkWzMUzXiCeZIGlDKgdmeXnSus6L8EX8dNE8aVbqoSTkGYnQB5fzEc9Sil\r\nazKDO7I+JVkuZHfNRG2lrE9Cgk+br8LVTQvzeTBc6+rPwgHPcwX0YWTE5OHz\r\n8CIEMa7VNuth1/YlFPJQWXQsiMD6Q88ibKL5TWECeJkOhyDW+/cXE97Q0A0h\r\nPrmUmi9jIKXgygKKqGY9S3OlJAqIEUQ2TwFwVuVsBcTnJd7wiz7tQ/FotPxc\r\n6t76eL89Z3rqDKFXDf1Scw5TodbnaJNxZOncd3NkBAaI9PtImxulKjfaoj0X\r\n9M/V17/LKMBuF2ZHn+AEHK9TN2ieKhDmPEo=\r\n=tE0Y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.8642a62.0_1652892368015_0.9173169521492033"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.a3310f8.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.a3310f8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.0","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.25.0","@typescript-eslint/parser":"^5.25.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a3310f8320391c6ffd5402b4d407aa2b43a5e8ff","_id":"@kaname-png/revoltx@1.6.1-next.a3310f8.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-BhhfLzFiiRYI3f8rKfgVIAvZG9b3HZX2ArUryZ4Otcu8ZXc1hhYSB43DIqWU5pwCqYqyhX1TDctS1gfMsqKdig==","shasum":"1959f60b937adf1ec6c0f6c92bcd37c67b09bfb4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.a3310f8.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBowDcBk3vuBbOVmT5MPh4lcldYDH/MAXA336H+WBpPgIgQwynrK11ns+N988vung2Rd4bkqTGmzp5MaaHiEJt4iU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJihSMNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/Hw//f6e20tUf/LaY0uybpXikJ1ohxKZbGgaqJ1chazkEfWBLnV4f\r\nFpe9aZISFwVHQ8kqwt3YC38K1he8KWrLBgj10SWlluxuoJtTkwPS5inoKfFg\r\nGkSBcfQa8eENXzqnNMnX+OBvtUs13Ahvgrwt/nSZNfG6DXfrX4hYRADLHtLV\r\nYOEzLPlIYbHDmemGDdreBP4R4Gmus6hfHcT+ecnZP8lnQpNkIxrLVij4WuoX\r\nLtrKTdAXqaJ+ir1FQlS2zEVMNl1v7geuQpKfcnraix5R/TNKwgw+Gqac2qDX\r\nZS8jdDWzh/Mpe9hgx2j2ovnp7fRvVAdFH4VhBxO+RlBiHdn2nUq1Q0651+sK\r\nvuPDdsHsxn/Fq7VWZnhTESIHKRMPx+0F8VGOa8A05+Q6BBLWfjmJdYiKm9tL\r\nol0eKim1whaARGbsv3TDkkAeBAtjJoG4YxdGUl4ZtZT5sqggnQMo9dhdGyU4\r\nXQtxmnX73Y6h5i6lpmFa8zGnFq2K8iUltkXWWDS0XY2CD0EixSbsEdwiGC3x\r\nYtHtvxZF+QVLvWXvNniGUhATHvTryoriuXKORaibKL0XCWQTWneuDXC2H/RV\r\nlIE7d1Sa+8hVY7e/7Nq8etAbqqTnJaeBzhv1ikMQSMpM+Vhv2hZsqWYji6fU\r\n5roBvZzAGWK8OUcUokc0uiM9VTdZP4Di7ho=\r\n=j2IV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.a3310f8.0_1652892429310_0.40508305985449544"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.0edc677.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.0edc677.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.0","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.25.0","@typescript-eslint/parser":"^5.25.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.15.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.7.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0edc677f6c0b1db7e310192a9d33d881fa91af82","_id":"@kaname-png/revoltx@1.6.1-next.0edc677.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-EixzYukpRodN43vHmeCEtDAxnkYYEcU20bXvRZSQ911Zh9S1GJOt4vOKh3vjVvp+HFOTzynQbo+3rBXNqq8F3g==","shasum":"dce192c651aade057ff5eecb7d0d6655c103ab1e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.0edc677.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDecw4gff9ql7IhGjVuFEY4t8/0ejYnyorfnQYASd2cuQIhAJ/cMq0e9e33B1s8/POJULyjQM7lh7b8lVDD2YHRlEic"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiiaFIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4AA//Z+YAhbIPMzYeZ0umqxOqf3uaNyCGHY9D0kOmdm87ST1Bc+jm\r\nAUlv8nARlB6ijdMLBm41OdgXWL/bTKUB+LukUzreehjv4ZKPwyCBI39iJwlj\r\nRip9xXriBTVU0OWyA+22Qu5rZ9kuIpMfVDIq3GKcorKzWBh38uiCA/Fofs3v\r\n9rWa/oeJPTE9pnTClnf3vtuqgSHZjsKPFIAHnS6wUpuESeQOQjcMGhbExeCk\r\njiOI4/yHZgVZflsT507f7YJyIMM5yecwSVhi1PNsekErQ+256GiWAHhV+1gr\r\no6LQVQLVeKl9elDBOGRTo4fXNSfS8WlmWho5p2RUVxIP9gnGjJEQgUDlV32+\r\njESDjsBBNpEbx/I0eCDK5MJ4RxrV52xkV8TlGjnKsbLWyzo/pV4rbqLIdfxQ\r\n7kXPgBEybgzDF2+BkXh5eWUmODHm+7p1BDKMDPndwP1JzhOiYU5+brg3lVLM\r\npQnH0fmmQJRLZ5kKftLb3CmDK84K1iHpl2bGV56OH31Un0O4tEaoiYcytaXo\r\na1caRPZwSbJvoqBNbDMDqzo3bV279TwXnxzq/eltXlOkWFxWOj6276iVFCoE\r\nMuo/t2qj2Kiq5qxsynR1yPpWqNidGvfnS2O7yyC3l8c0W3hqM94w++/EHLTL\r\nn9ZOTStSdclAwKnNABAslhqxTeCGXvbpOT8=\r\n=+Wr0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.0edc677.0_1653186888397_0.8009909210621344"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.8ce7fcb.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.8ce7fcb.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.0","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.25.0","@typescript-eslint/parser":"^5.25.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.0","standard-version":"^9.3.2","ts-jest":"^28.0.2","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.6.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8ce7fcb9ced82bd4cb5d47b2699386eebdf18fca","_id":"@kaname-png/revoltx@1.6.1-next.8ce7fcb.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-n2loAwvnz8efrzDo/PJ6ZRAexMrbiODJtzNpe3UKRKLL5ukSp6NQ7o7yGluwwdEV132dLFVNCbSOz43VnEpcww==","shasum":"2a5434a9770168831677076228002cedc3d067c9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.8ce7fcb.0.tgz","fileCount":176,"unpackedSize":267101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCtxJIkb3Fo75PMKjncWHgtnDEWy58igOjaDCbW5MzmwIgGvCtfGhrZqVQh/xa24lv1XzrpRH6Kz7CmakohjcJkhU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiiaG/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7OQ/+LyIqchlvdH7qEJbRyxmQBCPjUIRpicvELaQyh/LJUNCLU5bT\r\n0dYocKVeVktjpS4PwxtMuOVg3SdYXucLE4iajuT9beuqte29t4L8YNXHd6Io\r\n6DS9Og88v7PYQcMYHQvhDHuzU6EVJhMucOgpAApT7vnkdWvSr2YBA/PDn72U\r\nb6JiwP6b3NCLcKUErYCUMSdSE8mh+StSSS1jIfxpKN89gFAhhupsb9XnGZWU\r\n+sCqHP5rFRyA5R7kQVaTGZf90vRnwThwIVJYnukYn4RQM1BuQEAEbGWmVAud\r\noG9lpShGoS3GVv2TW7nzMpz5h/YwIwVqhEy0cm+KyNXIvH2bnnW4J4khqU0o\r\ns7xcdMENmbJ5539V6kiKgr3hiV8gxoSIf1C3r6sMxyCvDzoW7NuChIudPFWP\r\nudApARNJi5r5KXw9WbB3PUNtY8ayEXpRBkEMWESgS1pUmLhmP7l8yp8Jr53p\r\nM+2jK9/pRNeiWJUWZIRkLUU5G1M6vezv82xIJsjJBL3BHHUtbtg2YkSMwZiy\r\nUKEJjKkWW0F40t/3Ach3DxJJNqRoVqCev9X3e365870khfgzDEt3dLwATpj9\r\ngZFKuzwFcmeUwvoC3v/nbmdI/9FpBWcHW6zSNx82G1ADLu/dCRkJOwwBOg5o\r\nVOpq+f4JMHrCk7gGQtpd0ST4UQQWe5O7gSM=\r\n=yOMA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.8ce7fcb.0_1653187007274_0.6365978949026658"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.b018f2f.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.b018f2f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.1","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.26.0","@typescript-eslint/parser":"^5.26.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.2","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"b018f2f411ea6169675331eb3d9fb6cd8a1a16e2","_id":"@kaname-png/revoltx@1.6.1-next.b018f2f.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-nNMTqlKa3xBZm89T05uCuHX2zthMhBtG5uZaU31yzCBXSQAajRKq7noU1AEESpbbfXI6ErMbI2WRFEn1X7Jdgw==","shasum":"1940f2ec1da5d36826f08f071891d56f6a74f7d4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.b018f2f.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAXRK0Q0ef9OO8Bd4WKbs5GNRYPaWV88u6LNRR3JsAUSAiEAzGFwkCqavmKaJG+93H58+2hoexPr9toiGfd/YY3J5vM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJikuzTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmox+Q//WwiQkwcGRrrZtuXt+6ot6P2la3D7fxiyCw7LV24pb+VHjMxi\r\nfqm5Y9TUxzk/+etOTCnNrx3DRypJ4Yv02TipJ2bad1N3+HNEUlPDSQDKm8bS\r\ntA/dqmskHtVJJTJEhhlgM/TusoGoDm4wWy7s24PH1P8FdcxU1J+T369PNBFo\r\nWXguOs2njBCnkG0Flo2qejImbh+Ljpd7+3KAKHxAHdvgMTgf7aDQ8glnSErs\r\nrFZxMrLLxJ56evEfi6WKH00x/5ASIiOUBQLB5dfCScQGB4Fqc3TKKAjHEaOr\r\n63mFMW7kQExjMzSiTGZ0I/EudQpINYyjAEVmQaqo2Bb8o0Iebuo2nldE805L\r\nJUeufIiFg8cVzbsX3qblyZB6bnAyVREhoI+ghI777jy1qTwSaehdi/HZqSPh\r\nLOt7ID/JcRO5RYkzcx4gyjk1dZ0PnXbZHMB/TrPL1iqDY5JSFlnM80t4rFau\r\nidXUilxPBHeaiXaKrCsn4a55IphaGOfDuBU3AK5dcdYQ1Sf7IX97Oco6gcvP\r\nS4n6T9pUPkr/6OMUfY6i1APDcy7s2fPi5tngPj+vXRk1ewiqvAmGPKHyq1JK\r\nOvLW1/MnTgob7w6pVTgufaFK0mfBrXCb9D+L0hqIWVMMfytVScC2R9qHwn0L\r\ng4UMfpjcavDdy6QqSU4NHFtBQNyVHCUVAec=\r\n=3VCg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.b018f2f.0_1653796051199_0.5658403991937142"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.c2a2065.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.c2a2065.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.1","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.26.0","@typescript-eslint/parser":"^5.26.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.2","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c2a206502da018c1e604f8a46759a2158edaf7bd","_id":"@kaname-png/revoltx@1.6.1-next.c2a2065.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-gR1XYLDG377bi8/qMOjqgogrDhg7nfYEImMW64yQ6huGoRffuUDLxAlhwYKLYQR03aPjEZJ60qQBZd3AcSQs5w==","shasum":"4505eaacf2e919b2f2d54423ea65a0c82ea453d9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.c2a2065.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNQQG0DusEfLoLbKWE6GjVrGUzIYIcySKjwHKKFk9XAgIgAUl3++QKv2izyBaHMl52993Pb62Y6498ap9LgBreWLc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJikvwmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqy4hAAnDAEtQjP6fIooHCCoTLL3U27ToV3u1zatL/n69/Dmnl/LNT3\r\n+MUzv37Bc7JpceJVkUwUL9QOluw5Dm1YRpxXh1uOkEBLOinFvZ6wNH/F4AxG\r\njek/7H2mS5f858btNc3dTy9jkyrH3GoyIv6xzqf+js+ow2OqOYxtbMLUMDvl\r\no4RR8otmwtJSgrunFDfIVGHzrGDpFp7VaZ12/SSMv7ISkyytCvIHogWgC/uS\r\npBm75qjmcMpPfnm1He8N+STYJ6rVOuHOQ54++pE5tesxswz1XMLV+lfMlerQ\r\nsR+oyty9V2lpjLXAK28XcxIaCubJM0lKy294keYkuuZAw9UPVt3Lli/R6JP4\r\nE420ZEa9rxtnsN9KNsF/nHVnKkjEitZ6Eatp7DMt/YQ/pn5oq13tgxs9BcNa\r\nwk8hk4O12aVf3bNz1xAKO0DypdvxiYm0WWbnbcbk4hadmBVletBOapYEfEJM\r\nP4s6F2vDnIGVazm+2rDJHoX8QHsCNg1FcfxOzd7rQek8ah7Viwfa1M8iNwFq\r\nENjz4uWONVy7Cue7LgURXt9HnSK9bdUeQesHh591/pe5bUq99PAPH1KvcdNK\r\nD2TqwLFlSJL+y+I4aUq4g1fTWJVISLt6D0SPSxN2hcTenttOFKcyw4A7GOVm\r\nQT5salWDtrdasexvL+Y1tsMuK4tFl6P1WV8=\r\n=2JDX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.c2a2065.0_1653799973875_0.8342396548271784"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1-next.54282cd.0":{"name":"@kaname-png/revoltx","version":"1.6.1-next.54282cd.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.1","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.26.0","@typescript-eslint/parser":"^5.26.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.2","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"54282cdf487bcaf49fc36f57ec74f28a230f0159","_id":"@kaname-png/revoltx@1.6.1-next.54282cd.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-QvcHmbF6/lDk/7fhUkx23WLQaslXJ9ALtZsIJ3WPzXySSZdmCm2gX+O49R32DeJTd0i6VkWdJ8iInzVKkZeOlw==","shasum":"336da6d9e2c3153706d6ebffff36ee4d556c786a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1-next.54282cd.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDHHBVduA5G6f2CCDmXq9IQgyVlJrPrrvmadiqFUMQD8AiEAvZYxL1ej7DevmifcCNxWB0/KC+acYd6reHCYpjeyyF4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJikvxwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgFBAAnhpFAHkOrseBQ7FawYp21iXmUKmtzVb+t+kgEpJEAdaa2x3Y\r\nTZraJMY0k9ZVUIsPn4/zqLjQTveEPwfW8A6wg9EPy5y6PbYLkJJLpVhk8BTM\r\nS/fNBPHKDnN+MN0o48qSBbd/AokQ9yvZL0ZZObtTwOXsX1V5hV5jGwpLsjwg\r\nUvJJO76HaHXVeFqgHV+WbSv8gGfrHOsiCDEMCK79HQkVYAKUoNQm486/V/QH\r\nozzX0CQ4dvtyYvCQ4LqhxbK88AGNkn6N4ultvkQIhRyqHlrah2VAIr/Vb2Tf\r\nXknz+GTqak6qgYEJ9yVoSEUn0yhbBBxbtQgt2ogIMhLqIfi41p34wGe2Ehkx\r\nfdyQvmphMNv9ndW0Ivvqu0wZ33Q8LRpZHW3n20SwwoSNpwRluT+doKkK/rn9\r\nioL+jj5pQKknfA/byYQUea3sl3quJFjVBTMYIaGjMVTCQggrE9cJdM2vwWrG\r\nMQpb+V01bkh2h4vOblu+RQGLuhsIjoT/peRHrgXJrqcPOOuJWpq522PWH9H2\r\n2UWp3nwyXAlPbAzKqM54GdHJOhDtntqR3ftRfDWuwHcKrVSLNSFdP4zqVKYs\r\nUs2zXfrv1Kaz3GOqzuDaKWGAHtMIglNJO/MS7XLzaxEfzSYuIsa1x7HSe29m\r\nRJoDea2Wkriivywtf2ydZhuiENkIzsmGoxw=\r\n=KlmG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1-next.54282cd.0_1653800047795_0.37357181869950495"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.1":{"name":"@kaname-png/revoltx","version":"1.6.1","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.1","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.26.0","@typescript-eslint/parser":"^5.26.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.2","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","gitHead":"c5906f8f93aae2b4f9ebbc00e6acd248ffa089ee","_id":"@kaname-png/revoltx@1.6.1","_nodeVersion":"18.1.0","_npmVersion":"8.7.0","dist":{"integrity":"sha512-yE/bgKgH1zzZAGl9YaihnWXUMcRauUD3g8N/Nco5+FeXcQUc1laD2vDOEmA2MpKFD0+JQ2vodZLeeZQycT38Cw==","shasum":"77da8986ca92240122fdef080bb1385ff5bc5fa6","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.1.tgz","fileCount":176,"unpackedSize":268093,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF0s9pyvrzDO/aCIbJ91OMkd+UrYIbrlUnOvvc7shZkUAiEA2g/a70x4hbMRkuTQLe/lHqKN740fHSt+oTU+JYJalMw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilO/XACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaLw/+PSWGtZE0TxjZ7fVN7gxbq3Q+3hmXegWNLMM8zhJ+qhbela9a\r\nLFvQlpMrVTsZXPA5Utz1zXypEHtuGKhRroO+A7IgYwHYgLOgPF/6ZNwqh5AR\r\n7YGz1mHw0iEltpGzjn/7uhjCgbTOOZ4FDRrXX2MtLoVxzXTX8Xo775/2Zeee\r\nXevu3RXa+wcobhoKBegUCri5ASslcT3vsqSJEQoUn0jYix7d+MOTHh1j389a\r\nbAmkk9BIMp5sOLI3lRCcsP8z3VTeNY8Ke57c9GJvQXZTdJ6SzBsPHgzju28S\r\nMi9ILVmMtYQhiBCGORZC/HtjUwrUsgbh+OxRdSo1wPdMY7PEJx+3+9PhJmuN\r\neJ+c48gjmAhh9pJGL4r2vdSjgF3fEfUibDS8LQtvDLrikH88/d7b1bQRJP2q\r\nQPOe1P1a5QwvWombKBvwrCT81F3/mC5kATXzRPMBlOTYpnQ/zP7UvgamS4Dk\r\n8JZdmZEQCjAf1MV7dh7xhjrqHRcGiHxvpQ/3NXbGH3qFNg5/1YPdBSg/Y01c\r\nKnThI7NmeYvz6M44eTZ308hF6hkBZVeBRt603QGfPd3DxUUbp1hRzwkbiDYH\r\nOlO/TU71GAy1r66BPkMhnR0n9YA/HJxqQ6KCwwa0YPwnaeBpiI1BA5TqI3Js\r\nQinmYcW8iPW8XFpBPW6ztI+HpEXNNsbMt7A=\r\n=VT2I\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.1_1653927895542_0.02236422846518349"},"_hasShrinkwrap":false},"1.6.2-next.c5906f8.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.c5906f8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.6.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.1","@commitlint/config-conventional":"^17.0.0","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.26.0","@typescript-eslint/parser":"^5.26.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.16.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.4.2","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c5906f8f93aae2b4f9ebbc00e6acd248ffa089ee","_id":"@kaname-png/revoltx@1.6.2-next.c5906f8.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-QoYNEvGs3BiNIahL/kC4gGk3q9wRQ7SuQOuMAs8Q5c0v+g7Lf862DkA0v/CVHfmdpeGvtRWNiR5l6cWX79Kd5Q==","shasum":"673c491b3fbbdabbb18bd848b578e9a2147a367c","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.c5906f8.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGz+9BJtbmsbiI/FpbuZDdGGMNEYWvuoeB333t8FaTD4AiBSUtFFdv64i2DeMTwhZ30+OI+7U+IWPRfEJwS7Co/9vQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilO/oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrXtw/+P+HPc2KjcAwrD9RaxfYc8Fxt2RALk6mFLCdczLPpe6vJ43Sm\r\nGPnQCeNTPgRpmau1hbeFImX3MhjSTQpxpKU9NKyTO5brRE+Aizs4eaD9eiTt\r\nB10G19s7SAjsFYmzr/245Z/414CNzj5mAIjXtob7diqVdyPpww5xgcRhhJ+2\r\nOnCExOozGkoDnFe+ZyzyA3LRjEHjAapCrj2FwC0GH7vIR48GT+Ni0im3gs+k\r\nRaORVEB2drmrS/gxoSG3PuRuZnZcqmgeulMq/xt1N/mmqXgYjcfYZdGLrWwr\r\necXtJb7OwldluV0Tjp3O8B4zUURtu/JFB/mnLO7QFyWVv3pt82HS/mHNy2OU\r\nRyWHb/NBlCttHO37k9EVmdqPPEQC93aUqhN1eR7oBXqLe0O3+eCatgRRdDmB\r\nqf579NnBjmATeSneL4gY3HIw8HfL2/BUYCUBhtRohc2d+mzBwrpEq291UARb\r\nbLgK5zZKnVT0UNt3b2bTeH5KblOsle5ytOSKxa20Tit+kal8DdhF0G/y0u4U\r\n1juqfpoIi0ITMXKKYE9RFcWHSHloKm7T8YrRqWYmZquFFCPHqkyDhfQo7aVx\r\ni2gOW8Rj/wfhjU8x3F4yfIJLZeaxnOhMTrgKR+AgNjbX55dIbcRhNOreozAw\r\nJspOavDrfrmTiFUDt/1IzX/Abpw97T9O/cM=\r\n=b+Gs\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.c5906f8.0_1653927912378_0.3552987175591773"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.0c380d1.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.0c380d1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.5","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^27.5.2","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.0","@typescript-eslint/parser":"^5.27.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.5.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0c380d1ebc01126a84470c387879841b7edcbee7","_id":"@kaname-png/revoltx@1.6.2-next.0c380d1.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-Rr+VquazrF50ut9Y5r3UFs8wHPeFjIpia7kqnc8g8zEcSs04Kd1c4Dg5v66P+dnQRfL36OqQOnhQbe0krb7pkQ==","shasum":"da20bc4f2297f8cb9047a5eeab637df8df07aeb7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.0c380d1.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClwb/TeUwnRkVNMOKOaqwpjgAMikcvNxSUAa5WyeM8mgIhAK1D+JHaybRbNtOYhMga48r0eCydiQjIiHQIgvrfeRok"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinDqrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxZA/5AAw8++vNAqi4PJ9ZXz2Y1yv+AOM8uLrHBPFUIP1Qz6QxdkQv\r\n6PJAHu7cwIewLODmTYnwJusG8ZBA9mLXWqzT3o+wH0pFm/nINJPpkxSR1JeC\r\nGlzJgsZSEVI9m2NLV4Iy13fRCCUW1L1KJ7Wmmw1F2dRYI3Sb9hGzfW/rmJXQ\r\ny1sI9+BG7hRwdnr2y22cRfwy6/IiFPLEPSyHSkKtLDDEVTZC3REUDJUlezMp\r\nWObzncAcVaE3TL5WevJGz9yd5GL0TIBNA4FftxZ2lbwefq5iu6aKzncYjLgR\r\nTT1iXAaWMblMYGG7ZKK4UeM4VbTJgaWwIFQjXikp4fjDhcBX3MdvYz6gxT0K\r\nl9G+rdBGOcOO+bHwXrJMka89/p7F3xnW9pwuHUQv/xlHOhNrvQXCRBGz2pCr\r\nw90NJOjal+D3eBhhvOEtP0Z58qjWzrdpP+LFYdL6Oa0o0Wr5BQ8jcnGaYJ+N\r\n1awunosr/VtGkVgf/sI9uYZNx/vuK3HSetxyG0CbM1yLLPFnqhJ1iL96P8iS\r\n+13USJF89dEDmxtqHXqrcDL+NB+1HxAucH6JeCJIML5rj9QjLpYJwn8bfQ5q\r\ndOg5okvSMccQgrexRNx6WOt2s5CraNxWzrgnCJIhDIPu5fIkgT9DC/qqVQhC\r\nCIsqV6ZQZw+EQVw392j9o36FVy/XbrgvNNo=\r\n=v8uq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.0c380d1.0_1654405803101_0.701926044267148"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.05f13cf.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.05f13cf.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.6","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.0","@typescript-eslint/parser":"^5.27.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.5.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"05f13cf293738815be6ad4d7cdb473d3d0437a84","_id":"@kaname-png/revoltx@1.6.2-next.05f13cf.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-ZFoyYDLtZdjAPC/9gXSwne7YGxS602O73Fr8mExIEr1yxJE4GTCI/BXFXALmXzPQD/bBTpXbf8Wyw8OcbEMUdA==","shasum":"37e3afabd845890720410bd2f0ebd9b8e5a9bf2e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.05f13cf.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOkV/JyI4cJtra917TnuBuYwsH6ScBHXCACdnCZ7v1cwIgRjkV1OIXqOX7KDY9M0eqbp0mNft95FLnwbCftDy0jWY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinEDvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoL0BAAjJQtnenNc/uDTklRIbCW0z6BPhU/Upygf90rKDaSm8okLnPZ\r\n57P3SslBkMdnAqnbG/cGcg8kKIYInlKmt+GD9t4Ts1fL1WPPHz6oH1PVCJnM\r\nHnSCOqrYzOmHG5zMPKsY4V9nbdJir8Y3Zp64MxOW57G037uZpF45fjRV3q1G\r\nfqV6xbWJ9yJBWKKWXLnVqyNTWQxfTc9Uv2aM+UZgaTZrPOrBef7km5SlC33K\r\n0HVAwTJKkIIW7KuEoI+DJWUPcTCCkHXerMuyWLhdnMXjQQa69EVEjBozDhOB\r\nk8Yh/LF4sP3UfUbWvC4UIo9KjG0ciG0ArXvZWFSwAt/Oh0OI8O9/eptEKBwq\r\nPT7H4jmaLVaHTlZSunZb58Ci3srrAnyPpqNd5ak8ZuXSleib/jbi3fL+dVDe\r\nktr3AvZqaPDb99k++7Us3y7RKAm+LrcdDzTMvn/bVXAIySBAMcHbbQz32Ktk\r\nL7siODl6npBG6UPEt/3f8/ydcGnYwu1BIe70mI6UdnZoCiDghe+0FjGP/wGt\r\n6JzInK80Qo5Ry8bcZGhfBigsNFORMr+gWl5j/yAIB23YeqNCeCZHqCbP8OmN\r\nQlTjapD1mwLftcX68lkbPoYNm24gCq1/MGT6oXvX+scOQvFDCER2USuh7Nfo\r\nHGxF0clfiWxGX6GxMwnTXhT2CbnuxvoaHAQ=\r\n=jfXH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.05f13cf.0_1654407407708_0.6109779469755343"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.ce67d71.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.ce67d71.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.6","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.0","@typescript-eslint/parser":"^5.27.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^12.5.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ce67d7132aa0ed402cd016084746ab6eb9b2e360","_id":"@kaname-png/revoltx@1.6.2-next.ce67d71.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-57j9h2PqhltoglapWt4cx40055/M/mAXRwDnUNc/yjQH08PfNDgZGyNMx6DqmkLM/kuWlanmDgWiz7umx1Ac2A==","shasum":"f4fc74ff6634142e74378bdc2fbd15c0375d32eb","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.ce67d71.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWWBvWEsHVhV1mffKnLc3CtF/XOTPNjVz7op7OLg0udQIgMKTtJRq733As4oA6cSKGBoAZsM273T6eDMeJsy2KpZE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinEESACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpdHg//ejMhc557YSO0zNcCMq1V0VLcrA4FN7AgUDpjDHWGOgv/65Th\r\n1sC4qyTQwe2B0T7UnLcta8akrpfLXDcxFWTVokF+1WYJkaQHayYOGr6GGI31\r\nr0t7AA5AYY6wR9uW/eGDKxgns9efIbcaStz+y6lI4XWHal1USnfaLjk6jxEi\r\nPtDcD/5wrDhe1CU4LAAVIKDFpi5MRr+6Za1HS7/9/6tkaxMicHlhAtLYd421\r\ng/RTmb/MNm7CcQ05TNwIYNtE2XqS+RRotyVdKT+q0dEFTKX4Eb2hxV8S1pAc\r\nBDRZ8LCb45ftoycC9JM+zqD2iMdh7x/R8Ix9rS1RZO+N8tP9e/D8B1qKoyyX\r\nYxbkWVqCe1MIyBsTfaGHF1BvdrZ/ko+Zq2+4e+DRfmRiUwjaYfaZAb871QN9\r\nXX1qCmbYFCJDgRCUysgbFHEcxaET9nx8hCV/llBELnxWLqCBiF0XXoHLEF4k\r\nGQVlle6Akcbjenl/QgWrAcIlT1QxO4SpMDyiqtrYXfRW9OaDFRhxuvckkr25\r\nOKAPMuxPdcWQTKyi4Wlyh+UCYCDLlqgOLYFepIoHPOmm4NrhiFWgoG2qVI3q\r\nr0YvqCsVZj8xBZFO3sddFC3yQn8c6c6ZAP9CVO9BSK0FaJkBCJ3eYYBwAxxs\r\ng42555EdEfcmLyN1Tk7xgpXxzEkM6uoLDp4=\r\n=Mr3q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.ce67d71.0_1654407442219_0.07890368303731488"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.0d2e9f7.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.0d2e9f7.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.6","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.0","@typescript-eslint/parser":"^5.27.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^13.0.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0d2e9f704c5d49688b036e5ed361745c4d8d2d45","_id":"@kaname-png/revoltx@1.6.2-next.0d2e9f7.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-/NXKixMuIDm3wLLaXin+HT08ifxK1NKeJfDOq0laK640jPOJy4pf6KDO5qv40zjLMeuZo5LMlE7yQtY621MCdw==","shasum":"b1435037a22bdc0817742ebc305340452d8a9486","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.0d2e9f7.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfYg0zNeZyWokcSzdvpCmPwhOr5pznqn7e9pRAg/vVowIhANAf3Z5X8qUE3Rk6ognSK9u2P8uSCTSe6Lc0jw31G59/"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinPtIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrftw//WyxEuhYUXMW6xG7MY3wZZDeSYCuaUb6diaTu/RMLIuuv0sjF\r\nsLS8HQl6Kbc3plzcPnKa2t54TxF9LONJVSXAyEyCtwFo8KQyIDpaNrk73BXC\r\noAGWUKABY+IlTJg9McGwhHTmhGNiAOLEfE1S1fdvJPzOY4S63XBdVZhfYpP2\r\nIGSnTNX77oTLx/TNNMUO++GqWvdFvjQ6YdNIALj3ENYBf/MvD+DwZYlwa/Gf\r\n9LGJGoNANdSlDhigejxyT0PebbSVcoyoJB5xW7uIA7SlWicBgLnNIi8R1zrs\r\n+teBIx5g5mKybdxlYDT7B11MKg3qVYeTit2xw+aF0h2bJgIXwqkH5ZF/UU1k\r\nA1lHDmU5GDd6tgceb+xCU24VcIN6Xy0PML6qoCdJOp1m9gszP43YtDtB9dGP\r\nPmgF84g/rsxhyp/aq0nFU2jomUg/yj+SPVW7lqMmb9df3SMGyfTR5yPlPGuL\r\nfm6zqnH33k/RYCBpYR9Z6lHoZcjx5XOAnL8kMibCn/jQxkzPs6ATWKP8BIov\r\nsqthv0MfPL3CzuGtvXLdPSUZD6tv99bX49yOCrBL6OkBK3DQwUSauD3PfuyP\r\n5CJ9ewHjRo+Nl9VmBJLMhzSnMNLPGoAWqfAz/gDC2lCxiBX2b0f7uepjklGs\r\nkCVd7t9CRgnh+ycR8ypy1i1sIyBgQrzZBwI=\r\n=g7f9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.0d2e9f7.0_1654455111804_0.34775276901341057"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.a72b1ac.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.a72b1ac.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.6","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.0","@typescript-eslint/parser":"^5.27.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.0","jest-circus":"^28.1.0","lint-staged":"^13.0.0","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.2","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a72b1ac1db26fa85a0f77b8c898385985bedd721","_id":"@kaname-png/revoltx@1.6.2-next.a72b1ac.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-CAF3FDZM4st8NqSi3I771FmQiBOxIDzDKmUjg9vfj7X3dlPTD9h6RdHyplNInTAiYRYRcBEnfiiV0uK9vnHNkQ==","shasum":"29fcb3d151b6fd06a9985e9f20ccbdb8df38ff38","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.a72b1ac.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDq5BrYw1l8PfXYzd2ki+RO2BD18xE+y0J6IHAJk2cd6wIhAOUytD2lyyaPS43sKrH6VXwREtrEZlLv2iA5kd2KIjHY"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJipUJnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAiQ/+PBT0DlmR20dQ8aHF2SD0AynCkjDoDeSS57p7TD4u+BEOqPWb\r\nZefXn16xzqKJDGjCCJ/Pt13mS2RuYRyVMfUDobzVaUVrNyaARJchy98iAWRQ\r\nKgNedNMtwRoxpCSGuG5+W6jkf0CQSyMiSkeSmV6wnblQTvojRApMQFRmRTHR\r\nRMpbEy+7CJPSq5WcpBOY4IAHjeGTvbhiMW7zxeyplkmRjqiN3BdCYCftcthU\r\n9Egai9XARf6XeZO8MYMVj4haUtwNCx00LRwrk9+BBfgNqyAnFpFYHeJrpT1D\r\noBY6GQauNHF4P5iGYqeF+QMxGuLZeNOrvKh4EULp68KSzqabRfs9PkTnfJh+\r\nSyoqiKZh3o+OR7d94naQpZaoyf1IkKJeeIM6xSD/9QADwH1f/+LHwd0aQen0\r\n/pgWkiyKN76K8dU7fVaq36mmwQm01VIypbKUWWgGVBLejPyzDuyZLf9JUOs7\r\neRAuxTMyibaVUHr6YE1uqQoV95v0F6ZPlKzvU0bY52fSs8mIbqwMiRx1hk03\r\novHnk+wk3P486XWErA1Z9X11H3YdWlWLflrrhUAe6pU271yJTTNizhBaWcW9\r\ny6OXpp/IgbJOWHOUQpqFtQw2N5Jky6VJ4pl6nwGPifFLIS/mnXlvNNQuWPHv\r\ncqr6MimjLU/ZpiC+IC5D+952SVUM65qZ/Rw=\r\n=RP/O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.a72b1ac.0_1654997606792_0.3599265870597814"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"1.6.2-next.44b52e0.0":{"name":"@kaname-png/revoltx","version":"1.6.2-next.44b52e0.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.3","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.6","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.1","@types/node":"^17.0.31","@typescript-eslint/eslint-plugin":"^5.27.1","@typescript-eslint/parser":"^5.27.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.17.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.1","prettier":"^2.6.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.3.2","ts-jest":"^28.0.4","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"44b52e0f5336c81cf244c33a4ac616292aadc3bf","_id":"@kaname-png/revoltx@1.6.2-next.44b52e0.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-nvXF8TACAL/56N2b1QGnEDHCxVnmqGhkmeN2uLGcnz3TERELZNhli/FJpsWU7tcRFCVX3Bo4J58WsBYtchgyMw==","shasum":"fabdd296ff40b71f91a5c8f35d80e79df691523b","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-1.6.2-next.44b52e0.0.tgz","fileCount":176,"unpackedSize":267969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDNJ9dDTQmJuQ7TVgBF9IkHte53HOfy6MndPLoWCO7m9AiEAiQ1+A9zlKvoKh8pOl/fQE0Ty9HWcYKJhoG9q93DzEc0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJipULIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqEiBAAj8cHwjaasltkBj3CFoEweH3ataaauFfJAfigdcx1WlxD7A0W\r\nKpU6S7X+Kxz8PXeMlNcBb7IzR1ezTIfq04KVaa0dtt/4dMbdrY6kLu/XCVZ/\r\nfRSJNZ5Nwk5wDun8et201mCJWivsHs4cc3+8fVqFJJEuBJzr7bmiqBwpUzLY\r\nFUw15w8rfHG1pzAhJfjgQXl+FLWpLKEqPiprVMnZrCJOC9Am9C0x8rkN2QMo\r\n8cn/1FHYBy9L5P4nzyyZN8tJhbD5O7AH/HolGQRgN4kvF4fflh4Gxoh49wX6\r\n3hyK1EYuZrxJCu2SXO3ykqtmTuasT7AF6LMpkCia28I21IGcYdlfnJGd6ZVE\r\nOBa9TSDphT/yTDy7rrGl06KiIr1pZmhOIP4n5aWBz52tdzknCQPeII2waFaM\r\n78Iolis/EpX/MYaQe7bnDxYC0VaZQ5p/DFBf4A4OAU5hHMdjb0vn+NN1+tGQ\r\n3dI0MxjeeH1+X5QzGvs6+ICwtGPgw7M14oLJUBkUXDa8aMvSfgF1LKXG5FVC\r\nip+IY+CW5D5ePQClchc5Jt1rg+D1QY9fRDNXZEDlWheU8mBNbxbkLwyfk8zo\r\nrrDt7tSh8KTkTVSifdMepA/YE/KbEJ3h3qB909pyNvk/zlAuIlBmxvIsU8ES\r\nZsIpN5iIccJcFNAjOhMiFufTYgAhjnxrLxY=\r\n=8jS1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_1.6.2-next.44b52e0.0_1654997704084_0.7894470181510602"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.0":{"name":"@kaname-png/revoltx","version":"2.0.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.28.0","@typescript-eslint/parser":"^5.28.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.2","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","gitHead":"d3d1cb6add230448476dc26a5f36ba49921b9361","_id":"@kaname-png/revoltx@2.0.0","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-ReR59MAFWtxdwAeJka2/3t0dYSpka94Ub2X/xSGtTYogOUXZ1/UTQ2FdN+dirTjqmKnetxati6ilZTdpY+6cMw==","shasum":"3dfbfa55efa342f51ef6225e6b36e009caf97d5f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.0.tgz","fileCount":176,"unpackedSize":267988,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDRKPqqg5XiqdrReckEJdeMqP0n2dBhqEHtdk5Iz4JG4AiAJ4FkmSGLR4p9VQ1qQVuf1tLzeK3orKai37lq4dFY+8w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJirTjtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5OA//aVGf6A4idCNRAVE7MzvkBTLCInve+xBN3c7xjilYY8xx+1Uh\r\nyMIR3wSvLTNO8a2/E4gyGniguvxXFMtNbPVRn3qa65PWp2F3KntGqLVf6ECa\r\n/yYejTpuIVtFfGMLAw2RRMgYi+9kpJyuj65Pe5shg04/9ohCbgRBR2ppSpXo\r\njw3J+EUFBKL7haraM+kOiO8h7xjZSvOjw2wxZoDmLFF75/t1W2l1AnvTafX1\r\noZXLpTBrDVyfrE7WkpItTC+2JcPLNsxhhUzFHw2S34wYtsNuqYgqmByPXVLC\r\n+YAKLdwKgQJSueKvY8kY+Dji92tjFtzydTZJugo0oqLEOXBSnRndtXuvbChN\r\nASsw32X/Fstmw1jOMy8aZJDr9JSzlR2GjqmP7KcM+xGpE6ByjlAm5TQsmiGt\r\nZ/BzyhJEPOOLcanHot0hxWaix83v00uKvi9+4ZwImPgjxep+z7OhswQV78bw\r\ns6K5N7nidYarzGDjcv13VntJQUEtLOgZU1XsebTFnnFz3AvBPDnQh2Hx031N\r\nHf+Bf+4hjO5Dzr4oly1/iptqD3eH+QVeFuL1loXtqeU2bHLxkuN23CR1N6JV\r\nxMF24QZq5cnI0N39BYNb0Upn23mg8yeThaUwXDBRCVfuhBwVNoU7woz79x10\r\nFrBm9eE46EJ5UGWQb/bVmT/BiQE9QWjjze0=\r\n=zb7c\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.0_1655519468972_0.7173317793994969"},"_hasShrinkwrap":false},"2.0.1-next.d3d1cb6.0":{"name":"@kaname-png/revoltx","version":"2.0.1-next.d3d1cb6.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.28.0","@typescript-eslint/parser":"^5.28.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.2","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d3d1cb6add230448476dc26a5f36ba49921b9361","_id":"@kaname-png/revoltx@2.0.1-next.d3d1cb6.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-IEguHpiniSc0Q/B5I6XJYXqjKKoNQSIZGkJhilJyKNBy9qkDL+40OLtLryBwZt0SrUNr93qocsxOtgoReOVvmA==","shasum":"f4c857c4e3c36b873552412b2d8742dfe0a23e44","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.1-next.d3d1cb6.0.tgz","fileCount":176,"unpackedSize":267979,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKcF/ynjrrdVXAdxhL7c7OajHLnnKGPtgCcSk76YCGwAiEAvmj8iqkC3pjngciZ07oNc2VEotTdSf3p9uTLlDqWK38="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJirTkZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroEg//QSxZA98AU+/OgD79UXlsu2ByyNZ3Zud5ThjqscVNZ/EpkTzg\r\njViBCr/fYhlWrOnQT8jK9fy8AlpuADV67qJwj8hngKTYp/bbPYNb/clCscm3\r\ndvdl/dZXEmioyyXiyxqGlm/9w02vVYp/eL6++KRX6r/mARSfU69EyDaKPBB3\r\nKvdgo0lg41fnSRvT3JdJchFLhR/iSt7behdZ3KkzlpGYMIuw1uA6ROQA/Lh/\r\nx9TAbITHNpkaKuC9dr2OtGVFqRcCpkPA53uOUn5o8E4sYFL0TWS1zGS0msmw\r\nnwcWVQDXSZZEp4SFIEZ0YYmK2EzhUsicYPmGa5sQPngIakeQRN2i8ueqOA4h\r\nH7zMMMPVEk/8UA5ofaCdPhqwEfn8p9c0gCuDE27BXRwHyjIuv09TrXRtiCr4\r\nYYlga6iSaJQgRn34E0ch8aLHD/CDx9MV7cHEEneb4CCN9Y+Frrx4N3G+83Io\r\nOww3JAWi+X2h8djcBVEjrcvA2O0YWl/lLOtgyftYICjVK6qsPISTstYZqhva\r\nCKhqS9iL63TZMlofCuqytw+wQCo/ODdBNuZwmgI7Fug8pO/Y4E/Inpr9r7XH\r\nD2OPGgu/Yk6zxTPQO/oV5YXR69mtONArZvZApijEHnHTvIt6A8R094FuY8R8\r\n8UYYMLOrx4QYHdWETBFUAgzZr+j8Ql7hZJQ=\r\n=z3yv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.1-next.d3d1cb6.0_1655519513403_0.6718222594600936"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.1-next.40a4acc.0":{"name":"@kaname-png/revoltx","version":"2.0.1-next.40a4acc.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.7","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.2","@commitlint/config-conventional":"^17.0.2","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.2","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.28.0","@typescript-eslint/parser":"^5.28.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.2","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.22.17","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"40a4acc030515dd98a63282b28ef374fcc848cfd","_id":"@kaname-png/revoltx@2.0.1-next.40a4acc.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Z9gBIgTGGLfEPmpObyCYM0aCYs/PcItVgz1fM6yFs3VwcNNENcvDvDiZQ/JQb0L8EYeGaIpS0zB5URDIkdttQQ==","shasum":"f962e92c077e7bb757dbd141a4a5b8f6f0cbb488","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.1-next.40a4acc.0.tgz","fileCount":176,"unpackedSize":267979,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeAXTKUsfJjSxRM7rkt6zIJcfPoQan25itXUv4pkYnMAIhAK79PR9J66jZ2slP6WSNdfaE8RCimdq9CkhATo3qWMdz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJirTuwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpkRhAAoTDW3W1JhPDn3FfeCHl8ps2HvI+5TIcOcBAJQb9Q4wopx3oR\r\n1cfaupDJ4/uDJz9pQmyqOFjEWnx9Px4JeWz7D/6s6uCpZ8SLjrWRAI8/6QVk\r\nVFgANrIvfJamBZSju9fVHqrWwTXwwSTTVV9oV1BxkQ5zx/ccSMVbWxdekSOk\r\nKm4najbwBSXuSc2ynb6mdsQ/o4SDm8GbLQ85vgImjrB9IZd09w8uWolnHR8U\r\nBtvkpCkivdG3xHz1fDsjTDtyiXyhD4avSd7EwdImn3p9d0S2wRD6XXpUEp5r\r\nrQKBon30chEIDHr5OmnT61BRRFAzUiODPUeeXRc/3J+ChQLvwNY2I91aApnP\r\npXjh+4dhbaZ2vvXX0f2a6IWJ7aORJUYCth8MtB0+YqlDAJcz3jo1YWQ/08JM\r\n7MIUSM+FI3QIM/b3qaPa0iAdlktdQIs11bu00LI9UDVgggMQGfmb1DYpVf8J\r\n/uhBCmyQ2hPlco7yfn03H/RuG7bOXCxogjd0Nva5YLFsVtFJ+i9Nz60/Xi9H\r\nSwsDwK7D+MBPMn4OI9z11GtddiQ+51G/F/ysD9t6G8mBtHH7G6OBQEbCrJ7V\r\n9le0xhSrtp6cZH7gDJy/8wxWIdkYh4AbLZIrJLSV4QLywO85yl2i9Y5Bi/7q\r\nacnJxUv2qqNvDJL3sOdWeZDieNntuncVBGg=\r\n=sitf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.1-next.40a4acc.0_1655520176143_0.6427241663757226"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.1-next.40a162c.0":{"name":"@kaname-png/revoltx","version":"2.0.1-next.40a162c.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.1.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.23.2","typedoc-plugin-mdn-links":"^1.0.6","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"40a162c1b5e218cef75f6eaf44e0efdd8f985c6b","_id":"@kaname-png/revoltx@2.0.1-next.40a162c.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Z8c92Sc0pTUNbV9ixUjVvRv0+ygYiQr7Nv4ac4nEUvxxAneu1kFb/8Pd8KcbuB7N1ndR6SqjkWCbZ8bW3c2U4A==","shasum":"9d8318102e4c679ac67da111cae05a74e46b0b55","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.1-next.40a162c.0.tgz","fileCount":176,"unpackedSize":267978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDj6dKr2ZbWIg4xpTR2uUI70TRe0R+IvrA7ywNgeA3ouwIhAP1pi45EMmT5lsdeRSoZid71sl3zDSjNyo/l4+p2D5BL"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuomkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmonkw/5AX2ygFa2vibaLMIfDv+Kc9Ix2rEGuEaXabrMBOjEhhArEM8q\r\ngunqrI1KjoBybBOPvEgdb/QK32Ukic3TOT+ireTwY8IsFmw6dn+VAyREEmwd\r\nVtNRK6c/jFZ7JZu8aQM1GVnQnYI8j1xh9CKOJCTxIDEvaXzwEM8TvDWuL2mc\r\nLjjhhsFE+ih9kuufi0GMggytMCQMlQZAm0YKJ8Dk/sGswIiatO5QO8IOV/g6\r\noEKISBIwtOjlwGPxf+Aqo2SNOZcts/pIAAtnTHnqjO5XwnpZtKbr8Kj5ypom\r\n8cNBB7WZJyl9my9ll52NBCkCnMSUbvOhWayamRfNHFZSW0T5Qg+dGO26xmq7\r\nu6Lb2bday2K0V7PE46YoNe7fVmBZYIccWK6Y6M7apyH+DNzXFJhLATgV67Jg\r\nR9eykutRYk2P/jugHF1hU8KaVXqZ5jgGy/4ldHQpS5xwCDZsZRK6lrZdozSy\r\nnAbAysAhSWuqkHBGvNHlplhlx4UptJSgogDcpLK83BG3E0e3fkq99HrLxYuE\r\nc785e3aKqf1/4HLWQuTjdDFV/xDIqHRpAl9G/8J0CYZ8IqFPPQZjer23ioLf\r\nQpn+ukdKF3Xd9+BanJCEZXLmOyxqYpkh0KBnVOk8FGAYgvtfVMRyPUXmd2RW\r\nhBD8Kc3JkYr8Rm0e7Ag0reIzsRJ5qqautCk=\r\n=lNRA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.1-next.40a162c.0_1656392100386_0.25526777297989156"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.1-next.701547f.0":{"name":"@kaname-png/revoltx","version":"2.0.1-next.701547f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.1.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.23.2","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"701547f9876ea4ab33de6ec94702194d59c88fb5","_id":"@kaname-png/revoltx@2.0.1-next.701547f.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-vvlAc/2Y8XGTPfF+GNY5S8ayNkbu6BbsEaji8nJyMJol6cRxvXxQ+cromA3HotJjeZA5CYByv9YxXZbXRBn8yg==","shasum":"6bde770a4f91f27f71f08a96035bce055497ab20","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.1-next.701547f.0.tgz","fileCount":176,"unpackedSize":267978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC7GFD/g3eIIULWtis4QTO06mSjVgEnRqKnsP/oyY395AiBJVf5vO7ibVWBDdKbmLBleiWEw1/l+uGBZftaVK1anMA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuonaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpnLA//axja7Z4DKbmCcGPEiiy/NYoUeXm8hYBDQbT9IGcPt0ivzc2V\r\nNFegF4aFUPezK+NDOe6vaowyNvfR7PA2ktqq03hUuzTBMYtgygOwoyzbZYAA\r\nLYqYjHm9lsoGWGmVeircJgjytivhOSjckY1axk4YK4mkh75hrkN21EejLZRr\r\nbXk0sPvKpPfV8DOsn8cR4J7nYxLujbLWnxQ/UVSWCmgaXcqEBKyDhR1NNI8Z\r\nlBZshcDDmgXgwMtv0U7j0umwSUHpEOxBeDZ9w3NjusG21HfOAKNCvCnEeJgc\r\n3trgAoGo0Z475AG1GF+0lEopFGe/A8I4QDytd1g4DDkWYtfT2lOZ3YnAPoKW\r\n0Os6cPvpANZOpGyxgRXrY0p39ZIRDJLX/Q6lD2+v+ThoCjQb7dTtZrcPv3wK\r\nzVwzTtkt2TybJQi5k+4SCJZZoih4OakRjp9V4Z1KNlqJ15f/t5n5rOmMnA8y\r\nOpuwaoRr5AvNKOE9zEMavmg2M0sYjEURRBFij+rtnFzNhjbEqVOVfnXHy0hi\r\nVKPMk8TxeMLkV6UwoVYDQAhoqBsXuhsj/5wtnoZIy0HObKi28vTsn7AnmIFu\r\nhFLLRYvQS9YPxtRLR/IhwWy+lYyrOaE+7tbCBz6Q3zEZKw5ajTm9E+L5LXt8\r\ntrzq72j3uZV4aExEsVPS+BDvUmRtcD9eUOY=\r\n=b3+/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.1-next.701547f.0_1656392154647_0.03340177362909036"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.08fb2c3.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.08fb2c3.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.1.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.23.2","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"08fb2c30dacff471cfb12ee1da69bf92f197067a","_id":"@kaname-png/revoltx@2.0.2-next.08fb2c3.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-DDQsewt1gVMQtIOi9+RTtzk+RhV7wRCot36mUOGV1nlFEA/+POlPGwmCq5Z9xNwvS5yYItpLDxMuD8J+rXTzWg==","shasum":"d59afe29b392364a5caefe3db622bdf63986cf90","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.08fb2c3.0.tgz","fileCount":176,"unpackedSize":267978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHu/6L3vMOsXCvCYdeEclrbqvRdlD6XQ+EEV2ih6M8z7AiB5/kZoztQ5RUUOUrX1+cftVywRMPJiffJ0LC3R/BCH4g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiux91ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqmaQ/5AXbiVZpgOItE+ipslZC2ivE77SCLk3jYnIIjDSJKboa9XTe7\r\njYN1LcwDCiv4FF6P9gm8BG6Qam6fCig7F20HQPZ2RwdUsSbbX9AApneydHmZ\r\nzsZTGpiil7hNobbOBjhSyip/Bo8SxrnE9qcL4YJK9JaKw02+hmzxynu8evon\r\nAmU6+cvqrOgGjgd3jO247uYno2zxzu5+/QrtBzMC+OKibNR72b/KfCpsd7iP\r\nsWByQmBMhO62wCGT2LHcBOScbURmUOK/sO4LCC8+k4Y9I33ofmLv4ns5hWTZ\r\n0wy+kL3yr+okD7y3E2EZ+S0BwKoGgieQ6ayRIPAqwEEeAarwMZPCGcFnu7dI\r\n3U2dqsnO81yBk9ZNG2GHLNsPiX1wApOZzUcpGpiUYr2acSxEYsoq/sPUAbmm\r\n+R+RTPjkj8mwWRRWW3xFZkiF5GZXmOOMNlvtoRkU6ZfO60qi9JAFvcTHTiri\r\nM8jEzEQrodm+L+5tFZ9TbTSfqRGstKxhtivL3e4FhP9fvn5SZwA8dFSslEov\r\nWb0wxvPjicQFP/qG44dVQqrBCmMIn1t01hAvPiPtN0pgJP66vqQiYSVT7kAO\r\nm2dG18uCtVTOEhcU/WOmfEN9V+0bNKX2a3CmfQh/t90dCib3WCgH+8j3SBR1\r\nM2zZFa2tFmshfBseHbu8UMUnZCK78XwtRhY=\r\n=mdPF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.08fb2c3.0_1656430453336_0.47147182724040126"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.1":{"name":"@kaname-png/revoltx","version":"2.0.1","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.3","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.1.0","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.1","jest-circus":"^28.1.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.1","typedoc":"^0.23.2","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","gitHead":"08fb2c30dacff471cfb12ee1da69bf92f197067a","_id":"@kaname-png/revoltx@2.0.1","_nodeVersion":"18.3.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-Lqm96loO+zfLTFw9UCEh5NhhnrIGXQKkEYcTrSck9FLU4R0XdSmXYSrqH9TgxPEKnDZ+bUT5JcMzq1IhMDiwpQ==","shasum":"c04977b334dcf131f684c2c77e738a5e8780c8e0","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.1.tgz","fileCount":176,"unpackedSize":267987,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIClQoL4elJNu2rtaEi0D9g53wCsiwqJBU/ezYHbLdzHuAiEAvPepLY2YPMWh41s3Yrz+dHN7Xpez3m+wDmyl1bozOJ4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiux/jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2+xAAnJodcCcMitsiexnCvU8WzEA+8ydqrkq/PbOEZVcWbShSS4nZ\r\nksJGH5SLm2zwIWE+HIWIuVozKVBRkAbexDUrt2SV1XdXpt+xu1Oeeei5qKSO\r\npQq6SQx5nafTnh6f7YDzZwTdBWuw0sDbkj6MC0sXrrqMUmwYN+qYsO+JZUb7\r\nPjkf9ef9K13ayI6N4scPMCkcpyetjKz4f5ZF1hsGq0T1MOk5SJ81A4yoJGAV\r\ndl0/PxhTuupRWWWj3dOHlVZzT5D+sVYbvs8fjbDsE2BFagJPx+iMHYrwwpmh\r\nsRFwGqUhd3BupYVgglfmi/R3DR6grt+wpxtcXf4EHIi+G8ZpibcGA3DxaGFL\r\nwlD0pCaBs9av3OvqksvwuEiJMfToGQaMl8f4OI5PDkEUmDlPMM2FLi+5VBlC\r\nvNemR2ukBSgXSEEyQqmE6dSHLCeb+WnipcDl92Pc0anOghQjsvirybEPZmBE\r\n08VzudApxjD6Pv+LTCzcCW7z7cSbMV9KyeOcwAI5E5FTNxg61ZMyk2AxMrme\r\n9/6bXtB7A+A0ylrkpT9OGXXWLFAVTsMb0A11fx1VI9JeQzWNJAvEeg1eLlfa\r\nmpHjZm8UKAigpR+yVPRCtmEw2+8dLW9VN5aroTymIvPVLIMavxmBA+FKf5Kk\r\ni9ljMznwjZLLpIK6l3cEGJb7hMsbcr0r+zY=\r\n=kPAX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.1_1656430563729_0.5511162833873955"},"_hasShrinkwrap":false},"2.0.2-next.4274daf.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.4274daf.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"^1.1.1","@sapphire/utilities":"^3.6.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.4","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.3","@typescript-eslint/parser":"^5.30.3","cz-conventional-changelog":"^3.3.0","eslint":"^8.19.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.2","jest-circus":"^28.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.2","typedoc":"^0.23.5","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"4274daf1f52b65dadca51ec297941813b8c9636a","_id":"@kaname-png/revoltx@2.0.2-next.4274daf.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-guacPQ3Bd1QMOklRdFFhHo1lYzudgUrqbjjdVgousS20TdLmsiLjuqbV82B7qGyy7iMCO9/L38CN/ycSxT7Ebw==","shasum":"cf265daa57801cc24d03a0381b783baf28b6aea2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.4274daf.0.tgz","fileCount":176,"unpackedSize":267978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGS7CsF9oTIoWT78dlfkE/ay9w704I5nAMtV2sEKBj8kAiEA0aE/zACHU9JkZL9s2oQNQEabfeA/mDc2GKA96Sisr7A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwO0GACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUVw/9FUXzUaFJ74mdBH3Xy4VyY+zOakferZc1f+HNRGGCAOh6Iilp\r\nwN0xsORSiWgb5+H0pJegpj3TbGV87ywfeBtS29g0y1HUNZ+dDSKCDBLK38WH\r\nZvwJUraoLnmmwNMbT5POgzKdPuS7FiXBboWpod/gyaP19Q8chGA1WIMcmXGl\r\ncezIL8czXv+T1whBz+t+3ek0i/mycQ6mdlW81zMW9Mmw1jGUR+PHh/GqHgq4\r\n9Vi6jtqOzrO3zOnCuCbx6vf5mUTR8248d93isJf28jpXiULJkoRLc1Lwfp6s\r\ncqQy0s8XymcclTq4a6USfS80vQbv7dTdeq1MTWvWB2cRxTL1hWvA6p3Cwie8\r\nJjipb5ixgFK4LGRiovoBsgL7tpcGg2uTTBLxbwO88n2t3z8btGzZOjhNXKXU\r\njV5wgQ0nnhFH5Gcx09/0BFUmQYOA2vSZ+LeSRzgbH6y1wSWH39qM8g4NMUGI\r\nhDktxbrhvE7yW5/SE9hnK1a1hZAcrDyE82E0n1gwTc6FEP7LKfKr2GXtaJZ5\r\nHEV54z4A9nT3hRsOqqijmRJs3hhru6qBHMf3Re0fpi5nQpADqaL7uS9ODog+\r\ntJS/1mJVbA3JimvwTd7PHKUKCUHeGOLmRWFYoHfbt4WL/Ba78y+5iThWVjXD\r\nbaZBUtvE+ioGGNemVwNKPuacZVS4h8XNbdw=\r\n=Ei8E\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.4274daf.0_1656810758549_0.19637089559140408"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.441d8c2.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.441d8c2.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.7.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.4","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.3","@typescript-eslint/parser":"^5.30.3","cz-conventional-changelog":"^3.3.0","eslint":"^8.19.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.2","jest-circus":"^28.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.3","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.2","typedoc":"^0.23.5","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"441d8c2129c170ee122ca38d2927f9abdb3b32a4","_id":"@kaname-png/revoltx@2.0.2-next.441d8c2.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-WZN3Edu2oT6P2oWDegSMDLmQTmwMFq+ZnVrFNIVlLJXDOoTObma30d0pFphKIs+f9iA/bVw/rN/rkyf5DpZ1tA==","shasum":"6b85cea9e972753880cb38f317d79785bc97953f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.441d8c2.0.tgz","fileCount":176,"unpackedSize":267977,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDp7dgf54rBEmzh4pSTLWcfcFOpYNs6ZL3/MxTkV9RpkgIgb6HzWfyuFrB4BN4LyNB4v+71uuOKLS24OjLVTCnO81g="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwO8aACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpLOA//ZXj762yi6SGgffLdPN8pTdZ9aA0ZFelCUL9Metn40Tt5kZPs\r\njoDfIJst3jJ1OTiDFbz5cT9ma3zczp7DlQt9aYKSPZmYCo0B5okEWfv97J8V\r\nT1FcteeIONGCxx4QiKCxZ2TlixK2ypV6IePYW4Y+t+ZDjUEvEcBnBoPsI+Rh\r\n/GstbTKqTIBOItCbvjijV7pV1gcRr3Gd5bymV6u0u0tJaFHKxjbl/bt2WIC0\r\nlNyaLIO7E57BjlHbgreuqR8ZgWILiIELZK+NlG/1LrHYnJ8PpbsnDWhE4jBw\r\nm4F3vfhwRPrw6srGsCnZOe/BRqYQjfNdUZgNZR6mMCxQ/DbYyrYmlh0/ly7e\r\nElwigAwrsJ3Sp4x4ootPziNuYrafopKoTIJ6fToWt8OHRgdgPNXfG3g6z3hl\r\nS8v9HNZ870IxnPYu1x+0vN/zjGpYa1EPrK8Ad4K34M3IfT1ppz2EQAFN+fYr\r\naShmMTXT5s8k0BSGwsTT1Y0oXAy2PmhCF3z0K9kH1XjLckMNlEyhPPqv3pyT\r\ncCvqy405nnzGK2gPPFbP27jcyhZZ2BiO/lWODtTmI9t/aFevLA7QVR/RIL9n\r\nc5m+s/QqIGFU0SRpAOYtD/wZWVu1y5Xt3tE9uSHLBnsKDGoOOG57yWSI9C0v\r\nWzBOKfrwqgLkW9zGl8GwkF+XULhh/zPJgnY=\r\n=m46A\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.441d8c2.0_1656811290201_0.22545048456335537"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.c2ff4a0.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.c2ff4a0.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.7.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.4","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.5","@typescript-eslint/parser":"^5.30.5","cz-conventional-changelog":"^3.3.0","eslint":"^8.19.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.2","jest-circus":"^28.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.5","standard-version":"^9.5.0","ts-jest":"^28.0.5","ts-node":"^10.8.2","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c2ff4a08050f5efb441330ccffbaa58cd240c327","_id":"@kaname-png/revoltx@2.0.2-next.c2ff4a0.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-qZynffxtA5ZJaPs5gWmVQ3L0RyEFZ46KxW/Ayse/bKwORUmnVEqvC5qkOyEZnpz27CQgHDXQhLaipl/f7aR5qg==","shasum":"565fc8348d8c9a3be88d773c9996777292b2ad40","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.c2ff4a0.0.tgz","fileCount":176,"unpackedSize":267977,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGe8y6i4G0opWF6YWvBlG4Um6NueReDFIkSiJvFGZD3mAiAntQiath9/AJml4x1MvBti5nweXqvCS8kxYj8hTI5PBA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiykUiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpcOQ//Tc4SpZx5AAJ1g4zDfTQ5YaASjTxWIAS65NYxqhTWkT5i1pCx\r\nEwg/QUfGla3uQOVIioce7qJ5RO/v1FpqiZIOsAZ5aTggNPoDu3c/AGoIk+gI\r\nPqQ43Jvt68OsdRgK8Tzj/64riPzZMmvg1TFmcehrLETL4z5+35A8u5V5o4b2\r\ncizv3El+gksIIZHinEqlQ1CYNDJppRhiZTnVybfssZaps9GfMaAFelbrISDD\r\nEpiACfTO2b1XqnPB4BI9RILl+Ud1UIqztbbhVCwSjGZGyIWzWkFZ1yhhU3aO\r\ngodeSpyLEPLwO8PDImlufJgyL8J4FwV4GVV26zwRVDRp6qW0aAD2+2pT+Ycx\r\nlzncqcNiFpLBZsNl7aoFSelIx0u4Ug9zyuaMkyx8N+sLrtvUkh1I9JkBnyaq\r\nYt/cAzOgFL8pe8EYgC66RbBEqKq9PKfxiKdMvoOoJ/cS6b+x9xUBhauSITRi\r\nTrw/a//f7+2AX6hWfsoG8iPBrX4q1HDNWFH4eKskTRLG4pT2A3tvkCrin53c\r\nFOi6cgJYloZsrPlacqNqllX8cA7e2okNoxYe9dvwXYyBF9QEjZU60MLMpDaX\r\nz60Z7Cxji9W+z5Ld9/CkBwGyzV31F/YgUQw9GWCirouT5B6ogkrDs5Af5C5W\r\ntf9LNkVIfO83UgTACXwCUeG2G5POhMjF6K8=\r\n=6VTW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.c2ff4a0.0_1657423138134_0.3014463730204653"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.9c42e2e.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.9c42e2e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.7.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"9c42e2e56265ef4ef37499097984d944fdff347f","_id":"@kaname-png/revoltx@2.0.2-next.9c42e2e.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-h82tBqQAycakiwqREYLCVQ1jDzoUxj71kwq5jnTMK4+PLt3dg1SW97tpv2xuJRAGOEFDnPUX3zujUglVI7OT/w==","shasum":"45715abcf7a0dd1d5312a21a756077c3d9fa95d9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.9c42e2e.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID2iGN1IkIUboBx9xxmNBfXxOE5OaqOt1hUGrf3CScedAiAL5n4esxFWZIKNMCYawfjZPf/G68LROqP3sS/3Mjgb+A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi05XGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoL/Q/8CpIAAJo7sOZ3aSDskMcaaHI/BzjnE3uNLqLIWg78tXN3KgcZ\r\ny+CBCWGfIxItfLs4TrB06hIOMRntX0ubLPs2gPGjdbpXQB39F7y0FNSqI/9U\r\n575LJdpVXQSXGUxDNGAi6Es/eg2rox6Q+K0EnFl0s1DUY2bal78Usih24lno\r\nt5WqI7Nbvnh4hV36DkXSi8HED7jpxHNYQnESmoG3OtECM/uGdtCNqnlqINQI\r\nlY/CuCJ52r/gpaMnyNe1Dr7TWn7SqXGZY8/KZmp1Lz7VbwwPIs5Mic4U7uM1\r\ni8bCLYQm3Rl88fdrRKRaCN2odqHV0nA20eHHewtdQ2GLmfSrjJyQ5axmiueq\r\nqgEEdes7qAx36CqD0A/zgHZiiMiid0f0QcklZoYEHFE6PJb8/uQAvLFDjNY6\r\nlc7JHcjPLSzOh22K45NfPb31nRJIjBAIpD6l+AFCWjx1A1cgVaSQQVXAQ78+\r\nedF8S5HIBx/iugnTPnQ3cgaCuCWkFDG6nL3HesULbxz8vI2EbetlJGlVxxEM\r\nIFHYUO5qu0I7xVmb02vW3GoKYhZwe+dAjzbwf0bbjvuDownSR5rO88gQvjSv\r\nKXbD5yJrvnp1ToLM++a1Wc3mx0dxmsteXpWYbowCeP5eS/IRbWeS2T9ZCHDJ\r\nlfoZwk5LCr+2zy373f3y8io6hV+x54nSQwo=\r\n=RQoY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.9c42e2e.0_1658033606115_0.023356631054653132"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.1ee5989.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.1ee5989.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.4","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.7.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"1ee59899a3c00d376d5cfff494ed9341e3262f4c","_id":"@kaname-png/revoltx@2.0.2-next.1ee5989.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-vLs8yWrggGS/ofnMttzfJz0irSK3sf3u9ZYtzveVhlJmJrIPtegAUd9dVIuqFQsCRiqq0Q53w19J5f2Sh8gHuw==","shasum":"e44c5f2f3139891fe925e1a6098a7092084d3ba7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.1ee5989.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD/kGY7L6ZTG/RuNpB9yB5XTlWoMYcKgmu/ln1/mAEH+gIgMK69V6+Yq/Nm5jQ5Adsz+0KSxbAeAW5QbavcmAcasWo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1DSNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8WQ//VWT7aSPSYlu6yMBXWcZYtUf80P/v+45fU3DqSueeubctcolA\r\n5iWzWxvavIep14kd3HYDx8DrOsQKdbblLynmWV3CkovUgYueFG2ksd+K/avK\r\nJb9sGUIjnAgWK04banuXT8nDH3cLUyplLA01UYdhK54oP+woDBgthIB06duB\r\nZIkUNEvI7w03ysGrtePYoGSMiHeqlAd5psQzzKikAjn/PF3sYAbOMaLRtlT9\r\n9Z1BNxPqkmFRHVJKp/V3R0ixCJQQif0rr/k9htcYpwJ+bZ4nVa4vP34jlQ36\r\nstb84Kl7lFaCq5euqy0ALhnREc50S4RKr2+ob7jhrqs2hjzX9pSSf9yuS+AF\r\n6iHSoIkFcJfMCGvlXS+2fRhX1nCxp2aBXiODE90DmW71KHxTWVeXmxFh9csB\r\nxV9tiP1b8w+O/4YnGWqII+wH/hjGK3bE6QKd+GsHoxPJfn+tMAOsNC5Tv7nm\r\noyKYL1S2S0RUdux4epgShYD80SV2VCR6nwxyqaj/WFJQKPPRsUh/ufoE6VPI\r\ngBjaiWFBTljoTPU5mYr3q7bmmlnxHjZnZvmIvteMcEhjkays6AslyYccsl/0\r\nWv6RCqBq2s9FxeCKVZpMfhlbhH5FJa3X6fBYeD+MuNep0P3DpiAxdoQtIFxB\r\nPKJuyZexxra/TyndfE8cjlagOA9kr5r8aF4=\r\n=2Ojk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.1ee5989.0_1658074253369_0.6625960300918541"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.5e7f8a5.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.5e7f8a5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.5","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.7.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5e7f8a5cc6152941750192d3b660c76658841c4f","_id":"@kaname-png/revoltx@2.0.2-next.5e7f8a5.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-jXzoD3iMxgOFjuYbryouSTfmLmOw/PMQG7hDoaCXbnajwy3azQnhABnsuGH+E1j4+6oPutI7JVspCVLM2xwj5A==","shasum":"bb521ab322326171b8791b8b8d6b5023bb5ef78d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.5e7f8a5.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpsJpSeYei8UUb7CoaftQX9wsMsMoVafLrMValfbUMTQIgUD40e+llcgIqYzRtRBeR9Qc+CcIr7csO453+vV3fiU0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3TxeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmppTA//Wux8pICTC29SjuSHEMBud7EeAt6cbjaHpQgXIdfQ3Ma+IdPc\r\n3DxSreCv/e1FbfqMYnCyU29vAMGmsr4EVSOyMIJyg53o/DaqPkwnt73bKe3i\r\nVLaohN8jWpppeA3NiUewpKcCILYjd1xY517h/ii0MSdj5kZBVcM7XtKLAC53\r\neFHs/ocqjatBBcqpvL8qeByWMK5EarH65lYw09kKQIjtJTW+7meuo83iGvj3\r\nZflod4y7LLbW7JnGY/qNc5A7vnUdIS1F8bACFfQ5rZZ3jm04i+oVU1NHGlEV\r\ndbiiBYMfcIfFdgC9mgX83bEQpTNfUZxGvwXQ0TIEV41Qudw6U3lM6cP4J8lN\r\nxc/b/vDMqK2xrZDErq//iV9g3ZSRGJ0q0COG7JBPUx/9NNhhgSkLCunlaqi1\r\nLzCPPwrL9SaKV76j3xkf7d86DybyAfsLkkisFdbtX+FhLQIOpFd70NsQPKK+\r\nvqSdcqqvLOzIMOOv+L37crvnQS3TOUWHqmtyOje+Yv9p3JtfdyqcBAx0wcV3\r\nMKqrItOGzGmnR1E242DIgYxh0FMafR0eeh56eL2xJrce5iY2GxG0MR+ZWdBf\r\nbQOrtkl5D6zpRw7M+dNgPQh2FjS0hKM1SKWUe1L1B9+YntsYfbnJUQY2Y7Pw\r\n2/bDen1CSZFIPgXKgBlLZP2fJZHvhbriQcM=\r\n=8Ovz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.5e7f8a5.0_1658666078553_0.7388417165192718"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.c52524e.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.c52524e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.5","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.8.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c52524efe237325dd82e19c6263d7b0bcda438fe","_id":"@kaname-png/revoltx@2.0.2-next.c52524e.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-SnErxVQw6apUcpr+PkzzGmDGOXL0PaCvxpX5m1pHVpLB5AaaH1cjNPU9PhypB/cd+jTTRT6O6VT0Ph6d3lLc2g==","shasum":"b5de397bc76c14dd00cd8fcc749e2ceaa4758314","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.c52524e.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIELIdBCj+HD5owPd1N5b35ngM1llRT8EYIPDi83iGh9bAiBBdzE4UfVfzGIAphuv421L9eAcnX8nZCSQkAI3vohMQg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5hawACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoa+g/6AoOccUiZG3xjA2HVlUB4vUIkFwyE7OUoMUfUTGVuRBBbPlFT\r\nk9DL2vWOykr9sCsT9iYgOBsBCWqq/qCp5Q5yVOUQqPaoMH47rwCkJ3YZakz2\r\nxmOATjKb8iymybQW+VZ049258nnnSG1/khay2eZkuvSUKAJfHEIpIrhVlJyW\r\nsJ60QeeUBu2uMM4lqpwTwb0NE4OKc4jxJ3VHH4Ak/Vl7DFOjJSq72OkYbAJW\r\nrOggQO+SbOmAS0+I18RWlU8QAVv45OOCNXtZC7urJSQK/JXRSYpgJ9FcfoU0\r\nZWS5ZUhfpuNgXTup4aAXujm2plOGnKM959JVH/4qr8ubaygfktg7rgI9bIu3\r\nt1e4ySkBa93flmQ5WqjP7a/BAZ6nGZffvcPWTqNyUtoiD0CszKpqANdk0JtG\r\nCBfQGXWFkkfsT/yeVffF0w4TxxoHErk9Vs1U9t0uv3pdPL968mPt/BOXqa1s\r\nOuFVc+5sblnRfVjtJct8C0JaeaaZBSllk3ogZuyw87ZREr214ZsHPn5P0J46\r\nN7rltpLpECJDycI60wvbGjrjppax8BmkSJxhGZaKvhDa+1vmxADbCW7h4LHg\r\nr0j2aSvfFNNDxpDi00brfgKDg5yc5p2Q6JaBW558vETF5R9c4QaI9Zi3+oEF\r\ne5kqOkHwTxcMTOX8OKXgmuSTDqbVgogoaBg=\r\n=0p+1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.c52524e.0_1659246256700_0.5416512774244089"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.e59ea19.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.e59ea19.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.3.5","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.8.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e59ea1948a6f67f38ab99fafbee9cb907eb5dabf","_id":"@kaname-png/revoltx@2.0.2-next.e59ea19.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-wN6AYSnxK+Ko4xLKbDM0f/9FX39w9UJMiI6nDNy5FecRMlxrDV4GIq+cJm20bnzBKOiC4lTky/d+kENQOlRdCQ==","shasum":"81faf0298bd4fd60461cb08be7b8d4021b612ba1","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.e59ea19.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPnAHm8HtJsfBEIkZB3YEUAae0GNY4kG4gBjP6z7xpbgIhAKyH+ej9JL48xh+NWZ5LYPpmpF5403XYMNMv6R9NWSvX"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6wRFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr48hAAlcKPZsN4pwE8aiVi0SNJujCn2AZGz5DRtKpL0unAgD/Gis0A\r\nkbtmSXPudVs7blcpl7En5h4CTvfFLxh32A9hKCl28RevBY9rYzY3zXpi0nlg\r\nETxy2tiE4MU0EEd9AWywta8YZUrrEu6g7pOitF0MhMEz/0UvEKt82sKT8lRe\r\n49HLB4Gre2YfWIDtHKi5hwtDDZbssgrZjo2oakKza5+xbdvik9ulkFVmVvsT\r\n7LV4Xp7ZduUVqF7fW7Njqwb7fJ91h3A0cBRFpbssyb9Z0oCnJFlT6hAnqY0h\r\n9kg4igfJ0u4zIbNZo85chB+GwDactmAT0aGYist8uQGUpVdExxQGE0ATjqdO\r\neDGUOkc7S3gsf9mlb/9nmllRYhoGosbZujMCxiqbVA/85oTvgQksP5i48TlN\r\n2w7so13rY+HwEw62w1zkmBtIhXvddhZcXss49X2Zvjn4OWtA+NluiCZND5Cz\r\nCjksj0MgZPfUT9RqEfvyZfvSqLujpkkOzfDwGVCJzbNGiQiG/VaMUvTCVfgW\r\n0T+UdeHkpy8NvnhLlssPcISeeyCtatNh3sYttkUJFOU3il0uTrFo/z4rWu/K\r\nM7KAcxE93hhodQhd+06KAwMjlPgQdHCcGLR+yvwFQALYqxklVU0jqyiJbCtf\r\n8pxc0RSEykRPZtgL/BYMzRGUJHqkaQ9MRCE=\r\n=kSLX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.e59ea19.0_1659569221325_0.8336103853986054"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.3d4689c.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.3d4689c.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.5.0","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.9.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"3d4689c109309e1baf68e403aae1cc09740f19d5","_id":"@kaname-png/revoltx@2.0.2-next.3d4689c.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-MkjpzvjMMeLZg0o9zeRSCQvvICO9qjyHLuzS72l31GFGclTdNGetOMzKh5HYLOoKAOQTNMDLjEgaOryFx4kN9g==","shasum":"6ca64f00584307ca50c6375c53c90ea6218d41ca","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.3d4689c.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFlyL74/1fmbCfJSqqpyY2ZA9mntBCa8+LfPllTVz37rAiBB6+VeZx2DqpkBdvHz955Y8H5PYiVMvwTtKr536rp3OA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7yRhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqeVw//emyte5p44lmpJaxsoXOdvtNIUdb1yGYsZJGKTwvJ7V1gZQp8\r\n1LpY/GW/WmF54km+d4aY4bI8/hasYV4P/qYXXt/wmGgWLQWRkVigfzPaQHR+\r\nW5R33tqdwuQZ6C4AZ2q6B7p5DsH/inb6st1QQhTZCVNjzg796Zvlf3nK7z1V\r\nrXOJAp6Jkr/4VrAH6tRfkoDJxUdehumZPHD3vb7xsPIBXbN86uJrLQjJ4UEL\r\nyGnp0ONmUMdHaqYOGdEfiPJJtTeSuv1fRqfnio7RWCzph3cy/F8wHy90HQCc\r\nLU1TdGM8I7VzNGDqwJqeVLq/Ftk8riIQkyNfmk8LRYmxtOyzMMZf6LyS1qqQ\r\nyqgRwhKgveYA+4Q9tcYxdEdNVXeTQXoRKc9y/HVb69kHlgsCjfUjxoWT9krD\r\nBpXr3NbjM63ClZQRFzamg3mcmlNIyJI7DGVvrliE00+ca1i/ZuLOMxRGE6K0\r\ngDv7VB6WVqKWKg+R1nstnFcfDsgh/tXPM8x0ahNlZvHRyp1oWohPML1LbyNM\r\n7qmV2KekCoy0fSERA339w/xBqBJJfzi4Bq+mvfF173F4k8g809DcJbeMV+nT\r\nMiJw8P1riHRJWbXwLxFlPtGNWF57p4nxq7IKTxIcq4TytgFHK7XH1LdIOhFK\r\njWFUdqbxomN8UVmP7nhdlva3beIzR97+iHk=\r\n=e4RR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.3d4689c.0_1659839585373_0.19808181571880645"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.143568f.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.143568f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.5.0","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.9.0","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.7","@sapphire/prettier-config":"^1.4.3","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"143568f9f94e0008b83d86b5ff3c7327d73acb66","_id":"@kaname-png/revoltx@2.0.2-next.143568f.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-hPca5rHNfeXgTSAaB+9isV0KibQ/tFKgUoUMRnazmyI8tukYSNCSWZVuSxnPEFr++QCCIIIyqvARRIU3lF6LeQ==","shasum":"43e2465704d36d29185f61ff09b4edd5d686a5de","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.143568f.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFWIfT8xPn6dOahOdw+ZjHV1XJjL1nEtsEjMmcyyLYfmAiB6egkEhEBmB6Qejq773PgbtR2bWmwVtqEOkRQQ1kUuoA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAY9PACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2xQ/6AyDRdtPkKc3p1OhZGamP1AHpxXCDt8Qg44Grb2kCNHIweJVx\r\n2pB0Ypu9YKWHRQsnUgrY2UV7rdigv9UBGqK+oj0v4iZHwLiulDcexi/WaDVF\r\n1cr7sFfJHGrp6m1RBVqiVPkWKm/OIpO8sG/wWK/kQs6xu8lORYe44QrA23SP\r\n7uk1tkjcujQNKGydDCuORYOC5rbIX+bckFxwog3yCJrRx+G1VKWmx/PFmU0Q\r\nAsENAMztCGH6V/4ZPFnKyLDlS9nbLfAK+wzPhw21IuKwHhMKOJoiLxbwoQQy\r\nsiZwtMxMQL2iec7XAjIuJKeL8rlaYwob5TcwduZQHOpJ0CXSS/2OaJF4VQ5l\r\npDo+dVKnJx88zTbBNdrI5BMngXX1PGVTkbI9S4EB7LhHUro9R/YSKI4nF46+\r\nwx8UcliO5Q4nrazQ5w3ZNntcWIBrJDqHdP3tF3/+iVTV0zxt41OiawYecp/b\r\nkOdYzDOJ0Ev+UZ/IxDh2dEiz3u5i9WROAa0XOwTmpJGLmbSXMhM8ZuVsjLm3\r\nHmrIl7shaZV0Dvzk4IdT/fpuolfH4N+igaHtS+a8CBANhaz+UnGL+4torNtd\r\nh9sSo9+5SFk4XGOVgOo5pDHaPjOFwH4ULDQpBa1vEdt/L1E2fdGTRWSFEqya\r\nuEsXq+y3vk9YxFQkDduvwYFJXHcqbt7fQWA=\r\n=7gcr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.143568f.0_1661046607770_0.508174859402281"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.8e7f841.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.8e7f841.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.9.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^28.1.3","jest-circus":"^28.1.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8e7f8412dbf74a819951ebd48c54cac35e8e69de","_id":"@kaname-png/revoltx@2.0.2-next.8e7f841.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-j388oh63N7jyISwljZUcVTbseooqpwjUCM7ujqBB/MlZeo+eNZklDQPVMuoS4sYuHx/Vy2gptOIh7RwNiEWM+w==","shasum":"0a6cfe7c08563c74cefbe718b058f793140097d2","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.8e7f841.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGYyxvDSBWwnfcrCuGtrdpwFVqKW1ZxSvJ9F9O18k4XGAiA3+RmUArs0pSVfbWgxOsHmLeviESV6+vNwPFaFkraqQA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAZBFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+tw//QMltukVFFs7j1srtdwOJDp+0xVYAqqzq6c2JaPN8+yr7ipeI\r\nxAH3WIoeTZTzBg7VLmCcDQT4+6LfAu2fHwceY50kJk1xe02i0gnTBIKzimPY\r\na8nko6OusEBSQs9xUMKcqCylLZ83LJbKQwiThNwpRoVjdMFxQJgmOghugvi5\r\nWZoJRyDYPERNIFZTznlafOadOfC6tVURfWKj8uGaeKbnjaqaeEfkvgD8ZMfn\r\nEWA9NCIo1wJeth2M2TCpvhcoaCuvVqau7Bwuaknhpd5ekHOlWVax2ukmyiOh\r\nFuA2PPIP2OjYUqBR8altKPnwhOtsNRziETQngOgHHSbA9MLWGUtXw++EfrV/\r\nyl6Bx9mLKTr8IxUJYlmMOIFc+M2K6X9oFPpl9WWINQzymbYQJxauNDrWRMpp\r\nouUe3ixeLL9ZCVGY4n8iZL6iYbWvEESv4lbA9ugCVxtVwv7Uq78YTQAhLu14\r\nsV5NyPD+PZvzEbh6Jdp3ThVeTOTlrWH7IAmDXCd1TJuilmsw02KtzIbfwTYk\r\nhwkoo9iZbV0GOOc0SefmBuBPFNBFzCor6ws3Iy5PSXjeGWk7hfKICFPWH1/p\r\nEAxEVcYNIGCAhnzqYz5xwU16+qvDvC4PebUPc/iEKZCHyIVmcKAMLT1kjgyF\r\naBd3cUZpBzaTkYbVfq5J2l/Q5zb2613l36s=\r\n=OpRE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.8e7f841.0_1661046853171_0.897511395602121"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.42b1ba1.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.42b1ba1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.9.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"42b1ba1c84d6836c0dd85b5040e3f1609e50ab86","_id":"@kaname-png/revoltx@2.0.2-next.42b1ba1.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-XtrRMT5yiR0JT9Jm1/Mzg0vK3rrJoFR0isKW6axBNuPPHen9eIu0MA7TaK7PQhvLVD8hTWbJsLqL0Kqu8PaWjw==","shasum":"33f19e53563b0143d87e44090861188ee897cfba","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.42b1ba1.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJP7SUYeY+/JCsaapkMErrQbfYtErlHoq/SZxLEJQiCwIgY5trah5oftkc+1ON6A+zsIiQSd/9lh9ecs3FYtFrAUc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCv24ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqeag//SO5N/XNRgcl8UwHDZPvV872jRIXxtpYMAAAn/RA5NFcFn18e\r\nKfWjYD/2cLad5ZnBdmtSqsdBHrzL07cIW9fMkVyQohlIxvmyf65EcCfTE+my\r\nC3diBFEnP67LceWgS/D7erJIoHPaDZo5VMDgOmkBjsb9CadS1imzh3OOFQ37\r\nGUSwMaBgPe68DIo0Rk2dRmmWLPLiBQq+gkDj5+2+5Ivm2i7BJETeqinNhHxr\r\nCzZlplbXrNb/mSvjzDH13kkLHnEo6ruat3Mtj7vFMgdn+knWrZNBuEZDBRrv\r\ncmwS7LTHJq5/JMh02aIYAQsniAfmhYH1eS5AySzmCM1xCGE2lLd/HpEQm8pq\r\no87ZXGn5xbIV+hj0MWed1Wfbs4mhOGj8XAJJnynA/IRsnhC30aHQT7plwVsr\r\ne3Vc2dA5VgbHo0utNg7/KnTLD5SRDn/Etkym0SYLwNK5ZChc+4R4C2Sk24r5\r\n2hQqHvzrPkRmi69oTX6Xuzk0pvkyghetFfYZrz8q6yfRwgVZfEP45fn8uSCr\r\nVWaOoiDOeV3JYnTG9AKYU4yL8ds4AOpZ+B7c7VwagIPBK3906n0zzNUT/PFE\r\n3nLEf6pBaoCAs/3j723T2HTXS4MJai150ZTIW/eaa6k8eiZGkV4+PRylHq7c\r\nIWEvPLZYBZQyZ834KpF6qbJVE+Tb5jUgOCk=\r\n=tVcI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.42b1ba1.0_1661664696170_0.7303975723946348"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.4cc6da9.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.4cc6da9.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^0.7.0","@favware/rollup-type-bundler":"^1.0.9","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"1.1.1","@sapphire/utilities":"^3.9.2","chalk":"^5.0.1","chokidar":"^3.5.3","lexure":"^0.17.0","tslib":"^2.4.0","tslog":"^3.3.3"},"devDependencies":{"@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@favware/npm-deprecate":"^1.0.4","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.0.0","@typescript-eslint/eslint-plugin":"^5.30.6","@typescript-eslint/parser":"^5.30.6","cz-conventional-changelog":"^3.3.0","eslint":"^8.20.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.12","standard-version":"^9.5.0","ts-jest":"^28.0.7","ts-node":"^10.9.1","typedoc":"^0.23.7","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.7.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"4cc6da910dff3fc5032c3b5de97f20a030591b96","_id":"@kaname-png/revoltx@2.0.2-next.4cc6da9.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-KZo5BDRjwhd4njo9l+CJgMxLqGzW2RddcOez4jtCly1ZFNJwuhXHD/F624gnyp3lkkl9P/iaqWrtL4/N+TACQA==","shasum":"08aac4ad9649205a4ab8e71be95551b7b3d58c4a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.4cc6da9.0.tgz","fileCount":176,"unpackedSize":268046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCE/nOur94mmOq19S7y4Q3Vp+ZUFu/enyPJcRQqMXYicgIhAI6bAt2TNmUyNLs9I6WWkHV0wpkqGZ5y9N0Y7jyPxvVW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCv4JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpAOg/9FHOAPiJhbXJu5eoZlqqZMIQZkNicXzZMDpg+jz4rmx+T4xY7\r\nS2IZoinhGWuKh7Apz3Wft0Eym4vSNTgPEG5aUVeEgriBL0YP3mpWdqQU3gtF\r\nWW8MTwLTx3U8YZvSPdx0XJ91CMqCowAZdtjKNFKwbbMUKvp7w48XjojxRlGI\r\n/qvI7wQF+rQHaJLqhkZSa5SFmz2AaYSNvVoaJ/TL47zFHSjMq+JfCa4WRuFw\r\nszpjMYhQ1edtwl1UamTTLSjyQ8HZpzGjil1XjdqY65TjZg2qV2gxqoHDH0Hw\r\nzoNVCh5Ugjf8a9sYNVK8b/Ow13/MbDr6wnvBucNvBfG/9is0roTJ2hNfIud2\r\nUE50bgA09rSeHgIOOQ2Ymgkli7iHc2q9J+xjTiU583sV1y81zSo7fVCcqzeF\r\n6i0Rn1OWEqkXfzIwjOKk7ENVpD/VWQ/mezBAP4S044Zmr+HO8Uyd0ygt5A6J\r\nnE2UU5IkuKNh5ebzE9qLu1X5PfkuqVUE002kImWssOcf4DjA78GWUqQXTemD\r\nJxzSFKsjeyn7r8IsDqvVAWG5MIU9RNgUBWFT0SuZNJXScS2CWi5yD0LoXYq1\r\npoTvqF254tHdnkx0ZwRIwFaCdqjIIRcrmI4X8IZQlujlembeRpJDNTkm0y4w\r\neVn0SeQRBQnCXZarW4CV29iR4eDGuJEGlu4=\r\n=ao01\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.4cc6da9.0_1661664776966_0.01944543693511136"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2-next.5da1813.0":{"name":"@kaname-png/revoltx","version":"2.0.2-next.5da1813.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^28.1.6","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.13","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5da18132b2e3fd89d29786149fec638b1091095b","_id":"@kaname-png/revoltx@2.0.2-next.5da1813.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-prU2h6+go3b0z5jpjcUsVQ3gIxNadc3gXKlcX57W0wTZnrAtEJmdi//1e8kTJ5b3fG2v/OIzWALr2+bPJYE3yA==","shasum":"8d8ee3a9ea56370c21478d2cb19f057f679afa00","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2-next.5da1813.0.tgz","fileCount":172,"unpackedSize":263262,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFpov0/0mzgIX4nJuBtWrwNIPa2Q72nZlwneljXcpEyWAiEAn90c1ySN7zX2xj6GKFHtSEZGS6saJyiRRWZmhUVlypI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEnRuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJLA/9G+OKFHzqfquod5FK/nLTTWB2rzxceNwwh8ol5q6iprl5OwWV\r\nhuMnFsjpalZ/+CKGx+ny/MhiYgCUVi1z2xomMiZ7CVVD91C5SxeO5nBbVAcA\r\nc/AGQn4ey6NOXp2Aa8gXhUEV6/Ohj4v60yD0aTkAbU99GM2hua7zyaqEb+n5\r\nuNAzPVuKFBp78xbuFMCBg8NMaWmkKnaCIyDzY6cw/9lDvh8aiTtD327BzMkV\r\nc3Ft5fTjo6A2f8TM+XZaedGDuRowoI3/sckHjQExjiUsquyazfHgdWaEhacm\r\natoJ+wAvNHslEgdkQXlR79i9DQghfWJ1kIvi/cikhKHvlTGomzJPqzh+b4bH\r\nnr3y534YA6uTdJrBywifK/eQkmNauJEMTKFJhPlvSP2wgi7nahqIqbYq7UFl\r\ncIaPt0gyUzKPDViVw5G5NQzanfE+4TEGMWSrsSN7Xi3bSCNk5bV/wBjKbjOb\r\n7pNMwAw3vUqVxDu0s0mDhOX6KvTJeeub/aoZLveyqCSjO0vdfR6B4h3g8op3\r\nNcBawJwMGD0vF74mOM3N0wyEmBv6Vy5VC0pvT1OcCiy4mZ1Yy9AnwzdFVwg/\r\nPrv7G+tRZtaFtIFb8BG2qxLH5tbREMWw2+7OW+prCE+9O2X7QC2+Tk2koBpg\r\nk/5XfUT1FE7b5gvfPvdmwcq4GgdZLvjPAeo=\r\n=5c0R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2-next.5da1813.0_1662153838339_0.22604907933827745"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.2":{"name":"@kaname-png/revoltx","version":"2.0.2","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.13","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","gitHead":"dcff08ec305b3563e86e8b3e6ff9199c21cbdd38","_id":"@kaname-png/revoltx@2.0.2","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-sugGJ/hM4LlqVuPBaeigVmKGBb3wjICjsNu/24cjK0H9e7rUQaD47qj40AodkcGBUm7WdwuF4JBunoh5acK23g==","shasum":"34bf5af07bbe3ded80abaeaa332ac792a4785cdf","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.2.tgz","fileCount":172,"unpackedSize":263286,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvcoUyr4gWf+HLWCTCRMqcR8dtqdNw75uYf56iTSUE2wIhANrI4Kadoj9qM49NFmsmJC3jlupT+F1ZjQt21/TgCiuG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEnSUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMcQ//cmUt3PZOxddWFuET27/S3CaZ2bmVJhvWaJ6k0/+fnrwuniEm\r\nnTP3ndcTsrFc36LtE4+YmT4CkVu+HaQuM5g3M7AuDODoDeY3oNK5cNbL27tR\r\nxkxApxph/kxwHLD1Shot7HEdx8PcRvy65wSTfC+cUTNTLfkOBFG8Vb3rz4JB\r\nodoomFAVL5VuV1yKryfx9oZru9dt97x8uOkXfKtKlvd1HLh0UVYm6VO8/JDG\r\ncwS0SZl1sbkytZtX9pLmEdPexivSHDpHkMIRqiivSFOgtw52YiaAupKASMHK\r\nXx+ZTSkv3bwynbXx5q9+YRyHAFEKzGrdV/oYmC+A6t6kYqBdZDpzK8Wls0+P\r\nxJtV9fOpYFKA32ULqq8nAf9JBiEK6O7WNb/ANBXflvVDGEuVyVYUGYStWuAS\r\n1uQ8ffj4tQ0fGQAccc9R7Dcn4fwN9EqS68Add3qxT6HIWJreRnFSMz16Sply\r\n1SryWxF3C59uoszbcg7HNnRtJ53Kqt/J0lx4thbx0/HeOtipLcWpRIJAmSEf\r\n4JFSoXpINK59AFT2CSAhduIkE7F5VwePyZI8KVjZvp/EeBa5j68bsUx51RX1\r\nLjXaVHeRZOdIwyHBTNSjLxidnHUUCf7BUJEIoHXVlGsHSUCItLmujfdUqJ2L\r\ndcq1p9dIBo9/eePBxiBbMA1UcH13WaUOLIU=\r\n=PYDl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.2_1662153876591_0.4796853611183356"},"_hasShrinkwrap":false},"2.0.3-next.dcff08e.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.dcff08e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.13","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"dcff08ec305b3563e86e8b3e6ff9199c21cbdd38","_id":"@kaname-png/revoltx@2.0.3-next.dcff08e.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-btgzBONgOuu55vw4BvL5xeTgDOidDhb3n4J96OnM/+rqstQiLz3gZtFsRroRt1OjfjBqO/c5shMUZ4sryy/f9A==","shasum":"f5061f43fbe4c6935d7db5693935e01a0a6d85ff","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.dcff08e.0.tgz","fileCount":172,"unpackedSize":263277,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNl8mMqehj5tiALWjZnI4rfLtxEGJkWY2h+DyR3+/SmQIhAKWJUR0oPyRQHEAlRfIbVJPaAkSZ80g/UG6vSa3O66gN"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEnUuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqlyA/+Kz1tImg9+gYGQWKl25aHh8LDzWtwlbM0LecHR0MFmMmeiTPL\r\n781oO6dnXELPGM4BrEnVyjjvCtBbYhnWlyF8W+a5HoDmtBir/+LjWITqaWJb\r\nccsQ0Cxm4dah8S/weyGnrDDvHc5Q8kazayTNVhw1JVdlDpoTJKMb8Em/lx01\r\nCDYSb3y5JUw+iMnxQzfMQJ7ZWQ5WBIJe1DuHmak5kdUXxG6UDZEdXZBaOtIP\r\njm6SYVboM7fG/p0MBhAadhH/0m+1UqpORaqF8g8dke2qsm/wEMDhy8hM2uaQ\r\nWu/gj6jiVOUvGHnMse0vfUhXlYyHBDRLmHvoDX3VOgfUAWlOOVtaUZr1C/If\r\nJs/tphAKcck9tAbRtZt28ibaR+AyjLL/oXR/Mj8wvhKEjRWA4skF/BSe6UFi\r\nFzDjqftFByLUb+Kx+h/QUK6wOaMAy1lo0kF7SGa4IgnRyZVjYAvCYeQLd2D7\r\nXewQxalcbiovdx83AAWMaS94fv4JIzBuwu4pbML13G6Q2tQFkRpZ4qGTPd4X\r\nidiRcYcJ83ZwMpc5raJ8ljj1qOf3ez8MUpkg6av8AOW1nBD9n9j0zRXJVbkD\r\ncXvl+5iBiGpYEO8Z0eYoIMutt0RZvGlyOKuFFRSVwT7QwzbpjZNG8Qh5NlVn\r\nlPdjhqqSXphCi46Zq6qsOoPCo01MZia+aPs=\r\n=yTTy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.dcff08e.0_1662154030253_0.5301841167528265"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.d0cef4e.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.d0cef4e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.13","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d0cef4e107c7a7dc0ae2afa97b4f4244bc53a969","_id":"@kaname-png/revoltx@2.0.3-next.d0cef4e.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-qW+p0eCjeOPuDpXFE+yAzrfK3vEReUgAtPilnaxujDXK/K1prkBPDEIlYL+e8nQUN0iNIkWk98T1mwl/JADvvw==","shasum":"acbbb295c94f244a415211765852a8fd37add422","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.d0cef4e.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPdihxQEa0TU/bVmquMViibXX/h497rYm11fu53sz+JQIhAL8arxf8aFub75QLLZDMpdr/llnDU+FTtUSuFIPHNNTV"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEnWIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoyNA//ZPo23g4QwcGh5aNnwCyOc2CYBduqU3fGxBNaLr3HHAVSH1EW\r\nghOdZp6W4ayuMAopUF3BqyQMqmITG4h6xKRuQpxvejDyUT9zPkrTFA5K8qja\r\nJw4HnNkA08dM4PtG82kv3MDIekoEDzBIJjQUa4kDspGfv0n5jZv1ehmDPtNP\r\nP+MAKrRRBPAUikj0qOAjU5BxZ4N+FvaD0axBkNZ1Z803lHAQ2+Za8JQ7GVyL\r\n97SMV9gY9XZlBINoO4XIO5xmy36ldWm4BqW7NegQE9oVAJJB+bseJMUtkU0Y\r\nrFZLNfwuGbnSZXgBdGQm3NyJI6hmggEeIYPsbGPTftEOA8aAiOYzJbj6fT9/\r\nUkn59jMyY8qhaKYzpPfTgM0mYxt9TjlB9ID1DgRKNkGM6IL0Q3EP/r6pP74C\r\nKVyN7uZOctlMYXQzMAu1x/uY/NeYMisfYCFM5+AJ/5Qbw8nScoPmn2sqJEMQ\r\nlct9Pp7SuRNRWYK/ULuq1oHyF/OBjJq4L9Dyw8UoMIH3iT5DGgL1vYKXffGl\r\nq0UEPIW8+BMO7CAsmQsDBmjWevZRvq8reEnd1f0BJgsBbSYQ17V1PzoO4oTl\r\nT4GrNPCPN3oOTcf37f+AuuZe1C9kTkNg6wBmdiTV5UhigsviQW3W6MOLJxzI\r\nBjR3x3701MlrFd1tTXINwDaQd0Oaf6YIU08=\r\n=JbmA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.d0cef4e.0_1662154120420_0.4509957526182451"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.6444d38.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.6444d38.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.1","jest-circus":"^29.0.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.13","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"6444d3829122dc852d641a119cca7a5bf892a2d9","_id":"@kaname-png/revoltx@2.0.3-next.6444d38.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-hT9X7yw7K8FZl4BgejtUOgiy9eQ5AIyvkZ3yv2g3aj0mKo2RC+p0EOlb7VU9WGfPgAt5dg/I3Eyjq90Jf/5eXQ==","shasum":"974e4d1854cbf4e6060fb97709a9d5c68e098a5f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.6444d38.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNSnmKUYbF0yvVhZyv/eq+7cJuxEgONlFdn6UdaA6Y1QIhALbut+wurMtjr6s8kBv+7v0sx0QNn5G4p4KAtaRNbihq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEnccACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqFzQ//XMI/hhzkMbAZsTdSZaweKR/4zRpL1/qyCXYDEHEg9x9dAHsJ\r\nooPhGPyeP/JzaMYw9aaPhRsU/Skb+Mf8c4BalmrrCwz7n73WAdd/qmjWZ+ND\r\nfNg3E+dNJ59pnxFLj/rwecqF/wVzdnodfHlHj0PjXbiMZgoUZ4hyQJVOjzkJ\r\nEOybck+pcaym41fuqBc4/aZhnwrdFaTs0D80feOE+fovCMBiMSHMUcCUaO/c\r\nSKF1gMXsW/1//XOoM65g1zrWnxit9NhzN2UcYMNlOXIvjCmy5FfHyAj5ZaxI\r\nWO3AXL5Sbe2zIBj3W2YXgpYwSl7OL+pCOu3c+CWvYZyqErsit8hmnYUTN+cd\r\nf1Jk4uHAbhfwpopHLUMFl8eadTbCm4GGHWma7JqE9WiaYOxZt8MjVg4rfOkQ\r\nNyX7h99ehTLgm/7CKufiXEweXAYbN6H5ynem++ebg3Zcwkj2BAzsov0AlVFw\r\nZyQRcE4bzbzGZSK/3npdeJKJfQw4Z5QjnCD3MYKH4BfMoWzE6CrA2z/COQkz\r\nyrjztEF3av9t2Mv9Z9T1KkE6fDHwWMgEokZ1fq3NW2ZTvIWaeA1e3JwVwZwx\r\nGTZ6HjkB0sQ5CmRQFFHmcL9co6e0H7HrbRyRtcKNeCrW+hyW25Ug4UbTEi2G\r\nUZfNTnEaZIg7rtUMOvhbT0kc9z6upHmzNNE=\r\n=WDRQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.6444d38.0_1662154524356_0.9352651537422632"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.b5fae53.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.b5fae53.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.1","@typescript-eslint/parser":"^5.36.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.2","jest-circus":"^29.0.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"b5fae53503ecee634061b2ecb6879e97bd5a1df1","_id":"@kaname-png/revoltx@2.0.3-next.b5fae53.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-vj50gQVk1ndV9Q6K0hKogJ3g7ov3omegIfRKCCXdlh31FwAQdr17eyt4hHk6AoW+bsJF2wFuWLYbHtN917fvJg==","shasum":"5a3e73425ddf3c6c9ac85be7a209ce4b76daa1c5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.b5fae53.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9s+ePc01HU/xQ2Kfo700XRtgJ1tpkRWY9TboRJkzDbQIhAPhF2GWkjv3s0hL2RB5kui677u22zVaF/rBkqdKSPzNq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFAuLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr58RAAhjGZC22eNANlagX7KGmdIwSX44CgKhrDq58dUgXekwvMXft0\r\n2RrGZ/WtNKynKBpYqMVEAjq3YHNVhpS7dlGpiTZg6UIl4uJVGjqRrXISQtCy\r\nalHI3ZYcG3vi8hlEwrczZSEPdxMUT95GCwb9BnfAhUxUNc1grnGjjL0q0DTh\r\ndg9Xfpu+9uAoIVtV7l+erKaN67auhHk8tsNQ04LLTX2skgA49wkLodUUsGLq\r\nnuJjEGFpB740Biuz/6G/c97nyqby3wO3AJ67TfF6b1zwoDX9FN+Lc/vJAncA\r\nU8V3RU0wnqBgPr1KvOCNfImAXAk9Kw0oQ1PDMaPwroiM3W2IB96cz0SOH0J9\r\nZC/HSh04B+5sUm9WGxwt8zOjJKUOzKX2DSTqY8ZIA8nBji+HYdP2u4WoOlD2\r\nbmEd0OEfgd7jOK7Pc1f4DJUyksLGbvkhx3DYLDH6LfgR9b40W1nUJ2VR/Gng\r\nQgVBPlpZc7s0WKprPfUAkvwo1gjLVxv76oAzHKsQtTZxZNavto9Sbuu3lzMZ\r\nB7DBR710P9SpwMx3cLTn/FiDd8Upt49ftQ+z1Silkeojq5IVqKDSWsZc4E0U\r\nOv1/+SWZeiMSmEdA5Z+kGmMiJP7XkyFoPzHjCAGfxaMZPOKUy89QbNi7mBaL\r\nRsw6pYpAP6Ke8V6Lk7EvB8OGqOfSQdN+f24=\r\n=NjlW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.b5fae53.0_1662258058893_0.6403589186681424"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.7e56b3b.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.7e56b3b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.36.2","@typescript-eslint/parser":"^5.36.2","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.3","jest-circus":"^29.0.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"7e56b3bae0c182e78f7bb8674f516125cee930a7","_id":"@kaname-png/revoltx@2.0.3-next.7e56b3b.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-b2/CE0iAzx2U1Y7WUVydt5dUyrXis8NgqMNM+cDIvErhXzrK/5AVmbD9a9JtqGQnzMpMdUywQRrydAGIXjkqWg==","shasum":"0915be86e46bada79de7a6e58bc2149ab40792a5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.7e56b3b.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCC6KVjmbS07HzG03DjDrrAPhWgSRhVYVRwCGthIFDBowIhAN96CRApduBXQU/y8j2W5FrvM9FWu3g6P7V+TRUa1DWX"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjHWjkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIMg//bmkWe8Vd1QhDMsCpOonIvSOl/G1uuG1VGaQSDphFTwqRUGeW\r\nk3Wr93T9CKsj9x2C07Sa8gGDDj8ZnP2opcz8tEVinF/TQ7Y92IFPR+X4uUVZ\r\nydxZzdnyf/euYSE7rss5NQr9XFSiZvacGB56FBUt7MC9Y/AZyipwCVaS1Ob5\r\nsOsh/sfKMz8x3+lBH1LoOkkRV8/YIGkjyaGNatdyNgQzUVoa/WXEwGyFdOBb\r\nPc0wmFqVaRDnCC7GRGceYCAjVQZbNuUs+fKSPtunQvOQ5YOYcL5kl2wMj2BZ\r\nM4bTSs+3BDE2IfxwVru6s/Z2GwXIIB9Iw7jHq6iNfmNpiiIf4F9man9wolbq\r\nckNwfVWoUzaypVBrw1tNImEu3ji+tp3CvIXhq/fYgTPm7LO66uMltqnGKdOk\r\nigVvRROTedly3K1+xqe8Ub+kC6eHhqCyS/rsPUezlHm6xvNFoUnFmE7EUq72\r\nDw1drQKJsxbUQi+bGygXyD0UD05Qa386MxoOYjV8ngX9Es0odkzMWATZv6LS\r\nukJZvdeumb967syVqBVwRP+SYnyEq4VBN0sIGnvw5CkfWy1QVTgEFZVpJ24K\r\n6iudpkMcKfZJLX2O55uxzndC8LKakRuvp0dfevaTVdNN12fiO68LNcmrtuAd\r\nusjmKdOsRs6MHI+JqMyup0tZkzrt5ptnfF8=\r\n=2S5p\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.7e56b3b.0_1662871780490_0.8595114393773584"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.92db3c4.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.92db3c4.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.3","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.37.0","@typescript-eslint/parser":"^5.37.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.1","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.3","jest-circus":"^29.0.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^29.0.1","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"92db3c4613ad0180324db55e4e1a0bd1a439d99d","_id":"@kaname-png/revoltx@2.0.3-next.92db3c4.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-UD6NttKyddgKbSqMxXHvWNZ8zZmTx+bWndQDWGv8akoghKpRHV2Ozaw2+FSMBy9T1KRyw58hrm7Cy5GwZGmPBw==","shasum":"b8ae6e3ab765ff99ccb89a94145690b1f999a5bc","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.92db3c4.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChN2vxUT+dk4hJKnQDPh/1RDTOn1GyBU6ULG7ytruI5gIgeoJslplolNEgPpsKVMkfQ6FVnb64asQfV9ybtD64TsA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJTRSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrp/g//SazPZTDVclfi5YvopUH9Xlll53jWxco9oe9Dl9qWeOUGb2oo\r\nPGMpMWLpMzJ8sUopy9c3I8vdgNxrfkKiY870IqvWB4FnqithHfTnrXwoPzxR\r\n/fd8Qrz5LApah1bVcEsNcLlJwmXBvYRxkb/zk7JjDoxYMEiR/rnP0H/zwg5/\r\n8uK3cej0xvGzVoZnUgfmoT1CEq3T56n4RGuyY3GpcxJ7/y/7gF1tf3AW1P9p\r\nVXWDwn5DECXjiQ5z2D2cDczkj90xAC0Ltqm+e4IC/SjS3goY5ZKJOHrp3Wf3\r\n00Bxa9MkP57YP7iWotthCNYq3AnYZ003u56IDSF4gs4r5+VLuroZcXs3PFh2\r\nJcsLBWKRVm99nwuAx5Emrs1WM5rXZFcDGsVe+5pRyuaxrsz8BlCnXAvk5H+o\r\nkln6GJsxoAS1Z/w03RQkIF8hgFn2zYg/kFRqjDRPhZzHSkZXDTLW9MH51wcI\r\nsSHWoAvRiVsQuLiYXz+87f09MmEbFF+SoY9OSl04mueoRa0ruG2npRn16dXV\r\nQ1UtqrDdVwRQ9MMCbEMg5W36aikpox7fwVl+Ah5NQ4/gw5jYITv0WjhBjBaH\r\nWPXVGdYt2+sAIWxHZD2pJAD7uxBIUr0HfHxQP6pjdWxoWvU24rJcAUbVNMHf\r\nCzGmoiSvLOjcY7WJMrWPjWQ7ivAUtlettOI=\r\n=ThrW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.92db3c4.0_1663382609811_0.229371353172924"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.e1dd40f.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.e1dd40f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.3","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.37.0","@typescript-eslint/parser":"^5.37.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.1","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.3","jest-circus":"^29.0.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^29.0.1","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e1dd40f2d825418b208d2f28c227ce39f95a8006","_id":"@kaname-png/revoltx@2.0.3-next.e1dd40f.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-mf7Vib7sTOztdMKEZ7FNW0AWIXD9KdZUAv5oMzov0egBku+pEEhEz/IggekjTzYn+NBsb38Rf/aBOj8tYcFANg==","shasum":"6f1071669bc2730a40af1093c308e0855da56195","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.e1dd40f.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBbWbYmjZaGyHAQSv9qyPxfnow+N7XnVuHQ8TzDqUjCLAiAIuEGhGFstM5xiM+tfjYDUUzrHYdxdk4cERqxkyQQSlg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJUNTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9rhAAiGpx9FdkHXBfQVxPX6sjIVVR5xQE/Dm+jyn0e+jbngdoC58h\r\nOsqC24omJhmz9CWDGDe0xLyb8qrgxuCefcdaZ94RMOjS7vL7KNSJSMoAwCOT\r\ngdu/ky6nD24MwVFqd1/q9NwAym5kBXoU5+Wbdi4TMjbjF2+1isgjx4cPWh9d\r\nhVCH1hzANFM34yffhDt/KHhzp9iUcXpSum6oulG4bMcIu9mdHyQecbUA5OwL\r\nD+mb+/1QzdomINnXHgbA0u9xHy2AVIhNisWmS3KQScmlQ07jjN2oskDrhAi7\r\n8tdJjtA7rTMi5GLr0Q21DJpaPWVOULKtCtss4wtGYiP+0o4nGJ1iGHol2Goz\r\nP1igKI3d3Blm3N44X2Ua5ukMT6fnBrRGjGpdx/JIWzKJ3ZXyjXt4Mw4LE7/5\r\nrD/5wS7hsiN6noDtA5enbeQ+vqMmZvzBZV0fZoG2WQGsPG1R4zM9i252x/sH\r\nS+BFkU7vj41sYj5wyhLUY+hnaXViCGAc+fZmt5kQls7TBzkEv7XiZVWu/JWA\r\nF5trw5oo8AU68kHiLUH5daFbCRo5sT0ee8vx8vEFzFmowq7iG2LKNJbtHd8B\r\nUNtaE967DVnNFE35PO24OcOKvCTsU0iZtITrmYvFNwAqV56gkHfOCVNFecBN\r\n0NOEMkgQUfQW2Jf5wUdW5CgpqYmjpORXHFg=\r\n=Jo46\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.e1dd40f.0_1663386451244_0.14316255354987706"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.2b60feb.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.2b60feb.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.3","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.37.0","@typescript-eslint/parser":"^5.37.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.1","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.3","jest-circus":"^29.0.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^29.0.1","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"2b60febbc34a36401571feaabed39125434193ca","_id":"@kaname-png/revoltx@2.0.3-next.2b60feb.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-Alg9TFXPr0sYwUfnk7RzTQGWYmG9PtmEuKiS+x/gFU5OhcFopE/vF1105IIDaskGjjItn78ADZYTkmmhJTP74Q==","shasum":"2a3a0d7ea58971d1c1653054ff4720107f96482c","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.2b60feb.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5BkdStRwtyZloUXJZ6WFHojx4kryUN9eALmPFxilhygIhAIXibsmgttMH3kfXZfQo7e3pca5OycpA8rZTFysQNxRr"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjL73jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmopTQ/5ABNfnrys+rGDY8MZsDOMDI7nC9pF7VOafubtVcdK+AMthZH7\r\nU20jqX+04Ajzgvq4ah2ehEpIpwp7XZ4USi0aT74d5QvBn5UEjUQkd5rc37cC\r\n9Lq4XYzlFPad7wDXu4RPTi+ZDg60+OQzLyX3BH/olqpdpxrzNxp3cED+zDhK\r\nWNFTSGKtL6mkQ6fge/j6y/blOMSj6QCPCD1hJSfN76tnuoPHFLhfv1X+rbPC\r\nfBJmhS0uZp3iyiXB7izMDsO+s3YzaZQfNDgx6ZvzgIUhCTJ8Xwk0K/gDSKAu\r\n7tQ+WhD99dheVEfKqv/Ug3i/8iQOaqNhVQnE187c26FT9xpYCKcW3GCYqyfK\r\naLQOzcIeT7jdiIdSQSyNTVkzSIghTV+Q/orAuY+wS4GGsSihsFVnfU8r+SKs\r\nDDjOebcK7o8knxFwQ1WcAAltEQqnmqmc4dGjyH9BGVJBqsLQt48qaCWKzNVe\r\npHPzByc1id28Op4jQz5+3IcP50jjPFLnrgB7SnVY3J+Ez6RrWLh/+8I2SE9h\r\nB37iMqAnb/WFc5+ppRYyry6pPa//qibsz/lxXQ2AGLyyRK2WkJiyCR+FEolb\r\nuANTw5+oQ6LREmLJ3mDIhC9ddXKOxwqBTAxq1WFllYM5sZCC9eRW3GyuXXTH\r\nD2EWqKz2X/hHP60EE4c3lNx/Go88asMX5cY=\r\n=xU0C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.2b60feb.0_1664073187500_0.2105722803645531"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.ffd3c24.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.ffd3c24.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.0.3","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.37.0","@typescript-eslint/parser":"^5.37.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.23.1","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.0.3","jest-circus":"^29.0.3","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.17","standard-version":"^9.5.0","ts-jest":"^29.0.1","ts-node":"^10.9.1","typedoc":"^0.23.14","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ffd3c24668a9d8d4d4706dd0f2f07da302ab04af","_id":"@kaname-png/revoltx@2.0.3-next.ffd3c24.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-ENC/IMcEErAteE0IJWV7WNb0K+wy9f4AHzSigM/JuGsowSBuvQAevZ8oTJ0bRsHdC8MBz4sJ/C+JQ4bn8mv7/w==","shasum":"667d5821df533b011d91ed60ee1762e046c09d27","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.ffd3c24.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDnmiuDtOrrlcbcUOsU8zmimukFCeh+jI6YOyne+jdKgIgH/ZCbo89YTupxOQTq9NC6RphT9dfLDbWptKJ5igCiOk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjOROzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpbbg//a6Tp4NjgATX06ceOezKvFJ/V5rxTWpORxr3FBeGHjuPW9agl\r\njT0/BF1TOZq54WejDNqZy/lY/FUwhuZoAmdu8w8yQH+52Fc88zR8La9nJPur\r\n5CLFWgdtG6xCSVdIII6tWrdEX/ts9lYRj9K7StTi3WTxu5nDPVHoqTIQHI2q\r\nF3KgCCdNEuyTChSP0u1X/CwQ+a9oqtpJi0eTxPDdItZ7FgtRE9EZSipPUk0C\r\n0n6A2WlZ/e7Z6BO/Od/Sw4jZtvZ+mC6Mpm85rMTxSQwP739rprsdZLXugfVQ\r\nEF1ZEjAq3JPyFyN/nutWzOFxFNUx+vS3Qdb1mIR3iXbvFe54rkvkKbyHxyPh\r\nAr8/0hou0E7ddBBI4lP1PMA8RgvF5OGkM85bRlCSWXlNKQTqO86129H0OxaC\r\nAXhkwlTcjdUHJuhP+8b05p3wzsR8AmvgU4MDoR3YCIY2IJOLgwFSa2jBLhcW\r\ncfNwVLw4Lg/MZrjhhtsETOjfLk0u8dHn+zlF5yjpi2Ogq4p4JNuKgrVk+A8W\r\n9+DiaJmXIbzIvcoN6JLazqshCWeiyK5CaH/KSsvqKh6NN0DAVf43izHsEEfS\r\nnuxwhDc4bRE9fvNFD0Eno3FVyKMHDY9IlFz4PPecBVuglv3CG2krXQQ5OtZY\r\njZVtNjZwV8LJen5QJp0tUtJr0km6/H4lAL4=\r\n=Dzt0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.ffd3c24.0_1664684978877_0.273581527112982"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.e752b77.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.e752b77.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.0.2","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.4","@sapphire/result":"2.4.1","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.1","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.24.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"e752b770dbcdf1dddec5ab5612b041f228e826bc","_id":"@kaname-png/revoltx@2.0.3-next.e752b77.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-E2Y21slrJ9lwDjjoIB70654mqz9qy0e7Ve50rl61zeub97nlO1ukXK0a2MCLIVXRvsCZHMRFxiLkjgZllj5S+g==","shasum":"46b55def3be6dfbb2b96c125e48c9339d8ba9301","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.e752b77.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDAlP5+p7YZ21oVbRr1BIghGdULWTOTumvWcCPBj3p9oAiBRgsi8zrjmTKWQUXdLbLwnqnAL/bx2fBhKoEoH/jE0lw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjORekACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqaghAAiuz+b+Sz0O7b3bWyP2dNWLvpt/QirZdUC4e7PqQGNUyX2/30\r\nCpWi4z9S8Y9A0SbT3qtvBEZG/jyepClMvfM7AgXL4erISwlPmUQM8QepqW8h\r\nTIB6bQvndsW0Vc/frjSn8gpWmr2clxmPImXonhpivt08fl19t2dp+JOkaeAD\r\nRwxH3XKnoNnj3xLToHLhRQA3L52yjUslU189HYu2B8M8/if5BV23vP9Wq2sa\r\n7YBVH9uXF4u/GDnNP6YD1a5kV6ZDeUVrS3yF72KX34qVw1x/A/XqCX4OaO7k\r\nacl+032lmm5KyH+rSh0Eqhq603SURfaTFbv5plUEUDkb7N04Bn/MijyHAts1\r\nzLSVk6gzR0GhEWJnBc/rzd2Ldls/jNnDjSLkH5Mr7SOtrYqvq1QWeQit5d5M\r\nIvakVFkfq/tzYj14KceZcSEyija2QWlmLaEjoNPiA96gE7thalCXNgNqaNRx\r\nnfy/WgwXaS1v7LoRjxgUGxhS4Ky8IDCANqG98ZQq9H3MDC33bh75kjLqJ/sQ\r\n+/lYkchvNa4WVS9++5s7EP0pEJf0AARfkH083FrA39IT12xVGzpm7oLUw7AH\r\ngKdCQkczTZv6ehKhRcUrHVB7fbpYa3ejbbiXxNnIlK62274Jt6n/bZdAqHcq\r\nICFDj7/7v8TV482EtbA2x8wZYtqMCkVGstI=\r\n=Z8Gx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.e752b77.0_1664685987993_0.9462459706264386"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.36f25a8.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.36f25a8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.1.1","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.5.0","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.1","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.24.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"36f25a84dd0aef32b50c3df73123c5908dfaceee","_id":"@kaname-png/revoltx@2.0.3-next.36f25a8.0","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-TK8HKNOh8aSb26Izi+1Z8cBQKnstQvNmkoqVIYA307pKshVHJLzu+vxOmnqs8+jgcqTZh7x3LZ8Vl59DrLYfmw==","shasum":"c9b22fb151aeb90b478372b4b7510cb13cdd60ee","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.36f25a8.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhNMfPxZ0YP1PhL6OlJEJBYL059UR9b9Vqsj0IeGowTwIhALSiyky+SzMFN7gEfhbXBxY0L1SHYEt49N1AFq2u13r5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjOZZRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcRg//WuWXgKN5mj8r51d07Q6lQtjNleyaVtnu4QCo/VwyDpGb/DLZ\r\n6pPrcK8w2z1amUx0+b/eMfXltwRS6PiLrAxnxYYKdfpk7S8R9jKRWRq+TR5l\r\ncraf1OTf8lyzGin80IUegqasPkVTuQpAHdiXcKQhpsDwRXTtloJOq0M/+IoE\r\nzLTmNJ9/PRB84Nx5zSo3iA0X5/J/8v1KCWx8G+ORxoSskCA8J291g2FR64gA\r\nWL7aGihTuzOedDsFb8CJdFhsi8A1/DK2y8C2MiJ3NHczAE/IyDC6+OUuukQO\r\nb/5zOWbpLWhDrjg6wwt2XUjeekd9MXKQK9u1KWRGG+17gApHX9oOCYZimxD4\r\nBS4pyGEjd4aBFDz0uYGITB32MZmW5eX0KZ2vwWsPK0x9rPRPwwGct7J12BbX\r\nmCw/JyRPEtN2+PdlVKDWaDBiqAG2Pei1J070dUjgBhDEHpMDagq+oWW3kOVj\r\nafZ5OZYKlE7VoYRhAO1ZAtmPzMAQaKdgMOlc1XqJdbKSWGjbO06MKCWVoI8h\r\ndjub1KdjRClXrDrtuzZbmUXpX0XzEhOLo5Yc96OjsZRHfY/0jzXuvcsSiTsf\r\nwhm10nGdJZsJmiaYDR25kzKMQ3GspgNHDTfj1815LXrV+NcIi5Ael/cX1IKK\r\n/YNyZh9/P5s2RUpdnPHxzKW8OFM+LzwQe0c=\r\n=/7Ir\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.36f25a8.0_1664718417427_0.8728287104552426"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.ee48757.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.ee48757.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.1.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.1.1","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.5.0","@sapphire/utilities":"^3.9.3","chalk":"^5.0.1","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.1","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.38.1","@typescript-eslint/parser":"^5.38.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.24.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.3","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ee48757eaa7c559a6da85bc5da5ad628b8fc3c0d","_id":"@kaname-png/revoltx@2.0.3-next.ee48757.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-SDviCdKu10P8/xXq7kBGFd5taFHXLgVC23YxKHPrtXe3rPzv4E5F3CIfz2ZdTDpXC6GYT7gc/qR+6b88FLTg/A==","shasum":"bcdd2b0f05667ca027a6316039e6f327908e869d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.ee48757.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC+MoBtk/LIfaTs+JqTEOdR+aukti6E7BGnNhdi1SRDjAiAshp5eQsd2P9QrdJhYSM2KERPtxZMxNKoyoTDwAHiUxw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQkTDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjMA//ZBdYHSd+uKw/BYwtcNqFEYi2C+OQLC0ckaJJsxn8iVXXx5Tz\r\n4ke062OP/URglasWALKKWg6rQna8wfhwS9sZmhoOLGGMxI5NBzr4QrijykBl\r\n0SveKXN0CphqCFIclgmBagQ7iNXUaWu5REJfA3WODIGOTOmpMBZZUL+drcYt\r\nZnYbyFuLxVqxfopWCm/4I0Og2TtmsLK8QS+T4nPpD76BI78kM+SxcLQk6z4Z\r\nFkz08L6sTPWc2YRZzrCi5B4twyr1c/zalNIn/mgYpZZXAaqsBi95OV+OSfZZ\r\nahu3XdVTbl4iOHtw4WMurzpSR4Wph0/PpMOwgjDHH9eOb3kt/AvN7l+47bbV\r\n5+MQ3izUd97vtbci7NqaZK6t3Gn7T4qX9gwGUdsIyMGfc8vizbNQxhSP2oVe\r\nz1m4d/8V2XN+o1rJZ9mGi9JU1rwsZjvrJEOpIngx64rkF7E7g64eqB3s6B1a\r\n3lnhgFY0Za/KblU+bMElCA/FVDaruk+u+3AgyXollqe0TLRmlPnIgKH/Ms05\r\ncjkLmeQd22QHkoPQGY6HuJDgWKgBvsmpIVpw1Gec405Z4gZGseeXCgjW9mk+\r\nXeo1Xb2VEiEsUWZTQsX8awMqR0HCwoRKtylCTVPxUIiJvqCFPYf5+8x3/vej\r\nnMVz/KTAFMvB5fMXywas4sWWtatV67ewFdU=\r\n=YF0u\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.ee48757.0_1665287362827_0.8801011851416678"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.ebf2a1b.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.ebf2a1b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.1.1","@sapphire/pieces":"^3.5.1","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.5.0","@sapphire/utilities":"^3.9.3","chalk":"^5.1.0","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.39.0","@typescript-eslint/parser":"^5.39.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ebf2a1bf9cd7e983d611738f654d621894f5d831","_id":"@kaname-png/revoltx@2.0.3-next.ebf2a1b.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-1SulCGkMLZxZxY8mQ/qFQs1pYyvQqvbe/JOH+Yrqe8iGLXpAL+kV0uVEnpwSJ6zAdg0lMcDvKO8J77mlodX32g==","shasum":"784872a53c8de583afab58753dd40d59033206ff","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.ebf2a1b.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDL98Fl9LziILNndjdn4ZhUEG7N5Nmcnw6I8Qb6ONPb1wIga0v2BS9O4bTvbAQ98YUiEhQ2NDeBzKQvC9THO3HgaGE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQklZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsHg/+P5+SaVhjnOInw+GHfSGamzb1LGDNBuytLsQuHI4pTEct8Tzw\r\n47Josb/mk6nQYRJjBo3FGLcuoLEf1W/2A0OcFIMV9Aac5l0OE4f14ZVl9VOA\r\n537eC5Mo5O1gjVi+z4XQjVymmjrR1KGoGJ4Z5e6cEHsHUAr4lkmcaVpHvP+Y\r\nAiiaBmYGtiVxgB7KstorG3yG2WM8Pl4XY/9s8zQf1ZkLhMR7bT/SM2ziTCNr\r\nj+VcGwGlaH9afoszMQI2ZGOVn2JElWSICsOFph05fMe9mOJN4ZNGu7jemwIM\r\nHyRhyvf1vGC4g4s7naFJLOPqIsRmQqeGBN7qJewSVNkeI4kr7XHo3paFTJq4\r\nuc/AQwwlwI6gpnvoFzYsFD3PO9BjvOe6tu3vOKsz0cA/TUVfhlQJN5r3lVUK\r\njUdNK1/0Zr2YjRFoX9FRGYIdP0yrcPyfLUPASG7Mzv6lWZPCIsANfceIF7d0\r\n3Vgo79anQhChXfdt34Uhzdfvp8AyiDd4GaJKHbZ/6ZIQS7sr7ln22A15Kpzi\r\nsCAx8WJ8Lslfst8XZkd5GN934WrSi4semS2ecKyfW6CXM6bbX7EEB9HovAUL\r\n8kZyxJ6kyltknp432H3/FCyzFVNEnwvcFHjMZVEpuHpb5AzL+sTyrn9yqbPs\r\n36qT3zIhzHWphUg1JJ4VzdfoL07Ify7UzFQ=\r\n=Uz+z\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.ebf2a1b.0_1665288537357_0.7791422301788762"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.6027c7a.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.6027c7a.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.1.1","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.5.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.0","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.39.0","@typescript-eslint/parser":"^5.39.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"6027c7a3037517c28c220396ab0a3103f7312e06","_id":"@kaname-png/revoltx@2.0.3-next.6027c7a.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-RJlg2v7nssd7w4xeoZCG0j0KJe+1kmEuVT5KRZdBXemR8w22GJo2Ufdf2+AxZXtaH1jNPGLPgqufNDjrDa48sA==","shasum":"1c142e974e4358bbcab608106746af8a0172395a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.6027c7a.0.tgz","fileCount":172,"unpackedSize":263316,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCzDPQQjRx5WQwiMbbO16FGJR0GJDyIGvbtbtVkA3GSXAIhANLr0ssb+aX6E+xsYnlzx4zFUgt4/tUk88xjVm/g/oWi"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjQkoaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrd2Q//XzmZiKcVtfIP4s3z/1NKyGqPBExUEJOKrnmIkYEl8Tjz8jbp\r\nxFHWd23T8RH/F2AWi/+EHJdQ++ARBLc4ejlrB+mO/qMY5FESKZ5BPGAlg4nP\r\n4vJ+6dC7lyGY7syh6ypm2aKz0PBmW3Bdp6MnIvt9Ks5PkAIxvMPGXatUPOAG\r\nXX0yBCC4QMRz+bQtWEMkYpsuLya1tOxzya8cRPXzrTTLFFHjyu2x76t7Kocn\r\nadfCkl4P78pRn3Mw19T3vBrr6fBw8CP1ouFLpXOWivMOHKBTnMq3dV3bx7Wr\r\nsmqm6p++B0Z1H4VREmJ6v36aVTigi8Lx47Rylem5kjEMzbBrCiJBhYzn0Ru1\r\nTATpZVYQpu9te2EkaMOx0DhdOFcHinV3k+XMIVflLppuQyCL0fAekiEgrOV2\r\nY27Z9Kn03inB8rez7QDYO8ZbSQhnaPu+LQX+3RiVAtuO+uQokc/7qx891qf5\r\nAdgklXR/m5nbpyJR2axoDZ0fw0+5bSZfknU9LunPYKF6nKwjsox+UAVFYpY3\r\nJznnyXQl8PeTIMf9SrPqJxmU8uBufAVP0AkWjJIoRei8m+qe9zNbXPNQEAfy\r\nZWA5/A6vHinKtgh+4MAH+haFa7wPhjZ3s2R3d4TclXPvgtqkSBqZyQ+1NI0k\r\nwsDP8RejRmJDLKhZqYF3B1UthReIs6LAoTA=\r\n=fE71\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.6027c7a.0_1665288730477_0.5156192545633163"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.daf78be.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.daf78be.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^1.0.11","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.0","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.39.0","@typescript-eslint/parser":"^5.39.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"daf78be71dbc726749de4035069c5c9a02d9232c","_id":"@kaname-png/revoltx@2.0.3-next.daf78be.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-Wc0bB4c4pnU9lpn9EfxwXcnQTrcUKzzBvNcJ5yH/QeDNYPeV/3kvi3gX3szGCFNYqByyzPE2ADgLa3O14XeOKw==","shasum":"bcb61c3ebf7467c87a24677d82166658034a6b61","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.daf78be.0.tgz","fileCount":172,"unpackedSize":263316,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzxwLC4BLYi0cLsrzmmzjMNjSoUz0ECseMGoc1Q+euJQIhANY5gsy3QVwk4Y+kQG3N6hgJ9ISbFV5NxsfbGq51vKc7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjS/tZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGXRAAmsTUjMZ1vGk0qsIEWlc6cCA9bsZrPYHBEnd6ijIrhuFqyGG+\r\nxkOhRZ3G6rp9Z/K93nS3B6gMoLzToESGbaOZNrlOyjKE2t4DZDnN6mAbQu0s\r\n4+SLGOuEkCkWl0xky+j0Fq/SNjI7GNbDK2bu45snC2PAH0G0To+MEOYo7hdq\r\nBSVnXM0hyWEj2iPMuM672+On/jP4cBdUFgadMoRz40t3ld9JTPlcCrHHhmI+\r\nt+tAC+3bvGS3DdQrT1+aPPVDFdR+ktHFzNUO07i+gZ2H8/hstVd0FNwKKxCK\r\nlO5Ra4cuEsx75zKovHmMsJuUYupLOYGJwUxwpmrR8GhsM1GuOGtJVthsBFsC\r\nWyPX+8zfjENPKq14JU7R5tTYrNEsT2h8Sxz89qcZg4/P1K/PQBuh3Trqu2HV\r\n3MrW4ZY24SCoeRwhVMcN+OC1dCvpKX/gAKL2OMeFvZde+Iv6w/i/x/O2ryba\r\nNU3oWB/Kj3ZqV7No5uJaMB4eUCF6dX6N8hNMdn1P0rv2oH8ImLQ7+SfH4Pjc\r\nOanpoUbWs1uD3m6KBv5/wrJyoQhA0Rn9lXAzcJhpgcO+CFqZMn+uzEr1SEtC\r\nwZCV6/ylk95+ZBG/YTbU2dhs60JrVjj130G8kdC9g4tVxY5CoxpuJXSRLKIP\r\nKmGAgV8BH1Qtx2nYRkoItG+yQ0yBfZKSWac=\r\n=kb45\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.daf78be.0_1665923929447_0.19892524890108576"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.d3a3aa1.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.d3a3aa1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.0","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.39.0","@typescript-eslint/parser":"^5.39.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.1.2","jest-circus":"^29.1.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.15","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d3a3aa128c097c5566256d98f85e76bc3ecd9a10","_id":"@kaname-png/revoltx@2.0.3-next.d3a3aa1.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-nek5M1ie9G6QIrTUPvxAAsCjKxyEeKpUjGZzd9z0O5Btdl1EtHmfbkDZZJwwbDrdIZyZXfvuVHA9N51fHyqB4w==","shasum":"cbd24bb7efa144acd33b1ca2289abf2bd9692b4b","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.d3a3aa1.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBst5IFjQmmB/BFyLEIquT5+fvhJqgRgmOzkOeS8PtcAiEA0YZvzOWn8B5GRrHbx+s8bamv+dh/Gu9kLKPkpWMPnBw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTDyJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtZxAAoDw+sV8inSss5732XjHP83juhXT0Eq29QgVr+NDfzfLTZ39w\r\nNy5ObxFyVlGOlrXFkPClm7qTw3zGrgJRRE1L5Qdv2NUqdjRUXazbPdw77ZaH\r\nFN3LXaYKk0wlmPA9gVK8M2d+pNt7LoYg7F6w/166avIEH2EjEgPRAjbOvbJe\r\na1EsAg3HwfOqwqkm8W/oFxkufRxGoqiKJoZ2iUr5BclggqVsRm+KQ7jJSUDZ\r\nKLHufMvUEjH6YVexh6CjEFvpxYo+7oGNggtAW8eBZFyq4heVdL7kUSoXN9Ox\r\nCw+eCmdwa8X7iAQvptFp016vJcD53f5p0bhI3pEHDbLqGmCMBQcRxGI5aozX\r\nEafeXH9Um7E4wReTMn67UDctIU9HEnPnhTd2ViyMGjNqBU7+QGHVEYkNTQnp\r\nkH5XNHHMzMvcohuGiyUa0y1GLYku4msnVcabfH5mCItLByi6riERgb76Udyf\r\nJvpOHT8IxsdlNNyTZ2u9DoSq8f9E9xwa5q1M8jmysPVJgv0PGktjEuGzDdCZ\r\n7776X9XBMDfMU+MgfYzDr4irYy1jVFqnWa+KUx7NGzRo9srax1oHa0j0Z1Zi\r\nl9TSHAjKrue6RF02/2wJiq+A++pEfLdRjoGLYIEAXzSshxhwiycPLROmGrO8\r\n/haUh7kFh8oZDuSbkLpKDBaM+rVvz3MXw0M=\r\n=d6BS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.d3a3aa1.0_1665940617636_0.5353405971802632"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.d86a004.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.d86a004.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.0","@typescript-eslint/parser":"^5.40.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.0","jest-circus":"^29.2.0","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.16","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d86a004ee8df5e0e448f4a1a9f4141b856ca8e2c","_id":"@kaname-png/revoltx@2.0.3-next.d86a004.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-t+ymkyE1i8h9Kb1Vi/XApN7w2ULOL3oFPaveZrgjNHlpku68uVQ+tIvjfI7wKhHTAo8kxPOz5Tlq+eabDWJZoA==","shasum":"a642ab22deb1144429d3f2af9b96bf2f10d90f3e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.d86a004.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD7AeYICZcIv7mj71iH4C5yG7mtMJw/oIyKFIYJ6Ys40wIgQ3JT6H8h1XCOIIPHrFUUnks2agR6s4a/RZu9FBmB2K4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTDzmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmphWQ//Si02nwiQ2AWdA1FOonSoibgsotmMQGWrY1T2X1CQ4663Kzpa\r\na4cTFKFtpeZvZVEzgOHa70DKEykOIstoxydMNHyiMQvsi9eTtiCJFAL7zhVP\r\nTvjDOcYLAxeMg7Pju3mMLdeBnqQd4UDqK6tMOFfcggiXPvW2mdEGEGOovL0W\r\nR4urVw1UJpv9j37w5E2QlbO1TnowCBSlNgp/YWJeGjxVf+pmdhmvBzs+vndU\r\ncp4hki5sEg1qQ80/zM0OyqqL70JzlM4wC2FYgLNWTobXy0GFdCk5C7JQEjEb\r\n1b1vdBN+0vWNVPnoIQOzD2R/L/W4mTf1HRg3ltB+O9cS+PSmZUPCthHNNKb+\r\nHgYf1qu3GwDAbUeIDn6367kyUa45uvyDKz+7xMe6jP72c8QzDW4iGBBulOYw\r\nd5zpbA8ZE+nIc+Pwe4/eFYX8L0djk9w4N1T6h9ze0QL2zEU3ytYcd8LXYf35\r\npF5DypvMb0w1oz8/c+p3OUUp9oC+zazdAqgLtlCRJ9GKx9Am2LYpujWHTw3/\r\nMEJOW8MfVkIpuPRSNRmLSKsViW6Yz1yTTY+CIpF/TVRp9qrbxu9HIg4UPGoi\r\nmTaCBm5QfukFu/iJNe+FLJiHEXFB+zfCzW/e/jinpGAKNfeVWMlPpiH4r9BO\r\nzdefuSevDXOsk2z1Zhtaqm+3hRfAHZp6AZo=\r\n=2h3W\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.d86a004.0_1665940710196_0.055251405715410984"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.a3e2117.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.a3e2117.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.0","@typescript-eslint/parser":"^5.40.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.0","jest-circus":"^29.2.0","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.16","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"a3e2117e50719e6e07c3d3ce95dda82d80022716","_id":"@kaname-png/revoltx@2.0.3-next.a3e2117.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-C6UQnyO9fM/yQwFeL8zck8abr8Qb0Kl3YWCigHm6z8W7qAkVy1MPyU7oVeVx+xemYHDCEw1WVXC52KPTZdpUYg==","shasum":"c77a411bfed8e7caae7b0f2417d1b478d542f3b8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.a3e2117.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQsUOsWH7uDGkSTAog+Tz5/K4Kxv3uqBLp5LokUDxhQwIhAImE9CUVPmbsRREMVJoC8UDYXjaI1Fm0uzO9ZPKu+/jh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTD0MACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq1Ww/8CWcGGpXU0IzhdBCt1bzwS1sSXvNx4IHS/4pNQL9cQUP7T7rX\r\nffhpmUvuVILmUsAONwYKRvZCvKAkvhKOU1uZlru2VLhv9CICzG3U2g9OubAu\r\nQ+QCKijhgshuIY8+d2E9IIvNT+za/H/aQSnXOZHmp/z7mcgd6Vh5utbj+CMg\r\nibEqBeG7IUUXh0bP+dX/salrpn474vyCe7TCzfROYstJEosbFd5DcZyv8FQk\r\nj6B+Adw5BJRgK/guJ28EizABY4mIN7JuWoEj5Gx1IGlKr7GHxflU8moitZlR\r\ntyvtNrvUGGkUB5whyL3MuRmJmsJvBXl9Jy/v6LFkxn2O7gttxj3UgugfZWpq\r\nMitTUxaZNElJoyTlLuCukXwidlieSzM31OxV6Ya8tyEs401cri8TS3lRmb+Q\r\nc6nAMjP2ljlUTaBnYPc1JWnj16w6dB2lHnYeYiyhZDVSpIX4QBWchCzQYcLj\r\n79CNDiIfd1RW8WiaedD5js+oaK1mp6zmt98jgZhvm8R492Q14/XFwHQ6kYty\r\nYdUyL1/+jFPLBy0BXxHaYLbrb1n7zedSPkhPFzREJSgAerD66NQITNQOzlv6\r\n5RleNQDQ7C374voDaFR1Z2AfRMtg87kJugEqtz5VnI2x+VB+fYoWKP+yM3+Y\r\nzDDQan3aD/+G53TT4DFIZEB0UXHITVdZ2c4=\r\n=ADKQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.a3e2117.0_1665940748591_0.11162930751798683"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.f715a01.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.f715a01.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.0","@typescript-eslint/parser":"^5.40.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.0","jest-circus":"^29.2.0","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.16","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"f715a011949dea2881c081f006ecb8866c7c4346","_id":"@kaname-png/revoltx@2.0.3-next.f715a01.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-QHj9KC9U7+C0/pdaOhHerQsotDjC60d+zOZTsWNP8AyupuQEm+CPxitA7DEIGHpH1FASHbnaI2JVi5uXiHjh9A==","shasum":"2a994d0fab2a23504d81330aca7f9f300342772b","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.f715a01.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAY/7zrv94O4qtUpx+gV9WBGN9OdnUfh28Ymkxu3PuGXAiA7tXSZpjmz8/d3NzkCEDn82aMDmRihv2wottgM0nOspw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVPjxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoInQ//fEEpsoED+NPABTd9fwH6SruTC7hYmmaGAKMT/65Lqd0DLegz\r\nw1tAWgtAX7Au5uEfufv9SWCpmKj8R4FAFx9pWtjrRUyoOjNnk6Yf3+rDtoui\r\nCvq6PhU+niCTXHo59dMKcQyXLy1ntaJNH8uJbV6QWop1F+i9XNqRZr78QAEa\r\nkZHY2XSjL7YvMh8q+UPI7iSyui58l9aKntPBo/5S4sBeJKdZ8F9kY96uPMq+\r\nNXMyS5VoxsPvey2HUun4S8FXqOB/t4wIr0QHXcXM6RJtuLm3t64d5uXAYRBH\r\nUBmF2827kxGua17wM1VqnCB9oK2WgFt8kp+i1qf28LaEDf/E7no2r1EUT2Xo\r\nUo7Df/rRVyY2sYJRCTowcS4RjNlI61oxxCKxhD7T221518em04Oa2EfnYhMl\r\nGaQ9t+uX71DrNsOAgm6JStPbV7LjdIy/bGfvjWGk6qKDrkzM2W8ysEQOWYGv\r\n8zKHQC+jiRU8i1TsAHWXTzaADIt3LAXoS6A8cqN9xjK5mh/ka+rfnZCp77MT\r\npEbZXGPAt0mrGq740ZsE9dthsnotezpIemjP7wIZ2hj1vaUNDHt/VZYQvcyU\r\nWl9MsR1NZO1HiTeRVWTtzB/XuE/kQ2mwNn5EwQgYR8NjjhziQLVPExuYgGpX\r\n7BtQFHwmXh7w91gvEbKhIal1fPrhkZKHVJ0=\r\n=g4tY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.f715a01.0_1666513137356_0.38616675364821007"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.5d0ef91.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.5d0ef91.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.1.2","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.0","@typescript-eslint/parser":"^5.40.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.25.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.0","jest-circus":"^29.2.0","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.16","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5d0ef916e47360332635f2888c4ddc948c4ed677","_id":"@kaname-png/revoltx@2.0.3-next.5d0ef91.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-UzVxMYG1rpwUBh0xkYV9VZp0cLfGsKgwAYaX8ZMXFrSlQZBDpDIJLTXbDw33WxZAbEhZuQ7WYLjbpGM6We71SQ==","shasum":"aa45d46c2149cf54a69414e3d4671fc04d3f3fe6","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.5d0ef91.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHco35CgFIw/d+m9eU+jtKQsXaP4i8Kwm2S/jaKMXUcVAiB+zQSRrvzQnqR/aM4APcaHOLGY4wuZ9uOWNdoGATC+oA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVPkTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoFvA/+OI010wpoxNJbjV9expQoAyVJGKnJ4U7v60R/2A2sbfdCZg+9\r\niP1oHMxfq02eK14km2CzwMXp+tTU1229Dj0MjoXV8qo16YU30fxkfXTXyPel\r\nuihjT+AhnrooyZdcmDqvtkeImQVpc03wPvwUY/qB7trOH5Egw3puc3nsN+VG\r\nQW94zT3ng1YZmr6E/kK0gtfRYpcUqFjCxmF7mQwQ/75b5NmpPyOXqILH+nNP\r\nldHaUvrgfHoFngi7abzeiQ8DTU6bP16HbR20u5CwahOVfPfheSe1Nv9gMuW8\r\nGbK1A8Pgdurw7xHCZ+DFEoAvZ/GiOiP0PS5PptGbjmHDdlH+YaRMZkCXFRzz\r\npQim7BtFYvLjctKJ0jz8W5+FiaGAQiIeiQMy16s7znhKxxJTLjRyI3zeWPUH\r\nySlsW+RRLYkJXzOgmF1rRA9eTznTJBRuULqTJhLF8+wjC69jUBSbvX8GRNwI\r\nQ2LubhxcwFtY8olpI0SUJvVbm9u28TRllojK8rnczKjyb1pTgUhu0Mdpp75t\r\naah10j54Ge2fHrItFqa1uyAs5L6zpDhoOpro5IVjVwYyW5FeHTD7G+GHinJZ\r\n+7qY5E356N3B1hQsJr2jr4q9Y1YQn7mi9ChehhbkLovQKB098SPguNsS5i5L\r\nQWBmWlHzAgOVPy0O0qKZvEoagYScmm6gxzE=\r\n=FpTV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.5d0ef91.0_1666513171125_0.6955207835639394"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.3769f1d.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.3769f1d.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.1","@typescript-eslint/parser":"^5.40.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.26.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.1","jest-circus":"^29.2.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.17","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"3769f1dd6226ee30570c21b0fe614f4532e85e58","_id":"@kaname-png/revoltx@2.0.3-next.3769f1d.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-pMIgGX27kKQjeiwTu1JGxjOcIf/XK/tOK4XMtoDOOxwFetwYbmKV8nKfmRcMCmKVxhagwfwB0ju4G18whEqqrw==","shasum":"c51d5c2b8b2ee414ffae8c12eac789c77e913f8e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.3769f1d.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmAkHIdeZNnv3xcGSuxIBr/8crY2dYSyfE62nIuPOQSwIgWObMgHvcTQSY2ZkN7xogAzVoI8ymvQVwg2rCK7qKIpE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVPmeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohmBAAha3kmMx13LgqFh1mTcnbQ6Z+BJI46Gt15hctPpnzMIWuZTtt\r\nuOZyLjVrCYClGtwYYlvH3Qp7wJv59TPdtUui1bTWRMFnCo8sLuoVPjUPK+sz\r\nli99fR9R5zNcqaqJAU6WBjq7vgoc3Gv0rgBQQdJXappgKhPV/nK06QMB37Y5\r\nD0uWZuNDb0C8l1eLwKa5o4/a+DoNTX+6qHFstjFqnk07DJUnZS8O1mCdy8tb\r\n+jmXZV6ziFOeGXkfuzjOrGHGKC2MhMYhgLj/e/0hOvZu9oOY9t1aIIAkaOVx\r\nbKKUo8iEPMWrNSObcD7cPJVOcI3Y5LUNQ8ONIP6YWxqd58NFdRiZTuTKzpn7\r\ntmUhPW3Ezvy9TeWwnWX6PtSrawNSliyXIQiSAcc7npGsMZa2JdvaI8+umMbF\r\nfzvsgHA0BAf46tPWob9HtbPryNvW/8aJWuAcRiULplvjlZ8vnXmtSCouIFAQ\r\nBmBYezLscQ161ck1jJu86AG5q0A1yQv/e98LWxo86nrbRKBsgT+Kl1xtfRSI\r\nzhyW5IQUIkH1HA+qiMLDoppGRw90FwLT/pQ1KbaII0fMO7ynie4UXepBTAli\r\nVUv9/ic3Co+enZD9hznqyifbxG/UXhjmAOzMjrDHlBxMdVg8o69vrKDu9yDT\r\nzpb2C+lmjz7+q1gOXjVoW/eGdoGua3CAwqE=\r\n=jmds\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.3769f1d.0_1666513310136_0.42796122407008785"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.9bf8a6f.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.9bf8a6f.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.0","@types/node":"^18.7.14","@typescript-eslint/eslint-plugin":"^5.40.1","@typescript-eslint/parser":"^5.40.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.26.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.1","jest-circus":"^29.2.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.17","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"9bf8a6f242ae314869e6db97eec08474a4713699","_id":"@kaname-png/revoltx@2.0.3-next.9bf8a6f.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-GXAdqFjMNj9bOMMqNFRmfeyyJT8MN8ZfUjDlZLen2mCGVwYN9rIUR21FeSCzL4icOkVmZgIKO6DaASHs0K/oeg==","shasum":"e4728ccf1569fb0f2368ddc4a6f4e3269efd8665","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.9bf8a6f.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFUaAaY+o+QtFMVto2HL7yiuJVzUyqx4NjvbENNK9I79AiB8je5NKlU6JDzdzV3FmKQ9ybjwS53tmSYgzjjhIPkdaA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVPsXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmofvg/7Brx9Ilve4JNWSPLu+e5138DP6d2Pz/j835zaBobCd1X37Y7y\r\n/vS4XHMt7bP866Vntnw+DvKWTHt2F5PBTbc5HqXEXcjrRE9p8wWuD8PdqgrZ\r\nmlAiXzeq+RefliK/z0zJUu8A92mfp4AECppWBm7DIiEEpLqNimb9oTT6offi\r\nTJSIy67na5PIuTcqH1PDbnfFB2jz+X/bwwR2k4fqliJgXkMwjlIBoJDFqJA0\r\nV+oSVk6aQ6wzY31RjJ23CZiSGMTZQueRKygSVAH4LrNu1qEbthoPc5ObR+17\r\nhpar8EcFGGEJTwQ66Vja9YmYrMIt5dQsgyEk5B5qFuVC6j2SChs6yoo7PdtH\r\nKBzFv75u/Oike3qjKXl3bbYozp2Tl7wUzUZTdIq6JU2a5UQK5Gb9f239j8gF\r\npvKSuUFxM0k/aHD4H1UhhR1glpbXmr8Ppey6EQew2BI9xTX0FGhWmOOlZOZa\r\nrko1aQdMxWj+Cl2r3IwEmddRXA2dK2clSck6MCUgRnqhcCUi7M2z/21FUD8o\r\nV8O2F+izfPmTBqHoTUYK3IhjmnP/SCi2zUrjh8sRXIErx1r/Et7/MB2k+mmH\r\n1Urp6K3MWYBG7i0GkxkyEebH9/egLvBxYHKLonDv9N28+NusbYzNr2o0Jqrc\r\nOI320zS9QT/7Io/9pbWrYheMNYf/RMu7g0U=\r\n=JVYE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.9bf8a6f.0_1666513686771_0.9017323435484861"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.2bc20ca.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.2bc20ca.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.5.2","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.0","@types/node":"^18.11.7","@typescript-eslint/eslint-plugin":"^5.41.0","@typescript-eslint/parser":"^5.41.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.26.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.2","jest-circus":"^29.2.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.19","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"2bc20ca94e64fd8b3132fce4deabcf6f903dc7bd","_id":"@kaname-png/revoltx@2.0.3-next.2bc20ca.0","_nodeVersion":"16.17.1","_npmVersion":"8.15.0","dist":{"integrity":"sha512-ZaYacWSWmSYdXybPxNVmCoKqihZuTREtW7CjxpYVIKlhZxRnyCG+gwouUwnnMJERpCrefJ2F0m2TScQJNnH9+Q==","shasum":"8fede83bfbbb1eb3698cc309a7a946c419cf7fd4","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.2bc20ca.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHVWcmHpAA9Dv5i5RB6YaY1UYZsnoOXVqV3G4I8byAiSAiEAiPQRgGVXGhsbtgOph21e+wJyYvdWIsgSl1m3bKGTJ+Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjXdlUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqSwA//ZBk2BRd4hfMbHSjdBipTgpCJIbST2hwrn2ZDCnrggNSWkQuP\r\nATy0fzO/O47Eau2LnJr5BHVpjVNXDkMdHiGE5LkfYsyPpjDEwuzyW3nvB7fx\r\nY64omCFT44596dBXavZlhudtLVqTmk+rWgbKJIPjURXzM6EHBcGVvbHEJzot\r\nuDDrKGavRRSNZbBbaAVbkctF7dDaO2GFAWgnncCPDPsp8tNnGHYABHHDISo2\r\nP8/OTecSDrdGU4UDZdd0KLDtChTBqfaHBRnLkRd6Zq+G6Z52gVPeszBkVJJN\r\n5Fjsh1pTfn4wTn4tInLtWaVaImgVQysORYTKVC6gofg/iUoogExxYoBxO8cp\r\nJLPOJDWuqW+1oSTNwrOUqc16VeztUwuINa6G6GzJu8hpr9MZrmtHED9rHXt4\r\ny3g/nf0SRAAKr2/9+VKEv48M+hRQKiTjOnuPxHhTtK2q6ZVO1vjzbF5lUO3s\r\ntPPYblTQo3Vysa1QrZAeSt44wG/6iULuLhkWy7taKoduilAusVmPaLHVXKFy\r\nAwDg5lX7//ITcyy+9hfQYA+dROqzEFeNDmwhdBW3FgID4IwtJSigyBpzhl2c\r\nY8zKzgnYq95CiUU+CMYlfcZy3fMOceibdqg64tTvZhxd/mQXQ11V9slqqwAg\r\nhpq7vlzY7G2oxfNevgt0LRuyIZXVBgWrXAw=\r\n=7btU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.2bc20ca.0_1667094868352_0.7264788829248494"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.74e927c.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.74e927c.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.0","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.1.2","@commitlint/config-conventional":"^17.1.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.0","@types/node":"^18.11.7","@typescript-eslint/eslint-plugin":"^5.41.0","@typescript-eslint/parser":"^5.41.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.26.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.2","jest-circus":"^29.2.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.19","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"74e927c3fba02f7968dee98a3d59b605734e1a9a","_id":"@kaname-png/revoltx@2.0.3-next.74e927c.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-lN8ELG+wzYXu+Zm9FVZLOpmIuZzpS1Ms00uo+9gLSkFNIXTsjW5wh1wwXcmqTIfqJhQJOBP+//hpHoAdF1f+Cw==","shasum":"6276d93d7d44aaab3fc99f1b7296f5a278920ab5","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.74e927c.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9cw2pV6YFff74h5sDPjIVP0uE4YTC3EhipaZBcsP4ygIge48HFyaJR3n3kRvrfbvYvQLU4Po59jNYJOmjZj6WiDM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZx2CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrtew//f+GH0d7X/CqyurkwbmjlBS0SggQ04A+BT1k/IX7WDEDmCzFF\r\n6+ICUDXOWX/FyiZ7e3zJKhWR0MwBiVcRPbwBIOGlpHX5Cn24sgyBRP9j7WN4\r\nV4TNnGBrPRAbTpTkOVdnfat9Kqzg7ID602jAiW2N2AyYS4LiejuJ3TPq4Scz\r\nevebze52XRJxR1mytFphb6dCwd2nl62DsPSQv53F1OtYFsuz3V3a8N4BMQxu\r\n7kUby/M2NFUqGhkx61zRSt4q+VAsc6K1efRfKvnrY7ZJXAaFjug5QmHrykLx\r\n52Ghp2gkCwgw2e9U6+76iw+LC5p37PH6/R3ACjxd11z1oqA2yqAAYRwrTs3/\r\nS9tBua2PjZPrWjDvEBdhuxRcO6mq/alM51U9M+We3GOi6DdwtXGO7cR78pOV\r\n/aLdSryCVsJxbaLvDJGlFrj3Q5X28wWRS2aJbirPkqt1032E8vUqNAqzsmVZ\r\nX7bH71yPcOGBLQ+QVsOZ3IiZNWwnP3jRPplPJE0gukqnuzk+j2uq2PzvygWz\r\nIHNdFpGWf86Eqw8TWtrEZ9C3olCDrQjeM6W10B4W2I1de8TygOVJhcIACMgM\r\nZYvlQML2Uzx1zdRiP9CG6N49Vhh5ZAIdd1mNCSjC0z4cf7rh0sNUyWQV1ryr\r\ncmYvhfDfExGwd38MfD5v9DhpS9EP5vQqXC4=\r\n=wXfF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.74e927c.0_1667702146084_0.18641949852938033"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.8f8659e.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.8f8659e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.2.0","@commitlint/config-conventional":"^17.2.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.2","@types/node":"^18.11.9","@typescript-eslint/eslint-plugin":"^5.42.0","@typescript-eslint/parser":"^5.42.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.26.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.2","jest-circus":"^29.2.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.20","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8f8659ee65870e3e47d25795f01746b7a2053374","_id":"@kaname-png/revoltx@2.0.3-next.8f8659e.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-2yM+/l8JhzaZRgfITMlNWEg/qc4VixScu3IV9qy22bhZnALygthIix3RFsBZO545YlUe7pVqhxU8w5vH1ov68w==","shasum":"ed0c2eb183fc05a560209a5ce8cc842e48a1436d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.8f8659e.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDq0AMfzW/2fENI2Rw7j9WgIZZfmVGHhOrgYapxT3fApwIgNO2xOdG0jrFynMffJUeI9tSP6Eb8mVQ6JV23+QdZqxA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZ2JRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqebQ//Ul3/Z0mTa/Drk1/jCmYO9hTFxX5Cq1V7CTz2xUqd5vO/FT9t\r\nSJBJIbXUQZ3NXoKzxau/fqXkVegSJAjHrrRTR2AYd/h0ijsSDXJmPSPP4oeZ\r\nEXXFXKgsnPbibafMpKmYRvp5ne/bllPVqCg1XpbXerR5tgB/O6M/8bgUAmjx\r\n+BzTSJSmx9FmLDGKw10rMiXnpKuexHLCabhCF2F53cKaNebeSlQCH0N4Vwu5\r\n8WhG8AC2AgIRAXXa4XBFvSTEsUPV76QdaIGDEDvdQXzkSj9RJUZ8SPYhlQyg\r\nqz2qC5cfURjlWcvQ+JGrfUOBW3R+QPJJXr3m/n7DgPJA66x4UAHRTzc9p35q\r\n21mCE5PBpyn0Vic0C+GpLATi+ObkA0UtEc3AZxhDQix1BW68Wk/vc5XfP6Cm\r\nrm+QX/ntEALSweiTZ1J/pwGCTCq10qmAmGXfaCSIKIqQI4GZqmfy+Odh3CDP\r\nhNiorobPX4OZUgQrkVEVOMqz7clq2oAmtqmiOW3NpuUIHs1ZNd/rk1hf1k+8\r\nFESfUf7JB3rbhiPCe9kd7b9iZRcZvZlnUFhMXFug+G87P4nPxhcPC68zVcI0\r\nQCjkngFdmaJmEsr7s2/eJPH9RqWw7xXYx+8LBgA3YVmNsn4jwDwyZHe+ZYCj\r\nRE/1f5/oRo1vlylxN4U3NaAQ7rkB/S1Ri50=\r\n=VEGM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.8f8659e.0_1667719761606_0.07189243270197299"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.c8789f5.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.c8789f5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.2.0","@commitlint/config-conventional":"^17.2.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.2","@types/node":"^18.11.9","@typescript-eslint/eslint-plugin":"^5.42.0","@typescript-eslint/parser":"^5.42.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.27.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.1","jest":"^29.2.2","jest-circus":"^29.2.2","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.20","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c8789f5f312d5cf2e5030901df8397035267ebe6","_id":"@kaname-png/revoltx@2.0.3-next.c8789f5.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-vVV5Z6FBv61cBA0zHx1k7y4Ti3NDcy5IRcuxaargbcRP/2QE5/uX3FKj3bG3NfQgtsPX4WnPUOWzPI+di91Xmw==","shasum":"c85c316caca53e72f4cf82d7370a02c9454391ed","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.c8789f5.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGZBhGqvW2NdPQ1sChtAEsgiBdJw48hhFH8jttO5n2e3AiAZ8XkcdZkJaIyGQqHLIqSYGlA9paDujEX71AvR/ENXJg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZ2OKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpxKw//Xq7lHkJQnJ/2Imd/ANKo29GM+hva/vH3okPYQj5f55T1vxvB\r\nXdZ+r+1Vf1G7I3NFxt4EVTJuij7DTQRiVl6OownDxctu79Aa9j5yUdAeN3S+\r\nuUbOos3szWWsrv51Hcu26aX+FInt0ru4kWhCz/s05Xz44CUb4cUQdHj2und/\r\ngxujFabBOSnn1j5sPagq+41xWC8E3ODtBn7TAuWg1//ahGH3fET7lEFF49jK\r\nekjyvM79o9xkuZ+V3we6JPYC4+znBmMpQnEZq2jN86IBb0qI6Vb+wlNWhyVp\r\nkQW6FcyW9Lq/+OEew8uMsvrei56j4QF8Fx232rGxNXNCJWSqq+9mQLUO0n3N\r\nlEaqBS/efNDbNPJoi17BajFkYHCtrWWAbEW5bxZkxtekeIbOkC8Z+xeYs73w\r\nVTmreX87pMtZsSYxwur2Sl+2WiXV+uOR/VlIbgD6A5uR0Avehv3osx+qdxZ6\r\n1gyY16QuJgjXSpRM6UAIaiU8v6/7qHS/m7I0wbtYs/2q6kr1fvnH8NcUiBYo\r\nSrOxk2dQ0Htc07305k57wS8AFxM5K1ZGNq9QVZLEX2thI+Ng0y0LfV/u9NHV\r\n7aVyRWxEnyIScVGCvjNK/I2+wJX1wm32rB5LtZW1/ARHKCW7D0F6vr2B3YJb\r\n0g95+u4ytpbMkH6QQudzaQDGPfcFI08D8Os=\r\n=nNOQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.c8789f5.0_1667720074292_0.29050186993690863"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.ddcb609.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.ddcb609.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.2.0","@commitlint/config-conventional":"^17.2.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.2","@types/node":"^18.11.9","@typescript-eslint/eslint-plugin":"^5.42.1","@typescript-eslint/parser":"^5.42.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.27.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.18","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.20","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.8.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.2.4","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"ddcb60952dca4fde2f5e4c055a3b45044b9889c9","_id":"@kaname-png/revoltx@2.0.3-next.ddcb609.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-dlwBIccNZNE49vqXYOL7svht+JLBae5j5oPLUyQsr7rayU8MiV6Wu+VMKxabFntKc498h6MAvGCRfMLyrkv+zA==","shasum":"6ec7e22eda611bd3f311e1dc973bf023a0ddad4a","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.ddcb609.0.tgz","fileCount":172,"unpackedSize":263315,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSJVIUuH16HTiRPoyrL+vZWSCYpDz0z1FP7Wtytz6jAwIhAMoTA6qssj5qKh3U8yojAqWQn/mIXNPHgpZYXSG1C2Kr"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcGuFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsEQ/7BqUTEFbTh3jvOwvoDAADItO97Sg9g5jLbC4GXMWF3+yPUJUN\r\nsPVqFQvlpRf9f46Vxrbu4MbPI2TwM0Z0mQ3vVejEQEvgN1He1gl/EViQ4WIS\r\naHPpGRCOp81kX5wMNQX5sVCqINy3BIw4+gKJBNIK8RYwxdub7ZpWFQarECSK\r\nhg/UhRRqZ+WJm1YYIBSwXQ6PaCeZXeGQYolDu+useeqY4X6OJD9kdLZ0KpBj\r\nQ9Ty1skfr68vQHnff0RYonsB3SlSp6CgClRgdxu2d1UfAhjDGV8saQnqI+TU\r\niXY/Ztyi9VfQ6wqeKRYJxMbR178cUQH8sMQCaeKLzY/DiXs4vE/O90qhxvCT\r\nhdhsXyMK9IziamS16I5A4vwpSUQrBspImMDh7kMqcWWfZ1D8CVdydUJDdREN\r\neECGIWZXmYAy+NdyOts0gsfyeS1XnQar2RmLDp3ZZqJzgr7j3DaBrJiFkGkh\r\nOkNzaji3+z4XrOZLCfHAaChPzgNo3KBiaSKXSu7Cd+yELsEBNysBBs3dTffs\r\nEYGUHN2wRXa4xT1KhpkAhWRrDd0bC6EqbJVfH4ncRvfqd3Th42b87pjkwu7o\r\nMy6OUUDrdUpeVO3roBvEfpAaq+BtC6pzNjFvo78YbGrabs1uSufSC3TeGDBJ\r\n0iN2CC5s95outcOFDGIbXIQTD6HjFrF3KAo=\r\n=KoyR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.ddcb609.0_1668311941191_0.7059291357487265"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3-next.9c99497.0":{"name":"@kaname-png/revoltx","version":"2.0.3-next.9c99497.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.2.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^3.3.4"},"devDependencies":{"@commitlint/cli":"^17.2.0","@commitlint/config-conventional":"^17.2.0","@favware/npm-deprecate":"^1.0.5","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.3","@types/node":"^18.11.9","@typescript-eslint/eslint-plugin":"^5.43.0","@typescript-eslint/parser":"^5.43.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.28.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.0.3","prettier":"^2.7.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.21","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.9.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"9c99497b6c11bec498aa8ba7f46e55aaf56ce5a7","_id":"@kaname-png/revoltx@2.0.3-next.9c99497.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9rGtynE58hCK/Ep6wYDlmmphalnRgP3kHKQo2AjbY38EgYw+LGpZuuoXc8AQ4ZYEuJpWSVrrmvExRkZf/slO2g==","shasum":"d87ab4165c79b4a8d8ee89d352c3f61513918b8f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3-next.9c99497.0.tgz","fileCount":172,"unpackedSize":263139,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGIOEauDavu7quMY8krTPo6dU4d3iIvwG37CNRje7hSLAiEAtyRM/Vs4SQxY7Od0S+x59ueqAY4KSJuH/iYwKl9C3ko="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjeaTGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr9Ug//f3iMS8hiRHAvSs8O3vmcQpdR3rSpGrMpQjVozxUJb9zIx1ZO\r\n82Vxl6SEuVGRa6H8PQhyp1prn08XS0Yvww8UKB9JuI0iEad+BvaDPfWtvwsM\r\nK5p0lHCP7Y4kFrn+OSNc46uET1C0/ukpni1ZYaJ5n8nhHe+j+BjdfLWibKbe\r\n7JmPy5xGeM0bN+DQMpjJPy2k3u+mRtUQhlqs3Wrkc9dFXmyQ+xLNo8MIaK0O\r\naqzAeuBrJz1Q7mbB0u6HQt2U7D5rAWGRmMm+fl2ppImbJKFQvbHC75va+Q9u\r\ngYp2MGny1T1JO1MR0O6kvYktkQA8cln6wsUuHQbuSv+Joj6jMItjSUP0zK7K\r\nd0WEgWlu0KpOMvHn0HkmzYbSPsWlsah9dbfkr63T650858F85338+NMWeUe5\r\nZjXmMi92gp7qxPV6ZnShUdyMv/mTGmchjYxzuVD25naBqjjqjSzUI9hDYIUu\r\n5IVvl/MDwI5msDjN859yqNo6VdR4oug5L4t3lABkjffrEO8b6j+rMq8imPf1\r\nF/X6b2wAr3SAIfyb4Dd+F42uUAJm7ut8TjOpfJWPKJwg3y6IeUDj6Itrfy9s\r\nmg0CMmUEI0ECxk8CXzCnDiTvNWGk6CiQMCfmJUmUa9RylIb655VF0L6ZmiTZ\r\nZIw5rnWEnbMBviOLNvYhpTq7TLC1cbzQjyw=\r\n=5UG6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3-next.9c99497.0_1668916422091_0.3546360054235551"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.3":{"name":"@kaname-png/revoltx","version":"2.0.3","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.4.4"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.3","@types/node":"^18.11.10","@typescript-eslint/eslint-plugin":"^5.45.0","@typescript-eslint/parser":"^5.45.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.29.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.0.4","prettier":"^2.8.0","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.21","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.9.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.0","gitHead":"2ef220bd821c8aca29c9a6e8eba0bd2ae0466093","_id":"@kaname-png/revoltx@2.0.3","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-CRXQAg0SoAgXj2jGa8qwv/SCIpNN6+lMs7htmTf20aRszwlvDnpSyFCxvJ8DPlGcQWZ9+05DfMRyhUpFWeVFVw==","shasum":"e3c5f0b6b1b4adc5ef33863800f68cb994f61a9e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.3.tgz","fileCount":172,"unpackedSize":263052,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDyS9ileOQcw8v2fPiinlVhwfI0u7nEOj689Cv5KfvGEAiEA4fsrBbVi+dY3uF3aKvZTPdMz2DIDXZiEJoRUWUEiqmc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjjBmqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoraA//RF2HEJ2M5AD4ozL89TBRRN40yGrkWxOOSGQZOXTYs3KNZnZW\r\nzsGAiPjfzE74RdBs0XCVfIyiq6uBUtNsStC1KmCY18s1tNWUbBoZyJR+ACHh\r\nmuCWyShiI/SmZrnffmfJB3V8ecCm5znZHQDyBWIUMWBAkcpLNe9f4wdgjjzT\r\n7sSCbmzQa/xLLsQ0SD0atrpdr7RicV8dxhHqzl32XLHIM5qzWr+OLYHl7RKM\r\nVrJZ29v8heZ7uuJvPt4VzwCik8nTQZCyj1BZAR+++olnXt7Dwcqm3qYMIKMJ\r\nih94aeZ2S5fqasqQdJi8Ry2Bvkn6phQiW8zxDZDUBK+m07cek+0BvR91wnVt\r\nKqqc6YMy9OEZIing0wzhMaQrvdLDVbQf9NVhjW9/IAhN7qVlsMM+c4XOPgpK\r\nvmHh86Mod5aCytmLhhKELFwOVMpaWR7XHmFwTvVO+gIRMH8ze/XvU/bN0A1A\r\nhLNt1rrCtbanjRy7l+c1hzq5I9KsF1RtvwJgawiyWgrL49dxVfLUr2Ga/F9r\r\nqi1BeaG2QlrFSu4A9FQahszB5bI7GJcArwiYgBxYnZ4H5jn86OUtAk41pXfG\r\nVJgHgGkCwVlwz0kjGCmUD13uOww8tGgH0WzzyFvezttVV6p1O7hEKYEAzpX6\r\nxJ9y63bk88cdWgXx46+L35AHAz9yWJEX5Ew=\r\n=Szl3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.3_1670125994268_0.3089928930181347"},"_hasShrinkwrap":false},"2.0.4-next.2ef220b.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.2ef220b.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.1.2","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.4.4"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.3","@types/node":"^18.11.10","@typescript-eslint/eslint-plugin":"^5.45.0","@typescript-eslint/parser":"^5.45.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.29.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.0.4","prettier":"^2.8.0","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.21","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.9.3"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"2ef220bd821c8aca29c9a6e8eba0bd2ae0466093","_id":"@kaname-png/revoltx@2.0.4-next.2ef220b.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-bVCqBX/EUG5MTpDH6Box59f5HdIXiFYsJ1phhSe7D35OwBplNdIStdoRcG0DLoHd3HqHErca7qsQRkmyuP0sCA==","shasum":"47206277c532b6f49ba7c06a37b2239dbd5c3be8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.2ef220b.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPcDMw/OHncK0xK6/GhIgSVa10wDSm/El2pFmaK1zgVAIhAO3DYk1TUmw+Uqi+C7GR/tHbaPMkrZN3YU0ByhjXAaF/"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjjBpWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpdNA//S8DrS5rAvqfa6JPXCC6TaZs79F4vQ0X07CzH0u64G/R7UZZ1\r\nuwZce60Ijrf+XDSb6TzZG4qAfbA4Pe3ucAY34rYS9qzDEFrL7qlmHo6TQLug\r\noQFkAkpnW6pIgMMucZx8Ivdi1ErebAkOsXMkQTb9cBf16Ed4Uv2CkbhO6rx1\r\n2u39qZ09NeP2Phii9ELa77TTKebnC8ZUjDFIESYG5mr4UOe5nOr0UJm0deHh\r\nTe1Hi3E/LVsRIiuzZTAimq62NlQ3RjUQ0+on732En3AcMIa2o4ewb8kVqEts\r\nJKjCrjeuw+x4253gDQhGTvWGqGHYuuXoII0vd2G/JlgMu02HWlOhiRjZWAwB\r\nOnzZQjqt6Oxoh2qkWaiE4jKkNABPjlQC8Xuj68n1fPpjFEM9y2oIrFekTRO3\r\ndBUHTg2SMdNmDPWoCxNOg+Z0YkFutnW+B+daqxwY204OkO5xpykAMKlhTVW1\r\nZ+wfl08fNp8QSkvK5CxwhzPYyQXfF7PwDkmGw+NtyP7qrV2JBAVKJ4Qp8j+K\r\n2EGJJCU7+2lfd7OXG9Zvi9tAQJkYYBzpztTnq44ZM2kMybW8ckDlvYKf5OH0\r\nwmQYYGetkO8bHwK7ffIlFJSpgYKNP2oKsyLNZfqGD/A3mk7VsT5yCVWtNe/8\r\nLVnnhpTXw8HfhBp1toioXNzSiodPe1uuo6U=\r\n=druS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.2ef220b.0_1670126166473_0.5243920126507258"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.920c8a8.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.920c8a8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.4.4"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.4","@types/node":"^18.11.13","@typescript-eslint/eslint-plugin":"^5.46.0","@typescript-eslint/parser":"^5.46.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.29.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.21","typedoc-plugin-mdn-links":"^2.0.0","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"920c8a8c4afe495cf37d6d23fd91ae6e2eb61a6d","_id":"@kaname-png/revoltx@2.0.4-next.920c8a8.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-hUybtc+de30gGka82SmF+ehzG6G/1lrP2CA/Zi5/eUx0CENW9/8Uc6qGAqP8EPCTL1r/M0nk1cjjO0bsReU6aA==","shasum":"e6a8c5d56ed90025567182075985a2cf33b69d5e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.920c8a8.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYgPm2q5ZNGbJ98skaXo4PcMDtfjI3aJjFg22cnyorVQIhAMBjp4uerZuMnPp/PCrCKHFVYyM3wTU5da0UR75PMN/r"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjlUvBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo5nA/9EF7LO52fsj+T/QuvUUzgv/ry6Rlk8u9vT2LL3tQRrn4+cJB0\r\nKWJyxnxRlrzU0GSgRcFafYVSW630VV3VjelqIlLbTbbr0RgJJ1zOtJ6RdFQI\r\n4w4RhDE4aJE8tD9edniAbUwKKVMPWIvPGjl0WcgBmY9QXtv4Mj1dV/s5YnLE\r\n6JR8fD01/ifC3NY8h5vsml7Q9LcjGI7MhcaIvbL7LkPYNQqZGaUjqvVHIAK2\r\nFCKa9c4NzZ0h1ve9i9+VpmUb0dL0raYaBVzEwIhJUPosZfEYmaAdag5HldjT\r\nLwzuTZ9Q2hQzIGQiehFM7UVo4XW3UfiWsPgEsaDXcEQ1OREkrSi9QGY0ZN3U\r\n8+T6uVXfKZi0zhOrQ9DVau9jSZSnIwFMNlyNdRN8//yLLF3cgmFKaVm49SdW\r\nkffjVT4qFNv2wH4Cc5RA0//K5BxTR78L+Tyu+mii7d4qisRiYETvOhx9bDjQ\r\nOgeNvJTY3k5EQ+Lgs01Or29p74VvTSdWPUK7xyLKGUKK1gtrYN5CjwFNzKNz\r\nIH3gKP9kiG2jAhs2I241V9+9xnk+rWMqgqqLhszrhuKenaHYEmeAdk0vQDvI\r\niG38h0gH40lAWV419e0gMh/NaP2GX6TctDVO+R2ooBQLZHP0GBSs8DOdEg6Y\r\nUCVod00FYMdChoP+s9k0AG27RLkIEmtTD+g=\r\n=zLLN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.920c8a8.0_1670728640337_0.7612354277324438"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.8a96ac8.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.8a96ac8.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.4.5"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.46.1","@typescript-eslint/parser":"^5.46.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.30.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.23","typedoc-plugin-mdn-links":"^2.0.1","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8a96ac838038421914e634bb2aec9bf93ba1204a","_id":"@kaname-png/revoltx@2.0.4-next.8a96ac8.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-o5TOhG+sOK+gnmzY5lqDlLUNnzF2XrtTi3jgqwjO0X1E7LuWhFGdI51/s11DOTahjTHzyfrr13AfiNj2QeWHCA==","shasum":"8e435223cc4d8bfa81026cdec396e9dd5db39779","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.8a96ac8.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRQ4d4G2eT/YCI5KPW9V+YuhHpW4YaKUeJARZqRvdYDwIhAOb6uogz0CLTeiKwi1La7ga7N9pP1yGT3+DCiZxvKcAn"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoHPJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqawQ/+M3ldIvcHyEAq7MJDt/kjFQvu6dG95CVPt51I+veJ4Meievwm\r\n+VWWJtF1sYk4+D93ZwACLy1P3zWRwq0f4XINlC7hs1hAJM5U6qnuDNVO1h/U\r\nGbxC74Ni1w4uis4dkLP3953tQAt5NhT1w07lrSi7X/oAzmBuCBcXdNOdxDMM\r\n6JWNXRdNljMuz83CbxEq4gy7BAnDcTSM40u3R+EzGL6Bw1sF6N14Jsk84Rk0\r\n4lnWBz9UQjmlL7rNdU/MpcbKH2PQK03hOgluxf73zJNyXCTNcggh+5HEWLwQ\r\nSv9oEnAf8IkRHdcULnisxOr1p40CY5Of8jcAPA+o27uYgvk5+cE+fjDoGdq1\r\nicWZR0wXxoWY9Q32Xz47CDsgBTe/EoZ0WeI5cGWDn9YLpuXsXpU8xwB+PDd5\r\niWawRCjqClSJ/JBLhgs0Vlu+udGHeKALA1ytpxhV+fJWKzSNinR02zC+Y8W1\r\nm+edvojDcmqbuhnclAQZubbdRo4Ox44xv6/Atymlbo8jFmWaPv3mlq4zXUt8\r\nZ+yn5jojxkHCsiphK2pPBD2I2vGM6QFv+ziiD/jQJYTruAiq63O5iW9JoQsE\r\nmtEcByMOqPA/LHguiXmHqzSt9o0dsmK7ELRokByJ2fhsb/tbwbeLpMh+ZJcW\r\nTv5uDUjz9DpsukB38DcEkumPLqTExU16zL8=\r\n=4I7R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.8a96ac8.0_1671459785612_0.2496685346002976"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.7efbbf7.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.7efbbf7.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.0"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.30.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.23","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"7efbbf73c5de08a4ecd67143031052f562483cb4","_id":"@kaname-png/revoltx@2.0.4-next.7efbbf7.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-1MWUun5WsBY2gDw5jmezx1CUUAsT5T64jRdWkvW2df6m4MrZ3YQQo8/l5x78Yb61wdzSSwssTd4OGLlRRHfIqQ==","shasum":"6008af1fe1f3fdb871f3e2a3094f924d5834608d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.7efbbf7.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDnAbL2+Vvih70Q4ijgShWbfoz7o35pTW90GjF387clGAiEA5t5VbTXh3M8+tjCplwncDERUUDu5HZGzbRGargmqTF8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjp82/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8Mw/+MjiKXNlk30KxIL/Q3+y6VXyimWUHbJcyIeXt04eaVTBDEcwO\r\nz/KaqRBH48U/fT9M7tGAcD0o2xK/LKBogGXz5HBcPk97CWz8JwdH1DH3Pamp\r\noIL3ST5tl9eTb9kAeC2yCO733fwvdHh93tj/m0ngyHkBw+oOQskfj4JbuThE\r\nmcXHy63GhrSQvgIK021zx5IkYLttlRdyeRhG4VRR23dZCSk4GRMf9eyiRt1p\r\nvb/ZidAXjIgJaWJdgFJ7mnpN0M+0fsL7+15MzSjOCrSpTswxKIRFrqh3FrCO\r\nOMPoeC3WyRxlb7OFk2HyuKgmHC+G//3CXfLRAUvQFZvWngpe9pdHMkXP5qDg\r\neCLBU41BnGt6u8J+NVCZioo23Y2ESPKBRp8PZ7K2rodKY81IpITiG2aUbJ7z\r\n25kkDExSUN2VQl6MomMI5mxrYd4mlKa6Pvuyl5R4HlGGtL8Hh4v5DmtMbiOz\r\ng2n97ZVaOh0hC6Fbo14t7POqMZotspxep4q3uTcS20Ekrtd1SNNpAQdXe823\r\nKiHTconweWUKn2RZHJoUMOWDIF82W8+vQKSv3C0zCzgu6F+TkLx7A+I/Q1VU\r\nGfX5oGZSAnmzMiKaBJMvtIMG1yMKhaQpJGMVUID/aEszYgL4lp4SVWhaeXCq\r\ns7f+AKjB3mWzrCyDnbMfRyBvs9oz0gCpMcY=\r\n=9M/C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.7efbbf7.0_1671941567623_0.9946629202479689"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.d6cfdf5.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.d6cfdf5.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.5","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.47.1","@typescript-eslint/parser":"^5.47.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.2","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.1","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.23","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d6cfdf54cd5019c050effabf39a361f9e14f3f6e","_id":"@kaname-png/revoltx@2.0.4-next.d6cfdf5.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ZxkrhZ/7Vi037SvRToIjuDgjVwSjHjll3xPo6uDDkdljwhRrK9tQ+1MsI21oqEHPNnlnEu3s3dxD5H1xPE9B5w==","shasum":"a91e2811bf751cb30a3e3cbd46c1832a79d4a307","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.d6cfdf5.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCACkpEvHu3btS3HNGTHb6sTHJhFYgJcSmCcTqvvC3a9AIhAN+wvka/6iB2yxChsVCWDDRv0kRMo9BEX4qPho1lPZD8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjsQ2CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQ7xAAj9L6gL+rUPoj+xzfZwwG3GPPGb3YWDwQvguDM2o0ENA9AcFj\r\ngtzL8b/pRJARMmdv+pOPiZ0jQtVdDBTEUWUEQYEsCEyl2v0wZoeeuEfYX5gG\r\n9fJrDpTGtNMokisN2DCmPsMLjPn6wQqY0L3DmZfLEfPEK+O64X4VZq+uV00g\r\nGELhYr/0n8Tb6f7TuBsjItdrQ3ssQgC90GcLosiDwDocSWyrkLM1nx+cIW/y\r\n4O3VfxDbY/RwRgp6QSu0vf8AIfpknUC+nZgOyKvcH308r9z7IFZPQU5zVPb4\r\n4VcVkRdNymlhAwSQrqYVNppw/RB1uWRUWAuIoRTXB039SUuAm4sBKoeZz+DD\r\nP1MO4dwyAYYFiK1mqY9FESQhm3UrSVxYOUHlQKBQaeNx4s2t173JZYe6BpT3\r\nK5pP7qwXnjuh3IiUJPet4+fNXFHm9i13Ddf4QaF1nQt3Qha9hqpijbEw3F3i\r\n8dCvdUOQfFT+lpss2qBgX0yZ7RsuAWvZBUZ9418PetYQpfkyrP153/f8yypm\r\nRbCpLetbYYYo76fjxutromoAYSwokTJ97EK/F+x897iHqBhmvjxqOXqbLpDA\r\n0tydcPix7IbzNk7ntn7lFkeLKG4Wg9LUb0dt6ZSARvTNVuL7OHxyCfZh97G2\r\n8lG2eTB1ALLk4rDOrePihVr7353E+KaWdEA=\r\n=IL1Z\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.d6cfdf5.0_1672547714622_0.8927939461146919"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.4550ef1.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.4550ef1.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.0","@commitlint/config-conventional":"^17.4.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.5","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.2","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.3","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"4550ef1f0e400d4f7759f82eec5aee6505d762c8","_id":"@kaname-png/revoltx@2.0.4-next.4550ef1.0","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-YXzwsyeSAiUJFs3kXgvpurElo19NYvyt0AbzasAMJQ9ayoNqqRny5EwzmCtJ0uDV9+nrl2dRNwPE/F0WDdccNA==","shasum":"3a2d76a99a307b13fc36c001b70e1230292c433e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.4550ef1.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDsS+5R6TOzFwLD5ar0LosWeaMx1cQOLolN7I2cD2i1dQIhALLvJaeH7dTB/sGM3qjtQXbd66oKmIRbPub2NNMS9A6w"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjulilACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrCLA/+JV9HIrit5XO41mzJERHrbrJqB1NALZJ3raZqTo5ktXbJm0Dt\r\n1hdtyPIlno/DPsP+BRYJiKsv8Do077gCLpc29j2eGN7lQ2Wml8SMXJ6hHm+R\r\n0ZCas0k5h2U+nyd6wmo0ejAITseJoA9F0j/InyzjNZRWIe6dbfBkDVVgXgQp\r\n6zEaw70w+jqWsJ/VAT2URRjwpAIWFdwSfnN15saSNGR9wYHOPMK45/exZubu\r\nb7JdnLTeJyB8uetZkk0zIAw7whIT587gtEBqigWNYgXqgVN5fI3imxzfL1Pe\r\nXrpmwub2iF/vKHTRmn2IonHCexMtbocR1u2xJT5QTI9mJM2ue3pNqHm1mWlJ\r\nNDpntf/nx/eCX4vdY+EDY/ksjVJYA6Lc/mgNZWIuohPRoVC9R7uVfW1z35DY\r\n4gPFlOe1TWbiDg6c6wc7my5p9aUeR7YbSU5ezFXyzpeKomI78Lv0Y/FTrL/B\r\nyrN/1++4pOMdfRHCoMnEDoT3fbuWpA4thlsPQItXVgzyT0RHStoMT5Us6JTy\r\nULfJmkHsIZ7lEusmoeDYXUn+M85Gz13loknlZGWh+UcV3LHPyn51URsWP3Xb\r\nGfcA893yY1lwRV6HwG3E8TIf4thN7UlojhyEzND69ULxXQ8lOy129L9OfwA5\r\nhivmeyM1MuEhsP3/Ou2nJuQjVWrakKJn+CQ=\r\n=Xi7K\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.4550ef1.0_1673156773618_0.8204920562234443"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.42d429d.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.42d429d.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.4","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.5","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.48.1","@typescript-eslint/parser":"^5.48.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"42d429d8ce2352dcc2cdcd74b398fd01192ecbc5","_id":"@kaname-png/revoltx@2.0.4-next.42d429d.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-rygt/QNZnfctn5NcG3gGwULs3V+xQ5tMLh7u259C0QUOKVH69IqMO8A4X4CBjCYeaAcZmhHsL3GLW1am2/BQog==","shasum":"537c8649dcfb4484c01658e975f7245f82228ed3","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.42d429d.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAxQ00zJloQdF3KbamtdUtpWBwDatZEMb0x6iQWR1M3KAiEA2bhoAPEdc8Wr/Yq1Uef0adrkFk9ZFtC57SNZeWwClPo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjw3pxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnEw//Q4X171ufr28imfjIB9tw9GMxNJII85q8M/dvA8LYkg7De+I+\r\n3vPh7YRlZkW2LYhR0OwmNO0EQ+yg3Nj6coQwlY0vhfUkBLZKOwAADrKjZdYs\r\nadOYKN++ASSCp4hTF5lNGkldsMAOI90+uWYJd3L8HpO+qqkZ6m2uY2O5lCIS\r\n9TBJ+AqjK/nqN9nAXBnciHEbOJp9QLD5MHEkJG8LQF9mzpkOpgLY3Joktk7L\r\nvdaK5z2poWjfH6vjdNxAuVORetb1omQZGlQccFr1GCB2iTgARl42kaQopfPD\r\nqlGy1WWDtfPI9MaJu71Ave/nkRB81bTt3cIVdd3WGGmPZ51qf2CDy6EL1SYd\r\nvMqtU5+LzAB1rwoGWFbZxs5OWAjIwXvprNMjtZHtixbDoV6A+EIkA3tEugy7\r\nN6cqinBc1LMmBTjRLCGWkwTMM7hjU6BeUaLZM8v/fcytu9CkWbS3pU1C1XOY\r\nJ9utzAkf52RNaK2qKrO885nAn05o9DWQD/6NXhX6k1F4hAGUjtd2dX2iQ/Hu\r\nhuFr0vqn8njo+n76OVrs35s8hvq4VeBtfu5yIzmhEbyzn9nrlGoAaPNESWrH\r\nmTFERZEJUIQZkjltu/KQvc2A7c8rHbwaMbbH2t73qirEbTVE3KUG7OktVz4q\r\nhyQ+vLro5THMNdGANh0h08q+BDchtR4AnSc=\r\n=LzJ2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.42d429d.0_1673755249179_0.024806891812881204"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.656cb77.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.656cb77.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.5","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.48.1","@typescript-eslint/parser":"^5.48.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"656cb7732efb8b3a080ee5233248f58f8c87a784","_id":"@kaname-png/revoltx@2.0.4-next.656cb77.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-C5LD0QpS5imk0oIrMehzpvyw8LZ4I9YHoM/y4XeEERgXujsZMLWHrwuUBS4Lx6aOkxIawfJNxo6ZGCj7esiphg==","shasum":"5e3e027085b874c7527bb93c3c4fb05a025c11c7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.656cb77.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGL7Funw4nzX0yHPgR20ykZ9futtVcSU6Oy8ymrwKL+hAiEA2pIfTAR0ZKmUg/BqeKKj8WHs29/9Mx1/ar6NfwHBez0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjw51JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4XA/+IUePi8WSeaM/Mqj3KWscj2gXrCrMdYHaHGXgQ2HuKGA8wsF5\r\nuok+29cwgb3/WZVicQLTpkiqeMOumgumFwt6SluksUK41AQklWce038my5zL\r\nxtt8pN9SYm15InSEziFL5YRw9TcNcF7SPWbgMTEMvMt8WyvWeU3rmDVuHUpL\r\nnjKukpq9fKsDL8RTQ+H+pSVdchDidLX9CwPy25ppO4Rtpd6NlngSxrZ5acCw\r\n9Y6JbIuCSY+Yax4fSG6JGz4BFUjR0IGiTzxqtByj+3ideC8GCWINjragHhjM\r\nO/yzG/5VSyQmVlz1B4bWvbIcG0XySfRVPRky7eA89krYWDLyLVW2BB3G7F+t\r\nijNEI6WgycDwnKutDqZL0EX/qkn8hYNzHuVDLTbtVgA9HyRIPlmBLsl6gQjJ\r\nsnQgc0z4ZDT2V+cX+gxWkb6AddMtyh8wvsv2Qpb+FqdcfebrKFxETKMfWfy6\r\nsruQWx+etX77Nqz/YRDD5SmD7FzatL6re0AUUaBdbimuyw6OjhLutwKbX5YO\r\nV+KbmEiz4jTEx4gwmC9gBonj+fZSzukMYq6BUvSUIctYnsk07+dvIR6pR3HP\r\n/39Q2MQvgbIPE1Vq7YjOg05GLgP4sw11q4HLyhsJcMjnf7LlrlmV4lCNO1Rj\r\nk8409Qsg/gAnnoO9fXGev4jckhjTqOexVcc=\r\n=uVgU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.656cb77.0_1673764169024_0.8618826906113883"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.0c09a3c.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.0c09a3c.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.5","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.48.1","@typescript-eslint/parser":"^5.48.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.32.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0c09a3cb59f98681435dd52431026df44500c797","_id":"@kaname-png/revoltx@2.0.4-next.0c09a3c.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-93D5pqjY9i6//fXpo1YZ1tRFVqSqPVXN4YUORblk4SrOkr4ZVkKHETeyLXzbb1VXKYjPHzuSuoMyIBwwL6SxQw==","shasum":"2be0e6f919dfa10bd0fc2d2047bbb1cbbb28cd3b","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.0c09a3c.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE49pP72J+Go3SbLZeFRnLa/3mkr/EpjPeiy3IcuicFZAiEAsmJ8m5oxb5nsU4DwyuLHVcWJk/b2NUQ/qEfMeO0w4Xk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjw896ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIdxAAmN8yYqiXu5Pl0ml8DGcTAuJzyZns50GqiRdUa1+9cjORJQTf\r\na6pSF0hBRyccP8J2+wnzVapYjFl1wSqGv21A0j7aP5TohbsD2XeCgZRQa/eN\r\nsKdc4Tc1DDuQ10m9LeH7w1G3v3P5UW3SgksEKcv+Ped2WKKMDW1IjC0k3yQL\r\nI1HcURY0Qzad+dz1MnoHuuhgRWyHH1asfGO8fIqrZQEQY8PL05IwaLixVXR8\r\nlgzvF8kO2ghnCmJGTu3k8lzDcPuH92B9a5fK5OCV3ooRZTawI+VX6D8G7rxu\r\nXz9/RWsy6TEVWCLJzlMDc32utqVAu2tEilC81W9z0msqD1KGsFGvLR2DFa07\r\nEZ5EwAAOfkSpBkSiOB3XLhikRbuKqGnNYmKj2yEacvBPIFAeZnEE9FJikK0X\r\nD//ZM4LlyTJCaB4zXg0WpkSErhW7nuFjpT/Ia/vRzvesXM5IW4bnv+3t/7GL\r\n9WTEXDUV37Odbpi+bzem49PvaOSydPHUZaDMeDj/1yGwSDP7vUWK9GfPdASU\r\n8rMCjY60qwzf+lqGjSNav8U/CtBObV5fOjvEWwE27R416nuQz+ZwDkSpiMNP\r\ndvFD6xN8pSbArRnw8MnWGJVTT7hzEsQt2gCO2rnSMwqjXGC/PjOgbuurtdBE\r\nL81Co1iRlpDm4WbIOOJzlOoej8XPTSRGLNE=\r\n=bOaq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"inmortaldragonxspace@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.0c09a3c.0_1673777018146_0.6620065664270687"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.8574bc3.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.8574bc3.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.4.1","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.2.6","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.48.2","@typescript-eslint/parser":"^5.48.2","cz-conventional-changelog":"^3.3.0","eslint":"^8.32.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.3.1","jest-circus":"^29.3.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8574bc396720d2090b199a5e749e7e173d972a23","_id":"@kaname-png/revoltx@2.0.4-next.8574bc3.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-BFp+YyioR/sgGIyUyzWNUqs3Ij9SLqCyW6J+sBqFSI19Exh9v6jsLZqcAvth9/gJjp1EpoKpELK0GIEftRgaKw==","shasum":"ae2fe7486db760829ac41b6a363415a57b9521e1","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.8574bc3.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdBRiRLr0S6o4jRSldy2rerjInk5uWWLiSagbHgBYRoAIhAJH/8iLMqIWfr6AyZsX8/4qjLVW8sNu7knlUpmcMr8I3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzKp+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoPdw//cy2I0ci0vj2IH0FNZCKJEQE+ujweA+mUM0jP5Adl8PyVDD6V\r\n06hTX9s7Kc5kp6vEaulIfWgHAwiTg7QQDAYOxNikeTIJVYBLQ8k8288juNUF\r\nBu5usDBweS+j5fRK96sbgFLuCvW0CUss7FXkrqN5SegjsPcIhVfdoqcShlQs\r\nWsfPcvgiqtlHz4t6BBTEIiyI+BIItj41zD8EhhDcqh5Ckd53N9nYpkq/Sokv\r\nPNPFkQw+oxxvjyhO74UOo6V7LHuLgEzmWlFNKYglqipgwk5mSz8off1actil\r\nnMQ739iXge4ONBUFfDV1AAM/ogmcPj4ZscW7WXQL4/mlxJrv54DLqXOz+qOu\r\np2zR2CM83EjBbrQ0NdGwkGSsiAS9Rqs4iOLyYlBSMxpk9fnueKm9rk+3RwmY\r\nblWrkjzKNy7J+7nmeBpN7yyOx7c0nhNbgRhPhjMKTFDd1w/ozj/184fE0Kcv\r\nVlGJtJm2KTf6qT9NuHL6hIEWJRipTQXBuxweGzrORwfZW+8R4mBDfPg1nce1\r\nt1Y3r3YxxwQh3p0UAb4xTOiQjOjss0OkaFO8px56bzvFnChh3dtSZUYH82hD\r\nJ38cl8jaMBlFq4OWaOR5R9U7G2KSp7iXvmfqJMn2l5inU2r7iC9YABkKnfHj\r\nEfeW8Ok30/asptmbNg3WihONkZsgxbAd8vs=\r\n=rerw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.8574bc3.0_1674357373886_0.24302631776292394"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.498e9bd.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.498e9bd.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.11.18","@typescript-eslint/eslint-plugin":"^5.49.0","@typescript-eslint/parser":"^5.49.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.33.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.1","jest-circus":"^29.4.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.19","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.4"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.3.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"498e9bd1af3c2b901cc240ec9b59b3f3f90e5ed3","_id":"@kaname-png/revoltx@2.0.4-next.498e9bd.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-F6SrMrl2okJ+VFwq0BsJR5enrVXzjAb90xXEOqswUsJrmd4aVRcvjuRgHuD5W9n+rSKltIy9N7pYnQniEvl2WQ==","shasum":"660cd998572acbb4bf282af641b929e7184db03f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.498e9bd.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCHxnCmwJ6tU/IhhCx8RIeeQevgNn8+bnzmTWDX+g8zMkCIQCsLr/UwwALcG7vTgWz+zuiDzpZO5R9L0fsL8qKDHoB0Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj1exQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo+Eg/+KVA/161/czCzEJv+LQtyHgTWjRTNw1TuI09Qh0RJb8ZHrZ9S\r\nhxFKkybG0NlVx6arQVCQNkMkzKn23hrc89JdUx7B58JJR/ghLreDeC3Aqv0z\r\ngNeryYVjOFPltHn95A9ZbAc181we/O+aqaGmw3v8ABVEWHxuo1UpxrPBXZHT\r\nnHtMXAc65vNpJeJIvw3u1DZdGV4HxWq/SCJVAkS/v6X8Z8E60XUZyZp5mgdQ\r\n/YpuGxua6m6aXitPcWXvlOxuOIAfbkq2zn6a7PvCTEesYjsWEoXgPCISNT1E\r\nYOLaKQG2YsXY3qXfsgnOp0XR2TbxJk2z0WqsMDSPTgIMwKweT3iazlo60JZj\r\njbGFUtjMDybOd6JfwvL0WJlffQ/xpJbTSHRMbmhDmfEk/77HtMC/yhILtyBJ\r\nc+0puClSUtqdmaD98CF+oNWRAESZAOOuw9PLQCEZHMJzqFn3WNNuehXQGYAZ\r\n+78ZewHWrRAYXVDlqACA9sQrANSXK+WlaqmE6Je3NvLayVeg6Hu2UlpasQhs\r\nBxx7bsUtwoAqX2TxjBfWXF1r1WYWYeqNP2yJwtZEE+fiFatqYbU4XQr4oSZ9\r\nS+373eJ/E82+EARBtvUx/drpVS6v24iN9BOoGWoFTQlL1sHfow+O+VriXlGw\r\nuVmnsutcz+Lh2jOya8Jq+S+NphR/01Cludc=\r\n=7ecP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.498e9bd.0_1674964048446_0.5275165768573973"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.d6ef559.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.d6ef559.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.1"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.11.19","@typescript-eslint/eslint-plugin":"^5.50.0","@typescript-eslint/parser":"^5.50.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.33.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.1","jest-circus":"^29.4.1","lint-staged":"^13.1.0","prettier":"^2.8.3","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.24","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"d6ef559a82face6fc1d7f158810d8617b1b3440e","_id":"@kaname-png/revoltx@2.0.4-next.d6ef559.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-OVLcUk625j7YRS5aMTqKpkFU0bePOzU1+tr8I3fYd/pGsQsQCnq2mAS3M3JZgVtOQQDUCG9VknA438UHihHtBg==","shasum":"626a1bb5f4054f5dd3fef6855e339363933f4f9e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.d6ef559.0.tgz","fileCount":172,"unpackedSize":263067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0LUrIXpbCG7jZf0MoMIypiILyne/m8aBJXIGXyVO4GwIgXoQIJ/Rgkr54RwznkZGvAUz28dsasTDXXbyd6WaMzeQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3zFiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcUw//bU/D0kNObJ1uekGxDUD2z6DCR90vgyl0+ZbThzSJwmAd0Zmq\r\nCI3d24Fl7I55gy/P6RVD8IaVxkMFvYkg/007z5eESZWEG/LrwFa6YswULAZT\r\n6vYU/O3FMW7X9ZJScAcHFUthzBy+lASEvE9OFvUusjS2c13ZHNr22aznhFB2\r\natEEtkIg01G/I0wVjUTpJsbG0AOucd2H+5aks+ngZOXE9HFaaegZgF8OY4OM\r\nNOP+XaF7MjQEydKDEjUqzgcCUZ3feWutfZgNlRw423m6A0y/aD/k9/sNBZox\r\nphxxjgqicjaOiK0y7bHe9rBehpJ87ceJbz1/L+VjQ/m3hYOhztQaYs4sVuPS\r\nkRRvnkjCN3bU9MkpmqROQnO2Twn3FiAPCczbUyfbX5hz5vcSB/b+KNU8NUZB\r\nn576t/yIUzyCv2CXfPmkGn9s8I9RBKg1lY0ITC3wg8pFUaqFBSVOVqDEPcCc\r\nm4OwKYXWLqE7JpzpGoP5jSX+LxpAu4+acAAlMdKNgAsZa7QQ3U/3qNsltlQH\r\nag5hjBOMGZ5NBHw3s/HBye81UILR9xPeCZJc+C4h7qfHEnlJ51vrF0GXDLs5\r\nNRCaqCqrNyuwsa2w9MeBV5eGFJRjxjbGwDsNvb0B/nt/DzDt7BJlDP6VXlgO\r\naBNdbqwvF7TKBn//eYs2BJ8n7m68MebYwFA=\r\n=VT6v\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.d6ef559.0_1675571554169_0.0719600603566497"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.2166dbf.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.2166dbf.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.2"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.13.0","@typescript-eslint/eslint-plugin":"^5.51.0","@typescript-eslint/parser":"^5.51.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.34.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.2","jest-circus":"^29.4.2","lint-staged":"^13.1.1","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.25","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"2166dbffc74029dc5d5d56f58e8b22d2a6db38c0","_id":"@kaname-png/revoltx@2.0.4-next.2166dbf.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-F2D5orS4D8Be1W7Po/bFau8lVRX2JE9Zjy/8f00XMRfiMH8vru7xi6H1Q6zjeeo8OeyfrmrcnmlVFvjXsdW6bQ==","shasum":"ac48c76ce705eff93b21847886a030d4b9908eae","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.2166dbf.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGC8uUT2SgX0tgkSSFr67F5TeD1G978F+1SZnne6OgreAiEArGtGZ4t6V2/ypfTxG7NnvN+xQDr1tCgMwIg0lzr3v9A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj6Sz9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp7YhAAkcW5DGRfiWPpLPZ4Ts0k5Wsz0sxEMJokIwCpTcg9dj5HcKRU\r\nEKcnYQ4CRS9dy6baaEsNFe1CjJ8HD1nAsIdz+f92SScIPcSWRGaQ8eb4B4zy\r\nDYBajXDfdl4IntB+HWbdydc8++gDncBygdNSLFaD6SLHqFRAFZh/oTVAmsPq\r\nZjFodL9hAmdoFcRq6tpmlqXYnxaxNd4wfUVxGx0WmtS/U6YCsz+qxNRTlPnM\r\npGiIZ3Zsh0FYxKOq0aZGJQcCA5l+/Jm4jRme9lIMN4YBXZQ4/MevjYxk6RfH\r\nlfydVFC4Yc+Q6a1wjuVBlFnhPfnB4QXO1NElkuBEpS9lHexVhgzr2grfA1Qb\r\n2HwL4ikJpGdKzaugKmYNp8Jnqsw+WAKWxNh7p52F5CuYzvJ9qiU41/zwVuQG\r\naistver7Uwo+Yp4CfUWyu1oBXSlSXY2pMItq9Tb6ciWrez+XMDgBuK9R2Hgm\r\nOac0Ux6mj3jS1Rq0nVz85xU2TpGly25JoEgJrm0KkeFGRIJSOLY3wVSYLAyt\r\nKATIZwgziB025S47ce0cW7SrOC6qsPoF0aECx5dMxiuYxlqyVZOk/3NgScJS\r\npaosWIw1Dw2F//Tk5jk78Z+6/djwMqiaP0btNXCoghujY+PLW/3rgoK5TJjj\r\nVxo3TsC6DGCbOFPWZTyhfzNN3rqxdX19Aqs=\r\n=uHJ2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.2166dbf.0_1676225789070_0.07697300931920736"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.8e13216.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.8e13216.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.4"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.14.0","@typescript-eslint/eslint-plugin":"^5.52.0","@typescript-eslint/parser":"^5.52.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.34.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.3","jest-circus":"^29.4.3","lint-staged":"^13.1.2","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.25","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"8e13216b366a799f286a44a170926a055dbdf2fc","_id":"@kaname-png/revoltx@2.0.4-next.8e13216.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-7ECViDig7wNM+tydLEc1DkaL9RDXgb5gaQTWq7bq1Ns/54Ci62fLK4GzGXpeSQLh8PX8uvWztZVQveZP5lJNAA==","shasum":"38d87dfb5f2ed7b9b18008b9b85c0afc6cda95c9","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.8e13216.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA3phmKZXPZ2kX2KUhe1KgIpV5my7u00PUmhboU2TqzpAiBKwW7K5TUtqEwFvuQdYLJu0JfLe0XHVkywlue9ASfd8g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8ab6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/DA//WuvLeheV139zP1wEHQE2/G8DiUEy0ojsd9jR3rEm0jUlYtM6\r\nz4LiEerpnSNlymZXuZlzXDACiFvNSHzNKm0OI8n29QtS0Efvciayxil5IQQb\r\nwEycrQSrB4vX+6cvp75m3SLOQ8AotUT23K9LDfHX/g7iposQY9ptgT0nhoXx\r\nJMWmcbjvR+ij4mNMeMudB9pfR/5j8QRpH8HjoA72sbjSV0Yi+z6bBt0fLcDn\r\nFRSOgMqyvfifMGB0mJ96++WEOP4OgaaPtj9pqmz2b5M1JiZmCwffDb7gfAPD\r\nyveByX5e/mQ0zArTbTg+lfCegzsqui4AR4QrQ6IdTRY9JhF00ONM8c5llpgm\r\nAXMm1+YED9RIiUtOy0YDcuZwrKJqvonV/xsaD92B9GO4CDYKSVBRo4IGpi4R\r\nvUFiyxM4ndCvnIlfmvPmXzA8JqnijChbaaOMN/E1O9oO1tcruADqDD+hDs5i\r\nMJCIH7krr6s4aBRF+3yiwPHmODp9THd9iBgY0mLQzR7LfdQNj28XloHvD1S+\r\nS1ihuhKwPH8KJjMYTFqzHfQwEEqBLF08ZzGeQARpwCbsJRdTL0gul2oH3/gZ\r\nz4zFTTAu3KOsnN9gk/KkooFb0Dk9LyoJ2BtsyQBOhmzprlcpD/Fkk+YPsiiH\r\nNLhFvHf/brUup79t6SkcK6o/NziWvbcJIas=\r\n=yuYC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.8e13216.0_1676781305772_0.5220077012535929"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.c737098.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.c737098.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.5"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.14.1","@typescript-eslint/eslint-plugin":"^5.53.0","@typescript-eslint/parser":"^5.53.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.34.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.3","jest-circus":"^29.4.3","lint-staged":"^13.1.2","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.25","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c7370981534e04e3dd524e35a4d73a4278196901","_id":"@kaname-png/revoltx@2.0.4-next.c737098.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-HVOHOtD+p8LC2flq5uF7rIapGkE58EnlKfUiIq68VbIUBKld0jcbenbvl0nL/3hw3zmc1GnkbDPpIgr6gbd2mQ==","shasum":"e84e9d794f4c039659595a0f7874d86c1065d0be","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.c737098.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHtcUiXlvLxJ3rMjf55p+qYALPF5miPaKGA+EOcGxLzTAiBmDpGx5XyC5wCSkYexltrG287EXgfqX5c/L6UmlqyrTw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj+tkiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrmLRAAlUxMAlwZdp/NEllN6WZqgvGzM+NP0NzrMCF2eBxWTPVJPOu4\r\noPEtXIAkY0RfIeyg4pENmyouaGsh+PMfCfZ0dbWgAa3YbaxSsG549WqlLgrr\r\nS+v7bKnfX2/sitpQfxnLUF3aAE1+3YAA9kNkrBEjqK5N8HUDLgCcVBaFF9mc\r\nV9KeAnVrTY6D68Lul42TaMJ7yDRyWg06PnNeyoHokap0CbKfOGtRjTtANP8Z\r\nWou+FSn3brgtIkdAx2iNswEZH15gZCjv37BjJUcC1pqGOMq47U/G8ZkZ68sG\r\n0/cpSBwPiEoJEixXDSZ/OPQ0asBDf9Y+1r33fQfEgoAg12AACXgfNaJoB3mz\r\nWlRwophH7A/Qcn8E55BehwQO2b+Rk33HuXOL8Pzi32A/VC17nrzffv26B9d6\r\nTJPnHH3MGnRQ6HYWuR5dnDvf6R2W85meji2FoKnmaA0yHsPIJw+tssGBZFrM\r\n9vbE957uuTMkHqAlSigf0k66HZkRwo5WWysBkyBo9KvqeEIHPuADnX/05QeG\r\n8JWDvnuqcYGhf4ctVHRx9LbAEsgmVtzdivesjmr07nIQwg2izaYk/K6xi5Pl\r\n7jzuDXEt3YgH9xuGPu4HKjoKLqxpd6XvnHWuEKxE6Iru0NT1LYo4ESOjWJlG\r\n7vx4cGdG4DX+DYd7Tf1KLzUEC3F3xGiPUMc=\r\n=xdlX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.c737098.0_1677383970381_0.9512051310457559"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.816791e.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.816791e.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.7.5"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.14.1","@typescript-eslint/eslint-plugin":"^5.53.0","@typescript-eslint/parser":"^5.53.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.35.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.3","jest-circus":"^29.4.3","lint-staged":"^13.1.2","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.25","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"816791e01def1783ccc146533411da80d1ebe2e4","_id":"@kaname-png/revoltx@2.0.4-next.816791e.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-vTsNNozOrcMGu1Qy0xSpyZ7EAvtclPaqKiGHt2fDe2jUr22+ylfJRrS70ZtHDbZI2/erh1JYqh1Dbc13+OcNeQ==","shasum":"1c1458d4fe889e5a3ecc1707747775fa2c51234e","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.816791e.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9oabLh8SMIEUL8vj/VI9LgxKRXgKlxln8+h7kdhhbhgIhAIJsIGRzz0+7qpgZP0KSMeJk1W8oZe4DSMvCS7djngMw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj+yb+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQBRAAlMhojxanjDqnVU7V33g1Ze0eP1oeDf8fq/iA6z+ZlSsgmUAV\r\nP9bpoj46NcXSErwfD79mUiE4H8QcLgI6WTgwIR6O7xmKCyKetFfuzlYd/LaH\r\nmkfSyNddoWxq9zRyp+v3SXECkoadCaHruasI4pWSBzCBqZ906jRHgZLAb3YQ\r\nCTthnuE6xhHdb9UbBakUla/iyKe+9ktaxhdG0l/k0v93VxkvzJN5RVs6X2Ir\r\n7pJQNW0DJbb4fo0FfobIJ5Wfklnk0x/a5VbfZ9RBhAmApELwhkITXE6w+bOQ\r\nUF5XfNPlQUMOQlE2YEQa6o5BvPpupLupsEo71jatu3ya5hlVQSSVs8qMRjrc\r\nj0Zcny4e7sbq8TqVuNXgSrrcaa2qmIew7nxR5nU5bPtd/EfQ0W3igMl8SwuU\r\n9wG5/v1icuD5494actu4wvrCG2IdRp+lOciJBIMiNDYstR4fnYxI+FbUgGNf\r\n/CePwb26MnqXDJX5ZPUNLFnemPbcpLoipWYSgffvpLbEfUdAa9E5cX41n1tH\r\njPQ97WSUGqIO0GQTllyPRENFc7Bxhds1HvzTncqblJbAi2PDySEY149Awskn\r\nZjG4m4jTXi9u4gCo/8X1LisrQGShYYoJ5FZ5gJYgOTo5m7jywWOJqP+g4HV5\r\nedOwJqb2bgmNI1K1LuGjO3R2oBNgo/Hs7SE=\r\n=eP0+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.816791e.0_1677403901920_0.549894651816569"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.33673b7.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.33673b7.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.5","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.8.1"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.14.6","@typescript-eslint/eslint-plugin":"^5.54.0","@typescript-eslint/parser":"^5.54.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.35.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.3","jest-circus":"^29.4.3","lint-staged":"^13.1.2","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.26","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"33673b7438f660022b078cc7a00449c4f7898370","_id":"@kaname-png/revoltx@2.0.4-next.33673b7.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-azw26m1eCRXrCTdptjRZeNRi2v6PBHpehj9aOSoHdcOZaKcfNhCNg8P772ENRZoeIHYVLPKSm8v+KUWIwNRefw==","shasum":"635c10f4eb1ad2968e8a3eedaba3925d12f3677f","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.33673b7.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC74F87m3xJG7EGzYBH1vLVYYxrYi9xLPtCR63141r5PwIgLGoBrMgtsQ9FO+ValA5dMRw1WsJ7D1sJaa1Z76Y9Jns="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkA+s0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhWxAAh+w2MC9r2OX+trjaWpQV7TscEz5Jgijl9pYGqwHvdG4QOu+W\r\niFaAPbq4yewnQTMrD9dUGjFrxF6efyuUu8gc1UVWcVzulyQ/eX1DF8ql+oVp\r\nY25Jji2iJRZrKU781My3mA1FJ0/ynb0gMEqOnT2IB8yi2+yRat9VVEMVe5wf\r\nSCU3WYY5YWHo1CUdGOiwIDIr+a81zbkQut+eCci/ocUFZaJfWuYuBn2L9yF3\r\nqf0ZA1b7wXptha5bfumeCx0d+I6uBYnjs9ujd2ZL1mOV8lbC+3nZzkJ0sW1o\r\n8x6Re53wMKeORojzznVEbqIcTDdzER4TIqK2jyYpZ2RL3wqEq5jQ0edQNsan\r\nRNOKOX76VdOci4yrr3Jm75OZ6IYIIO0p8c1oY8QzvicppDkz/TvaakuBwaF0\r\n3fHJpvgGeipE/5qx4nbU/UqpdPFWzDZNzXk6JOd2e/+Jz9iqouIzxXW4PJ8m\r\niAE2ui/XEoy4JN6/mUXJ/3I41g/oKjeWRr26dUP4CfTj7C1HOhsymirylN6T\r\n7hTNabW/CzZMaFyvL0Odp9sS6zOAM61iWfWRUTxsZ3Gvi6pHVvDaEAQo3L1r\r\n0cYBm47cXLuJ1UwCUr1E7R43rlfry53yvXJdn9rR66VooYpTZJZERlTqd2mi\r\nJYudW7SgeTEPT+k0q1NJbmrdA3OuXIX8pEc=\r\n=1nu8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.33673b7.0_1677978420527_0.9297003911594999"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.368af31.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.368af31.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.8.1"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.14.6","@typescript-eslint/eslint-plugin":"^5.54.0","@typescript-eslint/parser":"^5.54.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.35.0","eslint-config-prettier":"^8.6.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.4.3","jest-circus":"^29.4.3","lint-staged":"^13.1.2","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.26","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"368af3109d12fddd1e7e48dbf533aaea3bb9dc68","_id":"@kaname-png/revoltx@2.0.4-next.368af31.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-ZNI93PWYYyeqH3Qv6KxMnl0hSrnrzoLoOEUi2mO66p0FLzM7v5l4bdSXGuvJTh0klHs3cZuMny5/FcN4ir1fjg==","shasum":"031413657923ac13319ce41e056dff6c898f2375","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.368af31.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICRksSF6YLgGy+UNX/nZAFflBjTYUxrCCY8xWivq5hGwAiAj2cM9I5VbE9L+jvWjBYOy5f24jNfw3vyQQI0aWNYmbQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkDW01ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+Fg//XCQxsWyvj9HmhUVysPHy/mC0kNBT+C25j612iwJyiyP5V/n/\r\nSel2sXvvQhvhkRfhKyISO4SiEhx0DGF7i2eThe13x5jK1Qy/JJOueEi6I5Rn\r\nYo9KxzhihM98HreKOaWIDWohL1GVPmjw9PwRzhQPXZEOaEAb3phPfld21Y0h\r\nhqIFaG64p8m02HPgcx1KI8L+HW4jGVKy3Jr/aVRZyrmQOXUIDS3qbzk+CORM\r\neGCa1BG/EseGGuO/aof6BdLhMWFn2ck3W8x3/5f35UQv7p4dH+YnmcKp+sfM\r\nuiC2ocQk6jVK75DoRvp2TK/3lsmQz5GrLRDCzBPq4GT9GoUPefH3abF9MS8k\r\nPxmaYHELz31HSX3MLRrm+nt3qWgDbTKLR8CsT7gT/raN9YDadJKijN4V3sgl\r\nW2Ux/nNq9tKVBl7MwJ30g/eUaMqHmo3LgtrGe0Bg9Vjh4NEBYO+UNtSjsCyH\r\nDXN1nn8JEuHvgUsFWeK8bpXHgDh58WS8wicSgEq+05/AhIBr55Lr/IpOO8fp\r\nAtASxo3X6PqkJQ/5mJdq7xolDw5h/uzExjbcQv3ABa/BOaZYaZZm3Y+p1Ab7\r\n5AbWwC4XNPfiigmO2SsWHfUFAwJ+je3H7bcEtpsIRutE5HcTEuA5aV1minIm\r\nF/Dd3qN7izmd/OnDmIFghXX+ZdyB6vWugNM=\r\n=EqEz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.368af31.0_1678601525504_0.6812205990436067"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.06e5d3a.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.06e5d3a.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.15.0","@typescript-eslint/eslint-plugin":"^5.54.1","@typescript-eslint/parser":"^5.54.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.36.0","eslint-config-prettier":"^8.7.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.0","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.26","typedoc-plugin-mdn-links":"^2.0.2","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"06e5d3a3e8e48a985c295b8ae63addc8dfeb1b94","_id":"@kaname-png/revoltx@2.0.4-next.06e5d3a.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Tzh1FoogPYQaTpM6v8YoU1NxPR7RMqUh1kM5Z32npaH+zX6XAxEdvSrwlhN2ZMn5rgy6oN8rN9YSlnal7amc/w==","shasum":"9f252c64163e5b7b4e30fc7eb4b8442b303e3da6","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.06e5d3a.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1nhqnuxehp5FVLp2nIewEDhLbUwP9I8GU66kpD/yzXAIgdcIM2zP4f5rhYiEEfIcJqwxjlJdgQ5AnIKiyrK9YiOE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkDaknACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4Yg/+Ob938ZzUoQfZkHvIB946Y9hjHVpJ4anf+ABbaxLXzAEgQpOz\r\neK+WvPAudNklooVsIcXF9JMqhbYiUS83IwazLSWJ16A1bk9J5i7ulagyubut\r\nD1vwCuthFhexiZFl8YShWUxikOH0wRJZm3NyeV+IPltC+94MDNuKAR4WTIqY\r\nP6pP5pReRPzaSK/QCeTzC2e6iaVs8ASP49hxA91oqOV7o9nkRTHh1knQ1Tgq\r\numrs3gV4vBW/rjZQPkHbrmYO/7lkDVobdfP+BNXrWrAIAgP0snFYnoqhCNHe\r\n+KJoppHdpumqNedLy/Z7QhB7H+na2oRNU5dUWbCE1h+Zru3xmW0QpjuuIuAE\r\n2WEzL0kQUKRs2O+KG/nG9IoBvLEHUKbJMH9C/yxFWAHWamjDW6i0EQOybUmm\r\nJgNSif0qlPl9XzBLbmPoDHNL9IIhvAECR+zWEX+5LMie34fY9PLFHf9iqZJv\r\neqBsiB74Nhehhnwcw4AzTlCLTbVcePhLT4DDr2Pa90R4MRJ2bUWoc1zhJLO1\r\n3GTWI0UJXBBGKvFfwrr74Fec8hXOSYvFMhMo4pKoyPMC+BadreaFy5wcu60n\r\nOWEfq8SLNHZcu4f6kc6iCkRbGrk2H3HMUylhC+wzX5RFyT36TTuASjvTvGKy\r\ndI5R3DOnHSVuzY4lSkusPB2xpsKibff8yrs=\r\n=MzTb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.06e5d3a.0_1678616871626_0.589336863313463"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.0617a05.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.0617a05.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.3.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.0","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.4.0","@types/node":"^18.15.0","@typescript-eslint/eslint-plugin":"^5.54.1","@typescript-eslint/parser":"^5.54.1","cz-conventional-changelog":"^3.3.0","eslint":"^8.36.0","eslint-config-prettier":"^8.7.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.0","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.26","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.4.1","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"0617a05098ff4effb83622187bd119e59c0cb60c","_id":"@kaname-png/revoltx@2.0.4-next.0617a05.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-aDR/URL7TV86AnjiDh5SjZJNxG9TIB3pil+hlL7ljKOkMr0zSNeeovwza8vXXBQMp3w7Z1pceo59RlkEdgWTtA==","shasum":"94095025edb38b91d5a1a404b9d0a0186b75a0a8","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.0617a05.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZFYGiE5v7b1c7V5Hy35Fgd/2UOje07LefHkHFE5EiBQIgOgG78FaxnQ26BDMqOSBmDOCZBf7tSWnjeGd+84qPefw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkDcEmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqTAw//Q+NJLaWBK8SQ9AUouj+ky7Y9g07CVLuk04tUUy1vypbqS5vo\r\ngurxN2PQon5xwYh/DlkwgZSWhE7RSf4wbUGmwrjq/mQX45WBiqDca6WBdTS5\r\nKvYK5n9Z6H0vXCCphtyWyIJNtUZNpIldYJV48zq+JVuvCjt9h53zrrDlrhQ7\r\nvm0GsaSdL23OAmgGnqb31cekWQLkhZ/K8Fw2/JlH6dYMp3doHXDfkT70c204\r\nDCmTMOmWKFt5x20j9H8e+oa4CC0GHS4iV1HlLzmqRiz0VfuKTwQua8ZXnxk0\r\noYBDtBuQ+IpSsqH+WRjZGuyLpN0yG9WD/QtAtDNG4JnJDsrvVVItE4Sivoj2\r\nG4h4tWRhGvWYrGKd8WOTkEhmMoZGisdM/xTw+5wYIdoAHWcSsq+hgAhwwBBN\r\nQipmfQysDhlJMPV1WcNXeR/gR2z2QfUYoMG1M2/mMq3Rghboghtc/H/Te9TE\r\nZ1+qBgUPmX5Xb66v7zSaGYgbtxiWTwIO4WDKgq3sXkcgngEWaGs/FXWSYJfq\r\nndLx3osoPxvuai4XZAIERg8zKNs7JRALSzBZ5la5weWekinlpTjk3fWJ89MG\r\n54ODavXyfCZmoZzCGwOiyNDY6dCdYmj3HlluiiYiXzMa9oSSVywK2isatQo4\r\n307Rxuha8S0774Zo1Vl7bm7chNjZMmPkWmo=\r\n=4Xg9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.0617a05.0_1678623014378_0.198077870613117"},"_hasShrinkwrap":false,"deprecated":"This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version."},"2.0.4-next.c22c8a9.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.c22c8a9.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.4.0","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.2","@sapphire/pieces":"^3.6.1","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.0","@sapphire/utilities":"^3.11.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.0","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.4.4","@commitlint/config-conventional":"^17.4.4","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.3.8","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.0","@types/node":"^18.15.3","@typescript-eslint/eslint-plugin":"^5.55.0","@typescript-eslint/parser":"^5.55.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.36.0","eslint-config-prettier":"^8.7.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.0","prettier":"^2.8.4","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.0.5","ts-node":"^10.9.1","typedoc":"^0.23.27","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.5.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"c22c8a90ae10e851228c723e76e063e296c66e52","_id":"@kaname-png/revoltx@2.0.4-next.c22c8a9.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-6WyuMNg3wPDBk24xdB/G+CL2Em8XQ1wXoVBXMS0ZeGoIQrY36pjgQ4V2Pe2qteWKFa7mEyR9cm3SXJuBAHEWkQ==","shasum":"3b18e6ac4700d1107046a19e305b54435c774587","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.c22c8a9.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCslHMGP/QFDjnfyvASSceHCjgClDrcMtJbuggT987JUAIgLQ1WhexlXrlAuNQZSXw6MA8xHXnaZg2Ur0hUdZH3hFo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkFnFBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkGA/+JnQ4U8vHqcicIGlZkjyNwyiHW4pDYEQ4TXXrU1vr2LDSQitt\r\nWFBz6oNKHz6BiR1Sst0BAMMhTFui3eJ5XyFsKfRNGAdCkabYpeYQW5xzzZ2y\r\ny/Q0+Z+FknsyaD+Uh7S/b+aa6duoXZOxuH1Ahz7x2MPP8g+zlpyx8LvCYV8I\r\nEibFdU0GwStg1NNDZeH7vOJ8/bY5kKt8hhxhROq5tXJ3cFQRxFJJ1vYuw3RS\r\nws9jjjxCR+7Uw6PFmQ4qqRQRP+cASOmQQjGrFq25zORRRYqNLVZ7J9/zdzPD\r\nwz8i+ZVJqcC6DBz7BVJlQBBX1HOEDOU3whkO05cMaGELBBplEUOoGmKxc/H1\r\nnT1mPN7iPXK/LdPxzWx+fvcdU1yNl9Z7+TnGgn5TqELVBv2zmVXBjauouOrF\r\nccEAo+ndw+D8HamwF3KEHxh4edplL2bLtIz8u+Hqdnujz4reqoyykAsw7Ymo\r\nQ3F6DxizwzJZhj1WT5jkMsFjtJWL3keqVlbChSJRe1Pl9hljmoC9ewPwUciK\r\nctNkvY2Awoop1UMKQi5a9AiSsfg65ADBRq7VIHD/MEb6xLfXjQsskLYLtoSn\r\nS0RRrBfO86tOq5ty1Q55o0q5cR+erwdwfNJNARJ0TPJfvc8Pp46AIrE0dx7B\r\nCc6rtPM2CUbGG8MVCNrwjR5JHVfiNTP6OPs=\r\n=uX/w\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.c22c8a9.0_1679192385650_0.5368650152922998"},"_hasShrinkwrap":false},"2.0.4-next.5820b83.0":{"name":"@kaname-png/revoltx","version":"2.0.4-next.5820b83.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.1","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.6.3","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.11.2","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.3","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.6.5","@commitlint/config-conventional":"^17.6.5","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.4.2","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.2","@types/node":"^18.16.16","@typescript-eslint/eslint-plugin":"^5.59.8","@typescript-eslint/parser":"^5.59.8","cz-conventional-changelog":"^3.3.0","eslint":"^8.42.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.2","prettier":"^2.8.8","pretty-quick":"^3.1.3","revolt.js":"^6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.0","ts-node":"^10.9.1","typedoc":"^0.24.8","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"5820b8361482d76d38e819b361615fa7c43578cc","_id":"@kaname-png/revoltx@2.0.4-next.5820b83.0","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-szsFgwbiYynbXGuxcP/IoHEessX9DwBlrMtTqDZrMb6pB6D0uhFYTW9cS6HJ+bcRNcdEepsyzbQngY/MoFchnw==","shasum":"79fe684cd8fa921e1d45d3982f545c56cf74c56d","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.4-next.5820b83.0.tgz","fileCount":172,"unpackedSize":263066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICu+KhUP2yM+aYH3aACQWg69FtesFnKPqxZ3ljMAECCcAiB9/k1y5hAJS3QqgzAV19XoxxMbpW5Gdcyn6PpXRmmLvg=="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.4-next.5820b83.0_1685912437441_0.7133828733590133"},"_hasShrinkwrap":false},"2.0.5":{"name":"@kaname-png/revoltx","version":"2.0.5","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.1","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.6.3","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.11.2","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.3","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.6.5","@commitlint/config-conventional":"^17.6.5","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.4.2","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.2","@types/node":"^20.2.5","@typescript-eslint/eslint-plugin":"^5.59.8","@typescript-eslint/parser":"^5.59.8","cz-conventional-changelog":"^3.3.0","eslint":"^8.42.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.2","prettier":"^2.8.8","pretty-quick":"^3.1.3","revolt.js":"6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.0","ts-node":"^10.9.1","typedoc":"^0.24.8","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.0","gitHead":"5f5f1a70d195413e34a05469a01c83119f3453b8","_id":"@kaname-png/revoltx@2.0.5","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-UzXCVOrhYi8dLHAEjpk7Xj5ITh0Racml3pSwYFAdUb6B5DHceJqKwZhiInHtXDV5SWh7aIsc/WT6xPERxZ2bgQ==","shasum":"31e7d7582d0ace9ea411d56a58d8c8e0a55c79e7","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.5.tgz","fileCount":172,"unpackedSize":263048,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAwxSHUkIAzfw2sIe07eH8oQRhAEKVGE8UamK5CBJy+xAiEA++YD/uU2TKz2Zqd+CoTQ7CwK9QKECox+xmS8zsXn4G8="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.5_1685995676324_0.16442428795820052"},"_hasShrinkwrap":false},"2.0.6-next.590f0be.0":{"name":"@kaname-png/revoltx","version":"2.0.6-next.590f0be.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.1","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.6.3","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.12.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.3","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.6.5","@commitlint/config-conventional":"^17.6.5","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.4.2","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.2","@types/node":"^20.2.5","@typescript-eslint/eslint-plugin":"^5.59.9","@typescript-eslint/parser":"^5.59.9","cz-conventional-changelog":"^3.3.0","eslint":"^8.42.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.2","prettier":"^2.8.8","pretty-quick":"^3.1.3","revolt.js":"6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.0","ts-node":"^10.9.1","typedoc":"^0.24.8","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"590f0bebc3cf715a0cd55b370d484da53bf8cea2","_id":"@kaname-png/revoltx@2.0.6-next.590f0be.0","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-jwdC20IUfnQ9Lb24yqp1rqL/fuCR0T8QIdVtFelgcp9z+EavCZGwOsrZw8TktUQ+XpiT3FvZhV/msAZVehavEg==","shasum":"ce0b580a2df9dd0b21695e336a6037d05b025afb","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.6-next.590f0be.0.tgz","fileCount":172,"unpackedSize":263063,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAy/ck5Yi9xcHkPLFCpLjUdrw3XqDWd+h6VK6ZaYdrcdAiBmBMj7n3oHnwHnrn3i2twJHQ6QbzLxlx8vnYGyM9gzHg=="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.6-next.590f0be.0_1686489111760_0.24707823521992855"},"_hasShrinkwrap":false},"2.0.6-next.78382af.0":{"name":"@kaname-png/revoltx","version":"2.0.6-next.78382af.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.1","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.6.3","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.12.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.3","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.6.5","@commitlint/config-conventional":"^17.6.5","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.4.2","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.2","@types/node":"^20.2.5","@typescript-eslint/eslint-plugin":"^5.59.11","@typescript-eslint/parser":"^5.59.11","cz-conventional-changelog":"^3.3.0","eslint":"^8.43.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.2","prettier":"^2.8.8","pretty-quick":"^3.1.3","revolt.js":"6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.0","ts-node":"^10.9.1","typedoc":"^0.24.8","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"78382af444bcd226fa0212bafcd1b54bb576f2fd","_id":"@kaname-png/revoltx@2.0.6-next.78382af.0","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-elu7WkzKNtFtAIGHPsIXxoidnTkGEpUN9o1mI/6ZWtIsnYqPxiUoBXO7xVRFk9VWLfJrqtP7Eyx0v+1g6dM2cg==","shasum":"f14f3caecd559277b7f03048ef4b76a4d699a335","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.6-next.78382af.0.tgz","fileCount":172,"unpackedSize":263065,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDtzgJwQXfPDFi/oANq5tBIjYL2qZMIqA6YNA/Yk37bGAiEAwxUi0YgoV6oPl7DUA0yaUw613V5eLunlM0UscJsLWqE="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.6-next.78382af.0_1687141108744_0.40273722266494016"},"_hasShrinkwrap":false},"2.0.6-next.b6a1c13.0":{"name":"@kaname-png/revoltx","version":"2.0.6-next.b6a1c13.0","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.1","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.6.3","@sapphire/ratelimits":"^2.4.6","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.12.0","chalk":"^5.2.0","chokidar":"^3.5.3","tslib":"^2.5.3","tslog":"^4.8.2"},"devDependencies":{"@commitlint/cli":"^17.6.6","@commitlint/config-conventional":"^17.6.6","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^4.4.2","@sapphire/prettier-config":"^1.4.5","@sapphire/ts-config":"^3.3.4","@types/jest":"^29.5.2","@types/node":"^20.2.5","@typescript-eslint/eslint-plugin":"^5.60.0","@typescript-eslint/parser":"^5.60.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.43.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.5.0","jest-circus":"^29.5.0","lint-staged":"^13.2.2","prettier":"^2.8.8","pretty-quick":"^3.1.3","revolt.js":"6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.0","ts-node":"^10.9.1","typedoc":"^0.24.8","typedoc-plugin-mdn-links":"^3.0.3","typescript":"^4.9.5"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.0","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md","gitHead":"b6a1c136cab58a9983bff5b34ff8c789760fa348","_id":"@kaname-png/revoltx@2.0.6-next.b6a1c13.0","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-2Nahrn7Pmoepib9RrjxkuFAQWZu0dsjofRW2hxDFQC6a4LcAMG6BNQHVpVWjlkbRSoCX59xEDBf+eXVMFPrxeg==","shasum":"10260746c9c583898bbcb94dfd772cd2acfcb817","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.6-next.b6a1c13.0.tgz","fileCount":172,"unpackedSize":263063,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICuQEXBM/nWDSA7AaP+C5FjrNbQCpK9fIv0JmNmaiTBpAiEAtteAGxhDElU+Fe8aylc8uUli0/t3dwg7Y1C4LeGJmlo="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.6-next.b6a1c13.0_1687655508498_0.5371286767653496"},"_hasShrinkwrap":false},"2.0.6":{"name":"@kaname-png/revoltx","version":"2.0.6","description":"RevoltX is a framework for creating Revolt bots.","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"@kaname-png"},"license":"MIT","type":"module","scripts":{"lint":"eslint src tests --ext ts --fix","format":"prettier --write {src,tests}/**/*.ts","docs":"typedoc","test":"jest","test:watch":"jest --watch","update":"yarn upgrade-interactive","build":"tsc -b src","clean":"tsc -b src --clean","watch":"tsc -b src -w","sversion":"standard-version --no-verify && npm publish && git push --follow-tags origin main","commit":"git-cz","cz":"git-cz","prepublishOnly":"rollup-type-bundler -v -e url events","prepare":"husky install .github/husky"},"dependencies":{"@discordjs/collection":"^1.5.3","@favware/rollup-type-bundler":"^2.0.0","@sapphire/lexure":"^1.1.5","@sapphire/pieces":"^3.7.0","@sapphire/ratelimits":"^2.4.7","@sapphire/result":"2.6.4","@sapphire/utilities":"^3.13.0","chalk":"^5.3.0","chokidar":"^3.5.3","tslib":"^2.6.2","tslog":"^4.9.2"},"devDependencies":{"@commitlint/cli":"^17.7.1","@commitlint/config-conventional":"^17.7.0","@favware/npm-deprecate":"^1.0.7","@sapphire/eslint-config":"^5.0.2","@sapphire/prettier-config":"^2.0.0","@sapphire/ts-config":"^5.0.0","@types/jest":"^29.5.4","@types/node":"^20.6.0","@typescript-eslint/eslint-plugin":"^6.7.0","@typescript-eslint/parser":"^6.7.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.49.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","git-cz":"^4.9.0","husky":"^8.0.3","jest":"^29.6.4","jest-circus":"^29.6.4","lint-staged":"^14.0.1","prettier":"^3.0.3","pretty-quick":"^3.1.3","revolt.js":"6.0.20","standard-version":"^9.5.0","ts-jest":"^29.1.1","ts-node":"^10.9.1","typedoc":"^0.25.1","typedoc-plugin-mdn-links":"^3.1.0","typescript":"^5.2.2"},"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"engines":{"node":">=v14.0.0","npm":">=7.0.0"},"keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"homepage":"https://github.com/kaname-png/revoltx","commitlint":{"extends":["@commitlint/config-conventional"]},"lint-staged":{"*.{mjs,js,ts}":"eslint --fix --ext mjs,js,ts"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"publishConfig":{"access":"public"},"resolutions":{"jest-environment-jsdom":"https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.1.3.tgz"},"prettier":"@sapphire/prettier-config","packageManager":"yarn@3.6.3","_id":"@kaname-png/revoltx@2.0.6","gitHead":"d0db696d896593d874826f4982d1f33e817f921b","_nodeVersion":"20.6.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-y8cp/AVzFvBspMa+198ybOh0u8L1/4a3zlnkHV2d04ktYcLvhzyHWMXD8rX3ZwxW4bdytf+tqoPFUFWb3F94ag==","shasum":"b5a6410237fcac39549dd4782d9e33bc80b29973","tarball":"https://registry.npmjs.org/@kaname-png/revoltx/-/revoltx-2.0.6.tgz","fileCount":172,"unpackedSize":261002,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGp80B6JnnEhQKcB16v/a2o6naFZCguE/wKOm5yFozTUAiEAu8BmAuwIWjyN+cxRF5oG/QaOPM7C/6mfEa7fnrS2Gvo="}]},"_npmUser":{"name":"kaname-png","email":"saturnoxnginx@gmail.com"},"directories":{},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/revoltx_2.0.6_1694491264873_0.833972887620843"},"_hasShrinkwrap":false}},"time":{"created":"2022-03-07T19:13:37.748Z","1.1.0-next.5aacc72.0":"2022-03-07T19:13:37.970Z","modified":"2023-09-12T04:01:05.324Z","1.1.1-next.1f77f89.0":"2022-03-07T19:21:09.351Z","1.1.0":"2022-03-07T19:21:28.244Z","1.1.1":"2022-03-07T19:26:37.865Z","1.1.2-next.b57ba48.0":"2022-03-07T19:27:09.836Z","1.1.2-next.7e782f1.0":"2022-03-07T19:38:57.329Z","1.1.2-next.958fd13.0":"2022-03-07T19:42:58.271Z","1.1.2-next.f19ec0f.0":"2022-03-07T19:52:35.093Z","1.1.2-next.a13a5c9.0":"2022-03-07T19:54:25.789Z","1.1.2-next.91ae121.0":"2022-03-07T20:00:16.231Z","1.1.2":"2022-03-07T20:02:26.378Z","1.1.3-next.70bab7b.0":"2022-03-07T20:02:51.745Z","1.1.3":"2022-03-07T20:15:44.796Z","1.1.4-next.d767759.0":"2022-03-07T20:16:17.136Z","1.1.4-next.fc7ca8e.0":"2022-03-08T00:31:51.129Z","1.2.0-next.1fc4d37.0":"2022-03-08T01:37:36.640Z","1.2.0-next.aed15d7.0":"2022-03-08T18:29:37.139Z","1.2.0-next.8be4a08.0":"2022-03-08T18:30:20.937Z","1.2.0":"2022-03-08T18:30:58.557Z","1.2.1-next.88f5532.0":"2022-03-08T18:31:30.553Z","1.2.1-next.06963bd.0":"2022-03-08T22:21:54.785Z","1.3.0-next.4df3800.0":"2022-03-08T23:08:28.048Z","1.3.0-next.41d7a80.0":"2022-03-09T15:04:07.286Z","1.3.0":"2022-03-09T18:23:31.702Z","1.3.1-next.d7299b0.0":"2022-03-09T18:24:01.021Z","1.4.0":"2022-03-09T19:17:43.724Z","1.4.1":"2022-03-09T19:20:34.076Z","1.4.2-next.9923032.0":"2022-03-09T19:22:04.755Z","1.4.2-next.381dcca.0":"2022-03-13T02:30:58.497Z","1.4.2-next.6fd42d9.0":"2022-03-13T04:55:56.472Z","1.4.2-next.1740925.0":"2022-03-20T03:46:33.897Z","1.4.2-next.1357778.0":"2022-03-27T03:23:21.870Z","1.5.0-next.d47cd03.0":"2022-03-28T04:23:45.712Z","1.5.0-next.68e8727.0":"2022-03-28T04:31:26.737Z","1.5.0-next.97e7c67.0":"2022-03-28T16:53:08.275Z","1.5.0-next.706834a.0":"2022-04-03T01:00:43.509Z","1.5.0-next.82dc52c.0":"2022-04-03T01:06:46.557Z","1.5.0-next.ec2299a.0":"2022-04-03T01:09:49.509Z","1.5.0-next.cc20cf5.0":"2022-04-03T16:02:41.489Z","1.5.0-next.53f0c6f.0":"2022-04-05T01:24:06.734Z","1.5.0-next.9c7b8a7.0":"2022-04-10T04:46:44.835Z","1.5.0-next.a1286ba.0":"2022-04-10T05:15:22.641Z","1.5.0-next.e3e94ac.0":"2022-04-17T00:50:09.990Z","1.5.0-next.808ca1b.0":"2022-04-17T00:51:49.919Z","1.5.0-next.38f695d.0":"2022-04-19T20:13:17.351Z","1.5.0-next.b5f4a95.0":"2022-04-24T02:53:08.734Z","1.5.0-next.09c3113.0":"2022-04-24T02:53:43.505Z","1.5.0-next.8f04c47.0":"2022-04-24T02:57:57.769Z","1.5.0-next.1bfa478.0":"2022-04-27T03:57:05.197Z","1.5.0-next.929af92.0":"2022-04-27T15:16:04.883Z","1.5.0-next.6bc5da9.0":"2022-04-27T15:16:49.353Z","1.5.0-next.56167f1.0":"2022-04-29T17:13:20.718Z","1.5.0-next.d186901.0":"2022-04-29T17:24:51.067Z","1.5.0-next.842dda8.0":"2022-04-29T18:07:21.730Z","1.5.0-next.61209d4.0":"2022-04-29T18:09:08.413Z","1.5.0-next.9d6b837.0":"2022-04-29T18:37:01.194Z","1.5.0-next.cda13a6.0":"2022-04-29T23:43:47.745Z","1.5.0-next.93d9b7e.0":"2022-04-30T00:32:08.527Z","1.5.0-next.24360d1.0":"2022-04-30T00:41:59.902Z","1.5.0-next.94d8149.0":"2022-04-30T22:09:05.033Z","1.5.0-next.e476b63.0":"2022-05-01T18:57:44.961Z","1.5.0-next.61ab69f.0":"2022-05-01T19:01:09.807Z","1.5.0-next.2b397f4.0":"2022-05-01T19:05:17.777Z","1.5.0-next.e65fdcb.0":"2022-05-04T17:34:26.867Z","1.5.0-next.d7e85ad.0":"2022-05-06T19:51:42.219Z","1.5.0-next.24e5f75.0":"2022-05-08T00:43:07.523Z","1.5.0-next.a706d36.0":"2022-05-08T00:43:24.790Z","1.5.0":"2022-05-08T00:45:11.364Z","1.5.1-next.ca2ce15.0":"2022-05-08T00:45:30.058Z","1.5.1-next.4545506.0":"2022-05-08T00:51:15.464Z","1.5.1-next.3d9f421.0":"2022-05-08T00:58:44.660Z","1.5.1":"2022-05-08T01:18:32.084Z","1.5.2-next.ee51c4b.0":"2022-05-08T01:19:04.633Z","1.5.2":"2022-05-08T01:24:08.260Z","1.5.3-next.7106458.0":"2022-05-08T01:24:33.946Z","1.5.3":"2022-05-08T02:44:16.654Z","1.5.4-next.e4cc337.0":"2022-05-08T02:44:39.972Z","1.5.4":"2022-05-08T03:11:50.517Z","1.5.5-next.fd33ae5.0":"2022-05-08T03:12:15.688Z","1.5.5-next.c4b0ed6.0":"2022-05-08T03:15:53.534Z","1.5.5-next.297e393.0":"2022-05-08T05:08:23.321Z","1.5.5-next.7b31bb2.0":"2022-05-08T09:39:26.853Z","1.5.5":"2022-05-09T17:13:31.919Z","1.5.6-next.1a851cb.0":"2022-05-09T17:13:53.739Z","1.5.6":"2022-05-09T17:28:07.019Z","1.5.7-next.5758b38.0":"2022-05-09T17:28:34.518Z","1.6.0":"2022-05-09T23:46:07.199Z","1.6.1-next.d34eb32.0":"2022-05-09T23:48:05.245Z","1.6.1-next.f373ef3.0":"2022-05-13T01:38:43.048Z","1.6.1-next.7836913.0":"2022-05-13T01:39:54.914Z","1.6.1-next.dcec624.0":"2022-05-13T01:42:27.740Z","1.6.1-next.a627682.0":"2022-05-13T01:48:40.949Z","1.6.1-next.fd7cbe5.0":"2022-05-15T03:53:30.229Z","1.6.1-next.5bc7f46.0":"2022-05-15T13:13:33.455Z","1.6.1-next.0ff860a.0":"2022-05-18T16:43:31.026Z","1.6.1-next.eead66b.0":"2022-05-18T16:44:19.150Z","1.6.1-next.8642a62.0":"2022-05-18T16:46:08.247Z","1.6.1-next.a3310f8.0":"2022-05-18T16:47:09.514Z","1.6.1-next.0edc677.0":"2022-05-22T02:34:48.677Z","1.6.1-next.8ce7fcb.0":"2022-05-22T02:36:47.485Z","1.6.1-next.b018f2f.0":"2022-05-29T03:47:31.387Z","1.6.1-next.c2a2065.0":"2022-05-29T04:52:54.089Z","1.6.1-next.54282cd.0":"2022-05-29T04:54:07.983Z","1.6.1":"2022-05-30T16:24:55.747Z","1.6.2-next.c5906f8.0":"2022-05-30T16:25:12.554Z","1.6.2-next.0c380d1.0":"2022-06-05T05:10:03.309Z","1.6.2-next.05f13cf.0":"2022-06-05T05:36:47.961Z","1.6.2-next.ce67d71.0":"2022-06-05T05:37:22.435Z","1.6.2-next.0d2e9f7.0":"2022-06-05T18:51:52.002Z","1.6.2-next.a72b1ac.0":"2022-06-12T01:33:26.994Z","1.6.2-next.44b52e0.0":"2022-06-12T01:35:04.285Z","2.0.0":"2022-06-18T02:31:09.205Z","2.0.1-next.d3d1cb6.0":"2022-06-18T02:31:53.626Z","2.0.1-next.40a4acc.0":"2022-06-18T02:42:56.384Z","2.0.1-next.40a162c.0":"2022-06-28T04:55:00.623Z","2.0.1-next.701547f.0":"2022-06-28T04:55:54.904Z","2.0.2-next.08fb2c3.0":"2022-06-28T15:34:13.552Z","2.0.1":"2022-06-28T15:36:03.965Z","2.0.2-next.4274daf.0":"2022-07-03T01:12:38.818Z","2.0.2-next.441d8c2.0":"2022-07-03T01:21:30.422Z","2.0.2-next.c2ff4a0.0":"2022-07-10T03:18:58.303Z","2.0.2-next.9c42e2e.0":"2022-07-17T04:53:26.347Z","2.0.2-next.1ee5989.0":"2022-07-17T16:10:53.601Z","2.0.2-next.5e7f8a5.0":"2022-07-24T12:34:38.761Z","2.0.2-next.c52524e.0":"2022-07-31T05:44:16.960Z","2.0.2-next.e59ea19.0":"2022-08-03T23:27:01.551Z","2.0.2-next.3d4689c.0":"2022-08-07T02:33:05.555Z","2.0.2-next.143568f.0":"2022-08-21T01:50:07.961Z","2.0.2-next.8e7f841.0":"2022-08-21T01:54:13.476Z","2.0.2-next.42b1ba1.0":"2022-08-28T05:31:36.468Z","2.0.2-next.4cc6da9.0":"2022-08-28T05:32:57.181Z","2.0.2-next.5da1813.0":"2022-09-02T21:23:58.575Z","2.0.2":"2022-09-02T21:24:36.824Z","2.0.3-next.dcff08e.0":"2022-09-02T21:27:10.452Z","2.0.3-next.d0cef4e.0":"2022-09-02T21:28:40.640Z","2.0.3-next.6444d38.0":"2022-09-02T21:35:24.564Z","2.0.3-next.b5fae53.0":"2022-09-04T02:20:59.101Z","2.0.3-next.7e56b3b.0":"2022-09-11T04:49:40.730Z","2.0.3-next.92db3c4.0":"2022-09-17T02:43:30.048Z","2.0.3-next.e1dd40f.0":"2022-09-17T03:47:31.503Z","2.0.3-next.2b60feb.0":"2022-09-25T02:33:07.685Z","2.0.3-next.ffd3c24.0":"2022-10-02T04:29:39.060Z","2.0.3-next.e752b77.0":"2022-10-02T04:46:28.220Z","2.0.3-next.36f25a8.0":"2022-10-02T13:46:57.603Z","2.0.3-next.ee48757.0":"2022-10-09T03:49:23.054Z","2.0.3-next.ebf2a1b.0":"2022-10-09T04:08:57.589Z","2.0.3-next.6027c7a.0":"2022-10-09T04:12:10.640Z","2.0.3-next.daf78be.0":"2022-10-16T12:38:49.718Z","2.0.3-next.d3a3aa1.0":"2022-10-16T17:16:57.868Z","2.0.3-next.d86a004.0":"2022-10-16T17:18:30.412Z","2.0.3-next.a3e2117.0":"2022-10-16T17:19:08.811Z","2.0.3-next.f715a01.0":"2022-10-23T08:18:57.542Z","2.0.3-next.5d0ef91.0":"2022-10-23T08:19:31.318Z","2.0.3-next.3769f1d.0":"2022-10-23T08:21:50.327Z","2.0.3-next.9bf8a6f.0":"2022-10-23T08:28:07.419Z","2.0.3-next.2bc20ca.0":"2022-10-30T01:54:28.600Z","2.0.3-next.74e927c.0":"2022-11-06T02:35:46.308Z","2.0.3-next.8f8659e.0":"2022-11-06T07:29:21.831Z","2.0.3-next.c8789f5.0":"2022-11-06T07:34:34.660Z","2.0.3-next.ddcb609.0":"2022-11-13T03:59:01.351Z","2.0.3-next.9c99497.0":"2022-11-20T03:53:42.340Z","2.0.3":"2022-12-04T03:53:14.517Z","2.0.4-next.2ef220b.0":"2022-12-04T03:56:06.638Z","2.0.4-next.920c8a8.0":"2022-12-11T03:17:21.211Z","2.0.4-next.8a96ac8.0":"2022-12-19T14:23:05.841Z","2.0.4-next.7efbbf7.0":"2022-12-25T04:12:47.788Z","2.0.4-next.d6cfdf5.0":"2023-01-01T04:35:14.864Z","2.0.4-next.4550ef1.0":"2023-01-08T05:46:13.792Z","2.0.4-next.42d429d.0":"2023-01-15T04:00:49.346Z","2.0.4-next.656cb77.0":"2023-01-15T06:29:29.217Z","2.0.4-next.0c09a3c.0":"2023-01-15T10:03:38.416Z","2.0.4-next.8574bc3.0":"2023-01-22T03:16:14.048Z","2.0.4-next.498e9bd.0":"2023-01-29T03:47:28.687Z","2.0.4-next.d6ef559.0":"2023-02-05T04:32:34.444Z","2.0.4-next.2166dbf.0":"2023-02-12T18:16:29.275Z","2.0.4-next.8e13216.0":"2023-02-19T04:35:06.033Z","2.0.4-next.c737098.0":"2023-02-26T03:59:30.556Z","2.0.4-next.816791e.0":"2023-02-26T09:31:42.064Z","2.0.4-next.33673b7.0":"2023-03-05T01:07:00.766Z","2.0.4-next.368af31.0":"2023-03-12T06:12:05.703Z","2.0.4-next.06e5d3a.0":"2023-03-12T10:27:51.833Z","2.0.4-next.0617a05.0":"2023-03-12T12:10:14.567Z","2.0.4-next.c22c8a9.0":"2023-03-19T02:19:45.854Z","2.0.4-next.5820b83.0":"2023-06-04T21:00:37.668Z","2.0.5":"2023-06-05T20:07:56.535Z","2.0.6-next.590f0be.0":"2023-06-11T13:11:51.952Z","2.0.6-next.78382af.0":"2023-06-19T02:18:28.970Z","2.0.6-next.b6a1c13.0":"2023-06-25T01:11:48.721Z","2.0.6":"2023-09-12T04:01:05.161Z"},"maintainers":[{"name":"kaname-png","email":"saturnoxnginx@gmail.com"}],"description":"RevoltX is a framework for creating Revolt bots.","homepage":"https://github.com/kaname-png/revoltx","keywords":["@kaname-png/revoltx","revolt","bot","typescript","ts","yarn","sapphire"],"repository":{"type":"git","url":"git+https://github.com/kaname-png/revoltx.git"},"author":{"name":"@kaname-png"},"bugs":{"url":"https://github.com/kaname-png/revoltx/issues"},"license":"MIT","readme":"<div align=\"center\">\n\n![RevoltX Logo](https://raw.githubusercontent.com/kaname-png/revoltx/development/.github/assets/logo-transparent.png)\n\n# @kaname-png/revoltx\n\n**Create Revolt bots in a simple, fast and fun way**\n\n[![GitHub](https://img.shields.io/github/license/kaname-png/revoltx)](https://github.com/kaname-png/revoltx/blob/main/LICENSE.md)\n[![codecov](https://codecov.io/gh/kaname-png/revoltx/branch/main/graph/badge.svg?token=0MSAyoZNxz)](https://codecov.io/gh/kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/v/@kaname-png/revoltx?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@kaname-png/revoltx)\n[![npm](https://img.shields.io/npm/dt/@kaname-png/revoltx?color=crimson&logo=npm)](https://www.npmjs.com/package/@kaname-png/revoltx)\n\n</div>\n\n## Features\n\n-   Full ESM\n-   TypeScript & JavaScript support\n-   Written in TypeScript\n-   Completely Modular and Extendable\n-   Command Handler, Arguments, Preconditions and Listeners Store\n-   Powered by [@sapphire/framework](https://github.com/sapphiredev/framework) preconditions and arguments system\n\n# 🔎 Introduction\n\nWith RevoltX you have at your disposal the creation of highly typed, secure and easy to make bots with a wide variety of tools and utilities available.\n\n# ❗ Usage\n\nNow you can continue installing the necessary packages.\n\n```\nnpm i @kaname-png/revoltx revolt.js\n```\n\nOr\n\n```\nyarn add @kaname-png/revoltx revolt.js\n```\n\n### 🤖 Client\n\nThis is how the client is created and the bot is started.\n\n```typescript\n// client.js\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n\nvoid start();\n```\n\nNow you can start bot as follows:\n\n```\nnode --experimental-specifier-resolution=node client.js\n```\n\nTo set the path to the commands, listeners, etc. you need to indicate the path to your \"main.js\" file (the file which starts your bot) in the \"main\" property of your `package.json` file.\n\n> Remember that the name of your main file `(main.js)` is up to you.\n\nFor JavaScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"src/main.js\"\n}\n```\n\nFor TypeScript it should be for example:\n\n```json\n{\n\t\"name\": \"my-awesome-bot\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"dist/main.js\"\n}\n```\n\n### 📁 Folder Structure\n\nOnce the client is created and instantiated, it is time to configure where all your commands, listeners, arguments, etc. are located.\n\n```typescript\nimport { Client } from '@kaname-png/revoltx';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst start = () => {\n\tconst client = new Client({ prefix: '!' });\n\tawait client.login('<BOT_TOKEN>');\n};\n```\n\nOur project should have a folder structure like this.\n\n```\n├───commands\n│   └───help.js\n└───main.js\n```\n\n# 📝 Create command\n\nBasic structure of a basic command.\n\nCommands are actions that users can request to the bot by means of a prefix and command name, e.g.: `n!help`.\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\talias: ['helpme']\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🔉 Create listener\n\nBasic structure of a basic listener.\n\nThe listeners have the function of listening to events that the client emits by default, but you can assign the emitter you need and listen to the events of that emitter.\n\n```typescript\n// listener/message.ts\nimport { Listener, ListenerOptions ClientEvents, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class MessageListener extends Listener {\n\t// You can set the event name you need.\n\tconstructor(context: PieceContext, options: ListenerOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  event: ClientEvents.MessageCreate\n                  /* optional listeners options */\n                });\n\t}\n\n\tpublic async run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n# 🛡️ Create Argument\n\nBasic structure of a basic argument.\nArguments are parameters that the bot receives from the message sent by the user. This argument system allows to use arguments dynamically as needed, and not only by configuring the command options.\n\n```typescript\n// arguments/serverOwner.ts\nimport { Argument, ArgumentOptions ArgumentResult, PieceContext } from '../lib/structures/argument';\nimport type { ArgumentContext } from '../utils/interfaces/argument';\n\n// <boolean> is for TypeScript users only.\nexport class ServerOwnerArgument extends Argument<boolean> {\n\t// Asign name of argument\n\tpublic constructor(context: PieceContext, options: ArgumentOptions) {\n\t\tsuper(context, {\n                  ...options,\n                  name: 'ServerOwner'\n                  /* optional arguments options */\n                });\n\t}\n\n\tpublic run(parameter: string, context: ArgumentContext): ArgumentResult<boolean> {\n\t\tconst resolved = message.member?.server?.owner === parameter;\n\t\tif (!resolved) return this.ok(true);\n\n\t\treturn this.error({\n\t\t\tparameter,\n\t\t\tidentifier: resolved.error,\n\t\t\tmessage: 'The argument did not resolve to server owner.',\n\t\t\tcontext\n\t\t});\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface ArgType {\n\t\t// The type returned by the this.ok() method;\n\t\tServerOwner: boolean;\n\t}\n}\n\n// Command Usage\n// User Input: n!server @kaname-png\nimport { Args, Command } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class ServerCommand extends Command {\n\tpublic run(message: Message, args: Args) {\n\t\tconst owner = await args.pick('ServerOwner');\n\t\treturn message.channel?.sendMessage(owner ? 'You are server owner.' : 'You are not the owner of the server.');\n\t}\n}\n```\n\n# 🛡️ Create Precondition\n\nBasic structure of a basic precondition.\n\n```typescript\n// preconditions/nsfw.ts\nimport type { PieceContext, Precondition, PreconditionOptions, PreconditionResult, Identifiers } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class NSFWPrecondition extends Precondition {\n\tpublic constructor(context: PieceContext, options: PreconditionOptions) {\n\t\tsuper(context, {\n\t\t\t...options,\n\t\t\tname: 'NSFW'\n\t\t\t/* optional preconditions options */\n\t\t});\n\t}\n\n\tpublic run(message: Message): PreconditionResult {\n\t\treturn message.channel?.nsfw === true\n\t\t\t? this.ok()\n\t\t\t: this.error({ identifier: Identifiers.PreconditionsNsfw, message: 'You cannot run this command outside NSFW channels.' });\n\t}\n}\n\n// For TypeScript users only.\ndeclare module '@kaname-png/revoltx' {\n\tinterface Preconditions {\n\t\t// Name of precondition\n\t\tNSFW: never;\n\t}\n}\n```\n\n# 📚 Notes\n\n1. More examples in the comments of the corresponding classes.\n2. The examples shown are written in TypeScript, but you can replicate them in JavaScript by simply removing the variable types.\n\n#### Example of converting TypeScript code to JavaScript code:\n\n> This also applies to arguments, listeners, preconditions, etc.\n\nTypeScript code\n\n```typescript\n// commands/help.ts\nimport { Command, CommandOptions, PieceContext } from '@kaname-png/revoltx';\nimport type { Message } from 'revolt.js';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context: PieceContext, options: CommandOptions) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\tpublic run(message: Message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\nJavaScript code\n\n```javascript\n// commands/help.js\nimport { Command } from '@kaname-png/revoltx';\n\nexport class HelpCommand extends Command {\n\t// If you need to add extra options to the command, you can do it in the constructor, it is not required if you don't need to add options.\n\tconstructor(context, options) {\n\t\tsuper(context, {\n\t\t\t...options\n\t\t\t/* optional commands options */\n\t\t});\n\t}\n\n\trun(message) {\n\t\treturn message.reply('@kaname-png/revoltx');\n\t}\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://kaname.netlify.app\"><img src=\"https://avatars.githubusercontent.com/u/56084970?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaname</b></sub></a><br /><a href=\"https://github.com/kaname-png/revoltx/issues?q=author%3Akaname-png\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Code\">💻</a> <a href=\"https://github.com/kaname-png/revoltx/commits?author=kaname-png\" title=\"Documentation\">📖</a> <a href=\"#ideas-kaname-png\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#maintenance-kaname-png\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-kaname-png\" title=\"Project Management\">📆</a> <a href=\"https://github.com/kaname-png/revoltx/pulls?q=is%3Apr+reviewed-by%3Akaname-png\" title=\"Reviewed Pull Requests\">👀</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","readmeFilename":"README.md"}