From 618fddd46f9d2ffe9210f78ed220b9615a616a5d Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 15:53:36 +0000 Subject: [PATCH 01/25] init --- .gitignore | 30 ++- Trakt.js => index.ts | 0 package.json | 33 ++- tsconfig.json | 19 ++ yarn.lock | 605 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 664 insertions(+), 23 deletions(-) rename Trakt.js => index.ts (100%) create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index fe32a4c..6708d2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,28 @@ -# Irritating file create by Mac +# ======================== +# System generated files +# ======================== + +# macOS generated files .DS_Store -# Random stuff -node_modules/ -yarn.lock -.eslintrc.json +# ======================== +# IDEs and editors +# ======================== + +# JetBrains IDEs (e.g., WebStorm, IntelliJ) +.idea/ + +# ======================== +# Dependency management +# ======================== + +# Yarn: lock file and error log +yarn-error.log +.yarn/ +.pnp.cjs +.pnp.loader.mjs +# ======================== # Config file -config.json \ No newline at end of file +# ======================== +config.json diff --git a/Trakt.js b/index.ts similarity index 100% rename from Trakt.js rename to index.ts diff --git a/package.json b/package.json index 9b65dba..5d730d6 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,25 @@ { "name": "trakt-discord-presence", - "version": "1.0.7", + "description": "Set your Discord presence according to what you are watching on Trakt.tv", + "version": "2.0.0", + "main": "index.ts", + "repository": "https://github.com/RagnarLothbrok-Odin/trakt-discord-presence.git", + "author": "Ragnar Lothbrok ", + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=17.0.0" }, "scripts": { - "install": "yarn install", - "start": "node Trakt.js" + "start": "ts-node-esm index.ts" }, - "main": "Trakt.js", - "repository": "https://github.com/RagnarLothbrok-Odin/trakt-discord-presence.git", - "author": "Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com>", - "license": "MIT", + "type": "module", "dependencies": { - "chalk": "4.1.2", - "discord-rpc": "^4.0.1", - "enquirer": "^2.3.6", - "luxon": "^2.4.0", - "trakt.tv": "^8.1.1" + "@xhayper/discord-rpc\n": "^1.1.1", + "chalk": "5.3.0", + "enquirer": "^2.4.1", + "luxon": "^3.4.4", + "trakt.tv": "^8.2.0", + "ts-node": "^10.9.2" }, - "devDependencies": { - "eslint": "^8.5.0", - "eslint-config-tesseract": "^0.3.0" - } + "packageManager": "yarn@4.0.2" } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..cf62df4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + "module": "ESNext", /* Specify what module code is generated. */ + "rootDir": "src", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "./src", + "allowSyntheticDefaultImports": true, /* Specify a set of entries that re-map imports to additional lookup locations. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "strict": true, /* Enable all strict type-checking options. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["build", "node_modules"], +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..411389d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,605 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: 0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: c176a2c1e1b16be120c328300ea910df15fb9a5277010116d26818272341a11483c5a80059389d04edacf6fd2d03d4687ad3660870fdd1cc0b7109e160adb220 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.10.4 + resolution: "@types/node@npm:20.10.4" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 2c8b70cba731eb2ae3ae046daa74903bfcbb0e7b9196da767e5895054f6d252296ae7a04fb1dbbcb53bb004c4c658c05eaea2731bc9e2dd9e08f7e88d672f563 + languageName: node + linkType: hard + +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + +"@xhayper/discord-rpc\n@npm:^1.1.1": + version: 1.1.1 + resolution: "@xhayper/discord-rpc\n@npm:1.1.1::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2F%40xhayper%2Fdiscord-rpc%2F-%2Fdiscord-rpc-1.1.1.tgz" + dependencies: + axios: "npm:^1.6.2" + ws: "npm:^8.14.2" + checksum: 8d82f2e74b9be4f979c8632fed2453c3ac5f4d49f674fab44cb51500c46ed1c2effc8feca597408c750d672f261f8dd775393c2c4f96a0b80628e87148ba7097 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.3.1 + resolution: "acorn-walk@npm:8.3.1" + checksum: a23d2f7c6b6cad617f4c77f14dfeb062a239208d61753e9ba808d916c550add92b39535467d2e6028280761ac4f5a904cc9df21530b84d3f834e3edef74ddde5 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"axios@npm:^1.6.2": + version: 1.6.2 + resolution: "axios@npm:1.6.2" + dependencies: + follow-redirects: "npm:^1.15.0" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 9b77e030e85e4f9cbcba7bb52fbff67d6ce906c92d213e0bd932346a50140faf83733bf786f55bd58301bd92f9973885c7b87d6348023e10f7eaf286d0791a1d + languageName: node + linkType: hard + +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + +"chalk@npm:5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enquirer@npm:^2.4.1": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.0": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"got@npm:11.8.6": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.0.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"keyv@npm:^4.0.0": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"luxon@npm:^3.4.4": + version: 3.4.4 + resolution: "luxon@npm:3.4.4" + checksum: 02e26a0b039c11fd5b75e1d734c8f0332c95510f6a514a9a0991023e43fb233884da02d7f966823ffb230632a733fc86d4a4b1e63c3fbe00058b8ee0f8c728af + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"trakt-discord-presence@workspace:.": + version: 0.0.0-use.local + resolution: "trakt-discord-presence@workspace:." + dependencies: + "@xhayper/discord-rpc\n": "npm:^1.1.1" + chalk: "npm:5.3.0" + enquirer: "npm:^2.4.1" + luxon: "npm:^3.4.4" + trakt.tv: "npm:^8.2.0" + ts-node: "npm:^10.9.2" + languageName: unknown + linkType: soft + +"trakt.tv@npm:^8.2.0": + version: 8.2.0 + resolution: "trakt.tv@npm:8.2.0" + dependencies: + got: "npm:11.8.6" + checksum: 27d8b0f9f82c990cef9aed9d9a4e834f61db315fb0d0395cc4a2c14f79f4b8dc9e9df13d5fddbbc566b58f37f934113db26f75a98bbbbd7566b636aa93158276 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"ws@npm:^8.14.2": + version: 8.15.1 + resolution: "ws@npm:8.15.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 9964360dd5ab35c7376bd7c4295a3c8bd44ea0838c9413742548a6fb3ec371fc6c18552d5b8e76bdc21536db1909765612815bae072674b5ec69971605395a96 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard From 1ba7a7608bfa410e21cc0257514ec24ed14dc80b Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 16:41:11 +0000 Subject: [PATCH 02/25] misc --- .eslintrc.cjs | 37 + index.ts | 230 ----- package.json | 20 +- tsconfig.json | 6 +- yarn.lock | 2325 +++++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 2193 insertions(+), 425 deletions(-) create mode 100644 .eslintrc.cjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..efd7734 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,37 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, + plugins: ['@typescript-eslint'], + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', require.resolve("eslint-config-airbnb/base")], + rules: { + 'quotes': ['error', 'single'], + 'object-curly-spacing': ['error', 'always'], + 'import/prefer-default-export': 'off', + 'indent': ['error', 4], + 'no-console': 'off', + 'max-len': [ + 'error', + { + ignoreComments: true, + code: 150, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true + } + ], + 'class-methods-use-this': 'off', + 'no-inner-declarations': 'off', + 'import/extensions': 'off', + 'consistent-return': 'off', + 'import/no-unresolved': 'off', + 'no-nested-ternary': 'off', + 'no-unused-expressions': 'off', + 'max-classes-per-file': 'off', + 'no-use-before-define': 'off', + 'no-throw-literal': 'off' + }, +}; diff --git a/index.ts b/index.ts index 110e26b..e69de29 100644 --- a/index.ts +++ b/index.ts @@ -1,230 +0,0 @@ -const Trakt = require('trakt.tv'); -const DiscordRPC = require('discord-rpc'); -const fs = require('fs'); -const { prompt } = require('enquirer'); -const { DateTime } = require('luxon'); -const chalk = require('chalk'); - -// If the config file does not exist, run the questios() function, which will create the file and auth the account -if (!fs.existsSync('./config.json')) { - questions(); - return; -} - -// Fetching the data from config.json -const { clientId, clientSecret, oAuth, discordClientId } = require('./config.json'); - -// Checks if the oAuth has expired and runs tokenExpired() function if it has -if (Date.now() > oAuth.expires) { - tokenExpired(clientId, clientSecret); - return; -} - -// Trakt client options -const options = { - client_id: clientId, - client_secret: clientSecret -}; - -// Spawn new Trakt client with options -const trakt = new Trakt(options); -trakt.import_token(oAuth); - -// Create the Discord RPC client -// Create client - -// Set rpc as null -let rpc; -// We define the interval so we can clear it, incase the connection is lost -let statusInt; - -const spawnRPC = async () => { - try { - // Attempt to spawn an RPC Client - rpc = new DiscordRPC.Client({ transport: 'ipc' }); - - // Log when error is thrown - rpc.on('error', (err) => { - console.log(err); - }); - // Log when connected - await rpc.on('ready', () => { - console.log(chalk.green.bold('Successfully connected to Discord!')); - }); - // Attempt to log in - await rpc.login({ clientId: discordClientId }); - // Update status - updateStatus(); - - // Update status every 15 seconds - statusInt = setInterval(() => { - updateStatus(); - }, 15000); - } catch (err) { - console.log(chalk.red.bold('Failed to connect to Discord. Retrying in 15 seconds.')); - // Retry every 15 seconds until successful. - setTimeout(() => { - spawnRPC(); - }, 15000); - return; - } -}; - -// Spawn the RPC -spawnRPC(); - -// Get Trakt user -async function updateStatus() { - // If the RPC connection is valid - if (rpc) { - // Check if RPC is still connected - if (rpc.transport.socket.readyState !== 'open') { - // Reset the updateStatus() interval due to connection loss - clearInterval(statusInt); - // Destroy the existing client - rpc.destroy(); - // Set the RPC as null - rpc = null; - // Attempt to reconnect - spawnRPC(); - return; - } - - const user = await trakt.users.settings(); - const watching = await trakt.users.watching({ username: user.user.username }); - - if (watching) { - const type = {}; - - type.smallImageKey = 'play'; - type.largeImageKey = 'trakt'; - type.startTimestamp = new Date(watching.started_at); - - // Set the activity - if (watching.type === 'movie') { - const { movie } = watching; - type.details = `${movie.title} (${movie.year})`; - } else if (watching.type === 'episode') { - const { show, episode } = watching; - type.details = `${show.title}`; - type.state = `S${episode.season}E${episode.number} (${episode.title})`; - } - rpc.setActivity({ ...type }); - - console.log(`${formatDate()} | ${chalk.red.bold.underline('Trakt Playing:')} ${type.details}${type.state ? ` - ${type.state}` : ''}`); - } else { - // Check if the user is currently watching something and if not, run on a timeout. - console.log(`${formatDate()} | ${chalk.red.bold.underline('Trakt:')} Not Playing.`); - rpc.clearActivity(); - } - } -} - -// Function to ask the user for their Trakt credentials -async function questions() { - console.log(chalk.green.bold('Please follow the on-screen instructions on authorizing your account.\n**NOTE: Your credentials are private and should not be shared, your credentials will be stored in a file called `config.json`.\n')); - - const response = await prompt([ - { - type: 'input', - name: 'clientId', - message: 'What is your Trakt Client ID?' - }, - { - type: 'input', - name: 'clientSecret', - message: 'What is your Trakt Client Secret?' - }, - { - type: 'input', - name: 'discordClientId', - message: 'What is your Discord Client ID?' - } - ]).catch(() => { - console.error('The user aborted the request.'); - process.exit(1); - }); - - const qOptions = { - client_id: response.clientId, - client_secret: response.clientSecret - }; - - const qTrakt = new Trakt(qOptions); - - const traktAuthUrl = qTrakt.get_url(); - - const auth = await prompt([ - { - type: 'input', - name: 'oAuth', - message: `Please go to the follow link and then paste the code into the console:\n${traktAuthUrl}\n` - } - ]).catch(() => { - console.error('The user aborted the request.'); - process.exit(1); - }); - - const arr = {}; - arr.clientId = response.clientId; - arr.clientSecret = response.clientSecret; - arr.discordClientId = response.discordClientId; - - try { - await qTrakt.exchange_code(auth.oAuth, null); - const token = await qTrakt.export_token(); - arr.oAuth = token; - } catch { - console.log(chalk.red.bold('\nAn invalid token was provided! Please try again by restarting the program.')); - process.exit(1); - } - - await fs.writeFileSync('./config.json', JSON.stringify(arr, null, 3)); - - console.log(chalk.green.bold('\nPlease restart this program.')); - process.exit(1); -} - -// Function to manually re-auth Trakt -async function tokenExpired(id, secret) { - const rOptions = { - client_id: id, - client_secret: secret - }; - - const rTrakt = new Trakt(rOptions); - - const traktAuthUrl = rTrakt.get_url(); - - const reAuth = await prompt([ - { - type: 'input', - name: 'oAuth', - message: `Your Trakt token has expired, please regenerate one by going to the following link and pasting the code in the console:\n${traktAuthUrl}\n` - } - ]).catch(() => { - console.error('The user aborted the request.'); - process.exit(1); - }); - - try { - await rTrakt.exchange_code(reAuth.oAuth, null); - const token = await rTrakt.export_token(); - const config = require('./config'); - config.oAuth = token; - fs.writeFileSync('./config.json', JSON.stringify(config, null, 3)); - } catch { - console.log(chalk.red.bold('\nAn invalid token was provided! Please try again by restarting the program.')); - process.exit(1); - } - - console.log(chalk.green.bold('\nPlease restart this program.')); - process.exit(1); -} - -// Function to format the current date -function formatDate() { - const now = DateTime.now(); - - return chalk.green.italic(`${now.toLocaleString(DateTime.DATE_HUGE)} - ${now.toLocaleString(DateTime.TIME_WITH_SHORT_OFFSET)}`); -} diff --git a/package.json b/package.json index 5d730d6..9eee8c2 100644 --- a/package.json +++ b/package.json @@ -2,24 +2,34 @@ "name": "trakt-discord-presence", "description": "Set your Discord presence according to what you are watching on Trakt.tv", "version": "2.0.0", - "main": "index.ts", "repository": "https://github.com/RagnarLothbrok-Odin/trakt-discord-presence.git", "author": "Ragnar Lothbrok ", "license": "MIT", "engines": { - "node": ">=17.0.0" + "node": ">=16.0.0" }, "scripts": { - "start": "ts-node-esm index.ts" + "start": "node --no-warnings=ExperimentalWarning --loader ts-node/esm index.ts" }, "type": "module", "dependencies": { - "@xhayper/discord-rpc\n": "^1.1.1", + "@types/luxon": "^3.3.7", + "@xhayper/discord-rpc": "^1.1.1", + "better-trakt": "^0.9.1", "chalk": "5.3.0", "enquirer": "^2.4.1", "luxon": "^3.4.4", - "trakt.tv": "^8.2.0", "ts-node": "^10.9.2" }, + "devDependencies": { + "@types/node": "^20.10.4", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "eslint": "^8.56.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-formatter-table": "^7.32.1", + "eslint-plugin-import": "^2.29.1", + "typescript": "^5.3.3" + }, "packageManager": "yarn@4.0.2" } diff --git a/tsconfig.json b/tsconfig.json index cf62df4..e70f8ed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,17 +3,15 @@ "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ "module": "ESNext", /* Specify what module code is generated. */ - "rootDir": "src", /* Specify the root folder within your source files. */ + "rootDir": "./", /* Specify the root folder within your source files. */ "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - "baseUrl": "./src", + "baseUrl": "./", "allowSyntheticDefaultImports": true, /* Specify a set of entries that re-map imports to additional lookup locations. */ "resolveJsonModule": true, /* Enable importing .json files. */ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - "outDir": "./build", /* Specify an output folder for all emitted files. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ "strict": true, /* Enable all strict type-checking options. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "exclude": ["build", "node_modules"], } diff --git a/yarn.lock b/yarn.lock index 411389d..c4fc4cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 8 cacheKey: 10c0 +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: 53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -14,6 +21,73 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.1" + debug: "npm:^4.1.1" + minimatch: "npm:^3.0.5" + checksum: d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.1 resolution: "@jridgewell/resolve-uri@npm:3.1.1" @@ -38,19 +112,30 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - defer-to-connect: "npm:^2.0.0" - checksum: 73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 languageName: node linkType: hard @@ -82,35 +167,28 @@ __metadata: languageName: node linkType: hard -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "npm:*" - "@types/keyv": "npm:^3.1.4" - "@types/node": "npm:*" - "@types/responselike": "npm:^1.0.0" - checksum: 10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 +"@types/json-schema@npm:^7.0.12": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard -"@types/http-cache-semantics@npm:*": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac languageName: node linkType: hard -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "npm:*" - checksum: ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c +"@types/luxon@npm:^3.3.7": + version: 3.3.7 + resolution: "@types/luxon@npm:3.3.7" + checksum: ff6ba3fd83636c23c077fea7b2841ad5365ae22872a250baef2a99885123f0d5e997cfbc1ac0afccf89c70ff24b1517b2cc0ebadb2bee27559c670574620bed1 languageName: node linkType: hard -"@types/node@npm:*": +"@types/node@npm:^20.10.4": version: 20.10.4 resolution: "@types/node@npm:20.10.4" dependencies: @@ -119,22 +197,158 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/responselike@npm:1.0.3" +"@types/semver@npm:^7.5.0": + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: 196dc32db5f68cbcde2e6a42bb4aa5cbb100fa2b7bd9c8c82faaaf3e03fbe063e205dbb4f03c7cdf53da2edb70a0d34c9f2e601b54281b377eb8dc1743226acd + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.14.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/type-utils": "npm:6.14.0" + "@typescript-eslint/utils": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 6360efb0e142ed91de5e9bddcd041f769feeedd256332733be08f7a74c8ae637cbfb78c6b85d747c73231bbb95cef95ed2d2854ab7d43aebfbedb3a191f447f1 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/parser@npm:6.14.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/typescript-estree": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 0344f7f640374e7e5a5b50e9c90fbd161611b3f455132e541ef9116eef7bd3acf364db64bd38d4b6b4fe148414494620c9df660f8ddce036019c38ae8e146585 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/scope-manager@npm:6.14.0" + dependencies: + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" + checksum: 8c59a215af3d7d24d8d0b21c28a858263de471650829f288a941e0eb8af8a054798da5c7594b7f39370219718270c18464b5edb96f451457e5f080a33ba57c2c + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/type-utils@npm:6.14.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:6.14.0" + "@typescript-eslint/utils": "npm:6.14.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 836a6e84be5a245b07c76968c98e2f3bae064767dde720080fe8f33e226188510778dbca4199b7e42ef675ec3fd6d0ab522ec1c77d6e2a9b50e8e275fe7c72c9 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/types@npm:6.14.0" + checksum: d59306a7a441982a4dcee7d775928fd5086aba9331f7a238f915723a0dc785df0e43af562a30a7c2f1b056a1e49fd64863a8d2450d31706193add0ade87334a4 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.14.0" + dependencies: + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/visitor-keys": "npm:6.14.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 767c3309987b8ad053a2403605a9bd7c4eb3283dece864a741a7531a1c28eea4d85acaa4613141b64e194f9f6c4cbc5bc762c9b9f3a67c6202aa8cbb18b180d2 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/utils@npm:6.14.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.14.0" + "@typescript-eslint/types": "npm:6.14.0" + "@typescript-eslint/typescript-estree": "npm:6.14.0" + semver: "npm:^7.5.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 72689b2897b89e1bd1c71c1c2ae436d0ccfbcfffabf3be4378de74ad8138b2ecdbeeda7c1720e2f1754569e773f2fc7216f704335e1e56c38c7601ee1d190aeb + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.14.0": + version: 6.14.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.14.0" dependencies: - "@types/node": "npm:*" - checksum: a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + "@typescript-eslint/types": "npm:6.14.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 0e2363f9f1986ebdb41507c54a666fa1c336eb6beb383dc342a10844d3c42c89067b21c3f158851fa6f0825e1e451a5470b5454fde70a6fc33b4b0259462d954 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d languageName: node linkType: hard -"@xhayper/discord-rpc\n@npm:^1.1.1": +"@xhayper/discord-rpc@npm:^1.1.1": version: 1.1.1 - resolution: "@xhayper/discord-rpc\n@npm:1.1.1::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2F%40xhayper%2Fdiscord-rpc%2F-%2Fdiscord-rpc-1.1.1.tgz" + resolution: "@xhayper/discord-rpc@npm:1.1.1" dependencies: axios: "npm:^1.6.2" ws: "npm:^8.14.2" - checksum: 8d82f2e74b9be4f979c8632fed2453c3ac5f4d49f674fab44cb51500c46ed1c2effc8feca597408c750d672f261f8dd775393c2c4f96a0b80628e87148ba7097 + checksum: d53ec7a2e703c8beadcb3e4cf0f9abb1059b4b9e39f77f457693073ce723ca5916b2baef4a9fdab3f331fffe01753324357c9bf7f653d2f5c5bdc372f3bf134a + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 languageName: node linkType: hard @@ -145,7 +359,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1": +"acorn@npm:^8.4.1, acorn@npm:^8.9.0": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -154,6 +368,30 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + languageName: node + linkType: hard + "ansi-colors@npm:^4.1.1": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -168,6 +406,15 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -175,6 +422,102 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + is-array-buffer: "npm:^3.0.1" + checksum: 12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 + languageName: node + linkType: hard + +"array-includes@npm:^3.1.7": + version: 3.1.7 + resolution: "array-includes@npm:3.1.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-string: "npm:^1.0.7" + checksum: 692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.1" + checksum: 2c5c4d3f07512d6729f728f6260a314c00f2eb0a243123092661fa1bc65dce90234c3b483b5f978396eccef6f69c50f0bea248448aaf9cdfcd1cedad6217acbb + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flat@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: 67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-array-buffer: "npm:^3.0.2" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -182,7 +525,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.2": +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 + languageName: node + linkType: hard + +"axios@npm:^1.1.3, axios@npm:^1.6.2": version: 1.6.2 resolution: "axios@npm:1.6.2" dependencies: @@ -193,25 +543,56 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"better-trakt@npm:^0.9.1": + version: 0.9.1 + resolution: "better-trakt@npm:0.9.1" + dependencies: + axios: "npm:^1.1.3" + checksum: 7cdeaa5c861082e1694be788d65d35d2b267293bc1a63add8a267f9e7af6344cc961b72368e61cf78a664e370e5d9ae7477428ecdeaf69f211eac67d4b528982 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 languageName: node linkType: hard -"cacheable-request@npm:^7.0.2": - version: 7.0.4 - resolution: "cacheable-request@npm:7.0.4" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - clone-response: "npm:^1.0.2" - get-stream: "npm:^5.1.0" - http-cache-semantics: "npm:^4.0.0" - keyv: "npm:^4.0.0" - lowercase-keys: "npm:^2.0.0" - normalize-url: "npm:^6.0.1" - responselike: "npm:^2.0.0" - checksum: 0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.1" + set-function-length: "npm:^1.1.1" + checksum: a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 languageName: node linkType: hard @@ -222,12 +603,29 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" dependencies: - mimic-response: "npm:^1.0.0" - checksum: 06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + color-name: "npm:~1.1.4" + checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 languageName: node linkType: hard @@ -240,6 +638,20 @@ __metadata: languageName: node linkType: hard +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"confusing-browser-globals@npm:^1.0.10": + version: 1.0.11 + resolution: "confusing-browser-globals@npm:1.0.11" + checksum: 475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -247,19 +659,64 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" dependencies: - mimic-response: "npm:^3.1.0" - checksum: bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 languageName: node linkType: hard -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 languageName: node linkType: hard @@ -277,12 +734,37 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" dependencies: - once: "npm:^1.4.0" - checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + esutils: "npm:^2.0.2" + checksum: c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 languageName: node linkType: hard @@ -296,106 +778,958 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 +"es-abstract@npm:^1.22.1": + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + arraybuffer.prototype.slice: "npm:^1.0.2" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.5" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.2" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.12" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + safe-array-concat: "npm:^1.0.1" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.8" + string.prototype.trimend: "npm:^1.0.7" + string.prototype.trimstart: "npm:^1.0.7" + typed-array-buffer: "npm:^1.0.0" + typed-array-byte-length: "npm:^1.0.0" + typed-array-byte-offset: "npm:^1.0.0" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.13" + checksum: da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" + dependencies: + get-intrinsic: "npm:^1.2.2" + has-tostringtag: "npm:^1.0.0" + hasown: "npm:^2.0.0" + checksum: 176d6bd1be31dd0145dcceee62bb78d4a5db7f81db437615a18308a6f62bcffe45c15081278413455e8cf0aad4ea99079de66f8de389605942dfdacbad74c2d5 languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + hasown: "npm:^2.0.0" + checksum: f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" dependencies: - pump: "npm:^3.0.0" - checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 languageName: node linkType: hard -"got@npm:11.8.6": - version: 11.8.6 - resolution: "got@npm:11.8.6" +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-airbnb-base@npm:^15.0.0": + version: 15.0.0 + resolution: "eslint-config-airbnb-base@npm:15.0.0" dependencies: - "@sindresorhus/is": "npm:^4.0.0" - "@szmarczak/http-timer": "npm:^4.0.5" - "@types/cacheable-request": "npm:^6.0.1" - "@types/responselike": "npm:^1.0.0" - cacheable-lookup: "npm:^5.0.3" - cacheable-request: "npm:^7.0.2" - decompress-response: "npm:^6.0.0" - http2-wrapper: "npm:^1.0.0-beta.5.2" - lowercase-keys: "npm:^2.0.0" - p-cancelable: "npm:^2.0.0" - responselike: "npm:^2.0.0" - checksum: 754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + confusing-browser-globals: "npm:^1.0.10" + object.assign: "npm:^4.1.2" + object.entries: "npm:^1.1.5" + semver: "npm:^6.3.0" + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + checksum: 93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc +"eslint-config-airbnb@npm:^19.0.4": + version: 19.0.4 + resolution: "eslint-config-airbnb@npm:19.0.4" + dependencies: + eslint-config-airbnb-base: "npm:^15.0.0" + object.assign: "npm:^4.1.2" + object.entries: "npm:^1.1.5" + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + checksum: 867feeda45c4b480b1b8eff8fabc1bb107e837da8b48e5039e0c175ae6ad34af383b1924fc163bbfcef24a324e6651b1515e5bd12cbcbb19535a8838e2544a02 languageName: node linkType: hard -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" +"eslint-formatter-table@npm:^7.32.1": + version: 7.32.1 + resolution: "eslint-formatter-table@npm:7.32.1" dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.0.0" - checksum: 6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + chalk: "npm:^4.0.0" + table: "npm:^6.0.9" + checksum: f1d93eba886795fa6de4f4bf17367253e6e8cb8d8b9c357c4d741a36e5227dde14f1f74f3a12ffff031e0acf725217f0855a172cfa4e55da47744a0185a73acb languageName: node linkType: hard -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 languageName: node linkType: hard -"keyv@npm:^4.0.0": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" +"eslint-module-utils@npm:^2.8.0": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" dependencies: - json-buffer: "npm:3.0.1" - checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 +"eslint-plugin-import@npm:^2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" + dependencies: + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" + semver: "npm:^6.3.1" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 languageName: node linkType: hard -"luxon@npm:^3.4.4": - version: 3.4.4 - resolution: "luxon@npm:3.4.4" - checksum: 02e26a0b039c11fd5b75e1d734c8f0332c95510f6a514a9a0991023e43fb233884da02d7f966823ffb230632a733fc86d4a4b1e63c3fbe00058b8ee0f8c728af +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 languageName: node linkType: hard -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: 171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint@npm:^8.56.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.56.0" + "@humanwhocodes/config-array": "npm:^0.11.13" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: 5c91c5a0a21bbc0b07b272231e5b4efe6b822bcb4ad317caf6bb06984be4042a9e9045026307da0fdb4583f1f545e317a67ef1231a59e71f7fced3cc429cfc53 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.0": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" + dependencies: + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: "npm:^1.1.3" + checksum: 0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.2" + checksum: d62ba94b40150b00d621bc64a6aedb5bf0ee495308b4b7ed6bac856043db3cdfb1db553ae81cec91c9d2bd82057ff0e94145e7fa25d5aa5985ed32e0921927f6 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.5": + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" + dependencies: + get-intrinsic: "npm:^1.2.2" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: aa37cafc8ffbf513a340de58f40d5017b4949d99722d7e4f0e24b182455bdd258000d4bb1d7b4adcf9f8979b97049b99fe9defa9db8e18a78071d2637ac143fb + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + is-typed-array: "npm:^1.1.10" + checksum: 40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" + dependencies: + which-typed-array: "npm:^1.1.11" + checksum: 9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"luxon@npm:^3.4.4": + version: 3.4.4 + resolution: "luxon@npm:3.4.4" + checksum: 02e26a0b039c11fd5b75e1d734c8f0332c95510f6a514a9a0991023e43fb233884da02d7f966823ffb230632a733fc86d4a4b1e63c3fbe00058b8ee0f8c728af + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff languageName: node linkType: hard @@ -406,37 +1740,124 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - mime-db: "npm:1.52.0" - checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 languageName: node linkType: hard -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa +"object.entries@npm:^1.1.5": + version: 1.1.7 + resolution: "object.entries@npm:1.1.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 3ad1899cc7bf14546bf28f4a9b363ae8690b90948fcfbcac4c808395435d760f26193d9cae95337ce0e3c1e5c1f4fa45f7b46b31b68d389e9e117fce38775d86 languageName: node linkType: hard -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 +"object.fromentries@npm:^2.0.7": + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 071745c21f6fc9e6c914691f2532c1fb60ad967e5ddc52801d09958b5de926566299d07ae14466452a7efd29015f9145d6c09c573d93a0dc6f1683ee0ec2b93b + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.1": + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + checksum: 61e41fbf08cc04ed860363db9629eedeaa590fce243c0960e948fd7b11f78a9d4350065c339936d118a2dd8775d7259e26207340cc8ce688bec66cb615fec6fe languageName: node linkType: hard -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 +"object.values@npm:^1.1.7": + version: 1.1.7 + resolution: "object.values@npm:1.1.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: e869d6a37fb7afdd0054dea49036d6ccebb84854a8848a093bbd1bc516f53e690bba88f0bc3e83fdfa74c601469ee6989c9b13359cda9604144c6e732fad3b6b languageName: node linkType: hard -"once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -445,10 +1866,93 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + dependencies: + "@aashutoshrathi/word-wrap": "npm:^1.2.3" + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + checksum: 66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd languageName: node linkType: hard @@ -459,36 +1963,250 @@ __metadata: languageName: node linkType: hard -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + set-function-name: "npm:^2.0.0" + checksum: 1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 languageName: node linkType: hard -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 languageName: node linkType: hard -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve@npm:^1.22.4": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + is-regex: "npm:^1.1.4" + checksum: 14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 + languageName: node + linkType: hard + +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + languageName: node + linkType: hard + +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: "npm:^1.1.1" + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 languageName: node linkType: hard -"responselike@npm:^2.0.0": +"set-function-name@npm:^2.0.0": version: 2.0.1 - resolution: "responselike@npm:2.0.1" + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: "npm:^1.0.1" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.0" + checksum: 6be7d3e15be47f4db8a5a563a35c60b5e7c4af91cc900e8972ffad33d3aaa227900faa55f60121cdb04b85866a734bb7fe4cd91f654c632861cc86121a48312a + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" dependencies: - lowercase-keys: "npm:^2.0.0" - checksum: 360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + call-bind: "npm:^1.0.0" + get-intrinsic: "npm:^1.0.2" + object-inspect: "npm:^1.9.0" + checksum: 054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + +"string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f languageName: node linkType: hard @@ -501,25 +2219,93 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"table@npm:^6.0.9": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 591ed84b2438b01c9bc02248e2238e21e8bfb73654bc5acca0d469053eb39be3db2f57d600dcf08ac983b6f50f80842c44612c03877567c2afee3aec4a033e5f + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + "trakt-discord-presence@workspace:.": version: 0.0.0-use.local resolution: "trakt-discord-presence@workspace:." dependencies: - "@xhayper/discord-rpc\n": "npm:^1.1.1" + "@types/luxon": "npm:^3.3.7" + "@types/node": "npm:^20.10.4" + "@typescript-eslint/eslint-plugin": "npm:^6.14.0" + "@typescript-eslint/parser": "npm:^6.14.0" + "@xhayper/discord-rpc": "npm:^1.1.1" + better-trakt: "npm:^0.9.1" chalk: "npm:5.3.0" enquirer: "npm:^2.4.1" + eslint: "npm:^8.56.0" + eslint-config-airbnb: "npm:^19.0.4" + eslint-formatter-table: "npm:^7.32.1" + eslint-plugin-import: "npm:^2.29.1" luxon: "npm:^3.4.4" - trakt.tv: "npm:^8.2.0" ts-node: "npm:^10.9.2" + typescript: "npm:^5.3.3" languageName: unknown linkType: soft -"trakt.tv@npm:^8.2.0": - version: 8.2.0 - resolution: "trakt.tv@npm:8.2.0" - dependencies: - got: "npm:11.8.6" - checksum: 27d8b0f9f82c990cef9aed9d9a4e834f61db315fb0d0395cc4a2c14f79f4b8dc9e9df13d5fddbbc566b58f37f934113db26f75a98bbbbd7566b636aa93158276 +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 languageName: node linkType: hard @@ -561,6 +2347,113 @@ __metadata: languageName: node linkType: hard +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + is-typed-array: "npm:^1.1.10" + checksum: ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 + languageName: node + linkType: hard + +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -568,6 +2461,15 @@ __metadata: languageName: node linkType: hard +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -575,6 +2477,43 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.4" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: 9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -597,9 +2536,23 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" checksum: 0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 languageName: node linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From f51abf5b67a594c59e22ae7e62046812baebda52 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:37:13 +0000 Subject: [PATCH 03/25] =?UTF-8?q?=F0=9F=94=A7=20chore(.gitignore):=20add?= =?UTF-8?q?=20build/=20directory=20to=20ignore=20list=20to=20exclude=20bui?= =?UTF-8?q?ld=20output=20from=20version=20control?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 6708d2d..aa8482b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,13 @@ # macOS generated files .DS_Store +# ======================== +# Build output +# ======================== + +# Build directory +build/ + # ======================== # IDEs and editors # ======================== @@ -26,3 +33,4 @@ yarn-error.log # Config file # ======================== config.json + From 91c426dcc945e75c6669b92297d2aa97d5739d25 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:37:21 +0000 Subject: [PATCH 04/25] Update yarn.lock --- yarn.lock | 266 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 244 insertions(+), 22 deletions(-) diff --git a/yarn.lock b/yarn.lock index c4fc4cf..320230f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -139,6 +139,22 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.9 resolution: "@tsconfig/node10@npm:1.0.9" @@ -167,6 +183,25 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.12": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -181,6 +216,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + "@types/luxon@npm:^3.3.7": version: 3.3.7 resolution: "@types/luxon@npm:3.3.7" @@ -188,7 +232,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.10.4": +"@types/node@npm:*, @types/node@npm:^20.10.4": version: 20.10.4 resolution: "@types/node@npm:20.10.4" dependencies: @@ -197,6 +241,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0": version: 7.5.6 resolution: "@types/semver@npm:7.5.6" @@ -532,7 +585,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.1.3, axios@npm:^1.6.2": +"axios@npm:^1.6.2": version: 1.6.2 resolution: "axios@npm:1.6.2" dependencies: @@ -550,15 +603,6 @@ __metadata: languageName: node linkType: hard -"better-trakt@npm:^0.9.1": - version: 0.9.1 - resolution: "better-trakt@npm:0.9.1" - dependencies: - axios: "npm:^1.1.3" - checksum: 7cdeaa5c861082e1694be788d65d35d2b267293bc1a63add8a267f9e7af6344cc961b72368e61cf78a664e370e5d9ae7477428ecdeaf69f211eac67d4b528982 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -578,6 +622,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" @@ -596,13 +662,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 - languageName: node - linkType: hard - "chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -613,6 +672,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -629,6 +697,13 @@ __metadata: languageName: node linkType: hard +"colors@npm:^1.4.0": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 9af357c019da3c5a098a301cf64e3799d27549d8f185d86f79af23069e4f4303110d115da98483519331f6fb71c8568d5688fa1c6523600044fd4a54e97c4efb + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -691,6 +766,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -698,6 +782,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": version: 1.1.1 resolution: "define-data-property@npm:1.1.1" @@ -768,6 +859,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + "enquirer@npm:^2.4.1": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -1227,6 +1327,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -1310,6 +1419,25 @@ __metadata: languageName: node linkType: hard +"got@npm:11.8.6": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -1372,6 +1500,23 @@ __metadata: languageName: node linkType: hard +"http-cache-semantics@npm:^4.0.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + "ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.0 resolution: "ignore@npm:5.3.0" @@ -1651,7 +1796,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.0.0, keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -1693,6 +1838,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -1749,6 +1901,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -1786,6 +1952,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + "object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" @@ -1857,7 +2030,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -1880,6 +2053,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -1963,6 +2143,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -1977,6 +2167,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.1": version: 1.5.1 resolution: "regexp.prototype.flags@npm:1.5.1" @@ -1995,6 +2192,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -2028,6 +2232,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -2287,19 +2500,28 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^6.14.0" "@typescript-eslint/parser": "npm:^6.14.0" "@xhayper/discord-rpc": "npm:^1.1.1" - better-trakt: "npm:^0.9.1" - chalk: "npm:5.3.0" + colors: "npm:^1.4.0" enquirer: "npm:^2.4.1" eslint: "npm:^8.56.0" eslint-config-airbnb: "npm:^19.0.4" eslint-formatter-table: "npm:^7.32.1" eslint-plugin-import: "npm:^2.29.1" luxon: "npm:^3.4.4" + trakt.tv: "npm:^8.2.0" ts-node: "npm:^10.9.2" typescript: "npm:^5.3.3" languageName: unknown linkType: soft +"trakt.tv@npm:^8.2.0": + version: 8.2.0 + resolution: "trakt.tv@npm:8.2.0" + dependencies: + got: "npm:11.8.6" + checksum: 27d8b0f9f82c990cef9aed9d9a4e834f61db315fb0d0395cc4a2c14f79f4b8dc9e9df13d5fddbbc566b58f37f934113db26f75a98bbbbd7566b636aa93158276 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" From 71a09fafb091bfdba68622b5cb4d10f4be83daaa Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:37:54 +0000 Subject: [PATCH 05/25] =?UTF-8?q?=F0=9F=94=A7=20chore(tsconfig.json):=20up?= =?UTF-8?q?date=20rootDir=20to=20"src"=20to=20specify=20the=20root=20folde?= =?UTF-8?q?r=20within=20the=20source=20files=20=F0=9F=94=A7=20chore(tsconf?= =?UTF-8?q?ig.json):=20update=20baseUrl=20to=20"./src"=20to=20specify=20ad?= =?UTF-8?q?ditional=20lookup=20locations=20for=20imports=20=F0=9F=94=A7=20?= =?UTF-8?q?chore(tsconfig.json):=20add=20outDir=20to=20"./build"=20to=20sp?= =?UTF-8?q?ecify=20an=20output=20folder=20for=20all=20emitted=20files=20?= =?UTF-8?q?=F0=9F=94=A7=20chore(tsconfig.json):=20add=20exclude=20to=20["b?= =?UTF-8?q?uild"]=20to=20exclude=20the=20build=20folder=20from=20type=20ch?= =?UTF-8?q?ecking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index e70f8ed..7156750 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,15 +3,17 @@ "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ "module": "ESNext", /* Specify what module code is generated. */ - "rootDir": "./", /* Specify the root folder within your source files. */ + "rootDir": "src", /* Specify the root folder within your source files. */ "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - "baseUrl": "./", + "baseUrl": "./src", "allowSyntheticDefaultImports": true, /* Specify a set of entries that re-map imports to additional lookup locations. */ "resolveJsonModule": true, /* Enable importing .json files. */ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ "strict": true, /* Enable all strict type-checking options. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, + "exclude": ["build"], } From 7869dd59f1a2c70a0779abf5e3771990ebc89af5 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:38:47 +0000 Subject: [PATCH 06/25] =?UTF-8?q?=F0=9F=94=A5=20chore(index.ts):=20moved?= =?UTF-8?q?=20file=20location=20to=20src/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.ts | 0 src/index.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) delete mode 100644 index.ts create mode 100644 src/index.ts diff --git a/index.ts b/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b3e1906 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,44 @@ +import 'colors'; +import { existsSync } from 'fs'; +import Enquirer from 'enquirer'; + +// Extract repetitive structure into a separate function +function generatePromptConfig(name: string, message: string) { + return { + type: 'input', + name, + message, + }; +} + +async function generateTraktCredentials(): Promise { + const { prompt } = Enquirer; + + console.log( + `Please follow the on-screen instructions to authorize your account.\n${ + '**IMPORTANT: Treat your credentials with utmost privacy; avoid sharing them. They will be stored in a file named `config.json`.\n'.red.italic + }`, + ); + + // Utilize the newly defined function to create prompt config + return prompt([ + generatePromptConfig('clientId', 'Please provide your Trakt Client ID:'), + generatePromptConfig('clientSecret', 'Please provide your Trakt Client Secret:'), + generatePromptConfig('discordClientId', 'Please provide your Discord Client ID:'), + ]); +} + +async function main() { + try { + // Execute the function to generate configuration if it doesn't already exist + if (!existsSync('./config.json')) { + await generateTraktCredentials(); + } + } catch (error) { + console.error(`\nAn error occurred: ${error}`.red); + process.exitCode = 1; + } +} + +// Execute the main function +main(); From 307f3f78cd223f68cfdd43e5b4c4e254e49dfacf Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:38:53 +0000 Subject: [PATCH 07/25] Update package.json --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 9eee8c2..716391b 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,16 @@ "node": ">=16.0.0" }, "scripts": { - "start": "node --no-warnings=ExperimentalWarning --loader ts-node/esm index.ts" + "start": "tsc && node build/index.js" }, "type": "module", "dependencies": { "@types/luxon": "^3.3.7", "@xhayper/discord-rpc": "^1.1.1", - "better-trakt": "^0.9.1", - "chalk": "5.3.0", + "colors": "^1.4.0", "enquirer": "^2.4.1", "luxon": "^3.4.4", + "trakt.tv": "^8.2.0", "ts-node": "^10.9.2" }, "devDependencies": { From b57a4bdf0aa2c1439a76840cb1b914368a5aa5fe Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 15:36:53 +0000 Subject: [PATCH 08/25] =?UTF-8?q?=E2=9C=A8=20feat(index.ts):=20add=20autho?= =?UTF-8?q?riseTrakt=20function=20to=20handle=20Trakt=20authentication=20a?= =?UTF-8?q?nd=20authorization=20process=20by=20exchanging=20code=20for=20t?= =?UTF-8?q?oken=20and=20storing=20the=20token=20in=20the=20config.json=20f?= =?UTF-8?q?ile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index b3e1906..ceea04c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,17 @@ import 'colors'; -import { existsSync } from 'fs'; +import { existsSync, writeFileSync } from 'fs'; import Enquirer from 'enquirer'; +// @ts-ignore +import Trakt from 'trakt.tv'; + +const { prompt } = Enquirer; + +interface TraktCredentials { + clientId: string; + clientSecret: string; + discordClientId: string; + oAuth?: string; +} // Extract repetitive structure into a separate function function generatePromptConfig(name: string, message: string) { @@ -11,32 +22,65 @@ function generatePromptConfig(name: string, message: string) { }; } -async function generateTraktCredentials(): Promise { - const { prompt } = Enquirer; - +async function generateTraktCredentials(): Promise { console.log( - `Please follow the on-screen instructions to authorize your account.\n${ - '**IMPORTANT: Treat your credentials with utmost privacy; avoid sharing them. They will be stored in a file named `config.json`.\n'.red.italic + `Kindly adhere to the instructions displayed on the screen to authenticate your account.\n${ + '**CRUCIAL: Handle your login credentials with the highest level of privacy and avoid disclosing them. They will be stored in a `config.json` file.\n'.red.italic }`, ); // Utilize the newly defined function to create prompt config - return prompt([ + return prompt([ generatePromptConfig('clientId', 'Please provide your Trakt Client ID:'), generatePromptConfig('clientSecret', 'Please provide your Trakt Client Secret:'), generatePromptConfig('discordClientId', 'Please provide your Discord Client ID:'), ]); } +async function authoriseTrakt(gen: TraktCredentials) { + const qOptions = { + client_id: gen.clientId, + client_secret: gen.clientSecret, + }; + + const qTrakt = new Trakt(qOptions); + + const traktAuthUrl = qTrakt.get_url(); + + const auth = await prompt([ + generatePromptConfig('oAuth', `Please visit the following link and subsequently, paste the received code into the console:\n${traktAuthUrl}\n`), + ]); + + const arr: TraktCredentials = { + clientId: gen.clientId, + clientSecret: gen.clientSecret, + discordClientId: gen.discordClientId, + }; + + try { + await qTrakt.exchange_code(auth.oAuth, null); + const token = await qTrakt.export_token(); + arr.oAuth = token; + } catch { + console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red); process.exit(1); + } + + writeFileSync('./config.json', JSON.stringify(arr, null, 3)); + + console.log('\nPlease restart this program.'.green); + process.exit(1); +} + async function main() { try { // Execute the function to generate configuration if it doesn't already exist if (!existsSync('./config.json')) { - await generateTraktCredentials(); + const gen = await generateTraktCredentials(); + if (gen) await authoriseTrakt(gen); } } catch (error) { console.error(`\nAn error occurred: ${error}`.red); - process.exitCode = 1; + process.exit(1); } } From 8b4db6d9f78a7c145f07b2102cdf8a178143b0b4 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:06:54 +0000 Subject: [PATCH 09/25] =?UTF-8?q?=E2=9C=A8=20feat(index.ts):=20this=20is?= =?UTF-8?q?=20now=20functional...=20read=20description!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My first goal for rewriting this in Typescript, was to just convert my existing code to Typescript... This is now done, now I plan to rewrite a large portion of it, to improve maintainability, readability, and efficiency --- src/index.ts | 110 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index ceea04c..2d7f96e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,10 @@ import 'colors'; -import { existsSync, writeFileSync } from 'fs'; +import { existsSync, readFileSync, writeFileSync } from 'fs'; import Enquirer from 'enquirer'; // @ts-ignore import Trakt from 'trakt.tv'; +import { Client } from 'discord-rpc'; +import { DateTime } from 'luxon'; const { prompt } = Enquirer; @@ -13,7 +15,106 @@ interface TraktCredentials { oAuth?: string; } -// Extract repetitive structure into a separate function +interface TraktContent { + smallImageKey: string; + largeImageKey: string; + startTimestamp: Date; + details?: string; + state?: string +} + +async function fetchTraktCredentials(): Promise { + const configData = readFileSync('./config.json', 'utf8'); + return JSON.parse(configData); +} + +let rpc: Client | null; +// eslint-disable-next-line no-undef +let statusInt: string | number | NodeJS.Timeout | undefined; + +const spawnRPC = async (trakt: Trakt) => { + try { + console.log(trakt); + const traktCredentials = await fetchTraktCredentials(); + rpc = new Client({ transport: 'ipc' }); + + rpc.on('error', (err) => { + console.log(err); + }); + rpc.on('ready', () => { + console.log('Successfully connected to Discord!'.green); + }); + await rpc.login({ clientId: traktCredentials.discordClientId }); + await updateStatus(trakt); + + statusInt = setInterval(() => { + updateStatus(trakt); + }, 15000); + } catch (err) { + console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red); + setTimeout(() => { + spawnRPC(trakt); + }, 15000); + } +}; + +async function createTrakt() { + const traktCredentials = await fetchTraktCredentials(); + const trakt = new Trakt({ + client_id: traktCredentials.clientId, + client_secret: traktCredentials.clientSecret, + }); + trakt.import_token(traktCredentials.oAuth); + return trakt; +} + +async function updateStatus(trakt: Trakt) { + if (rpc) { + // @ts-ignore + if (rpc.transport.socket.readyState !== 'open') { + clearInterval(statusInt); + await rpc.destroy(); + rpc = null; + await spawnRPC(trakt); + return; + } + + const user = await trakt.users.settings(); + const watching = await trakt.users.watching({ username: user.user.username }); + + if (watching) { + const type: TraktContent = { + smallImageKey: 'play', + largeImageKey: 'trakt', + startTimestamp: new Date(watching.started_at), + }; + + // Set the activity + if (watching.type === 'movie') { + const { movie } = watching; + type.details = `${movie.title} (${movie.year})`; + } else if (watching.type === 'episode') { + const { show, episode } = watching; + type.details = `${show.title}`; + type.state = `S${episode.season}E${episode.number} (${episode.title})`; + } + await rpc.setActivity({ ...type }); + + console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`); + } else { + // Check if the user is currently watching something and if not, run on a timeout. + console.log(`${formatDate()} | ${'Trakt:'.red.underline} Not Playing.`); + await rpc.clearActivity(); + } + } +} + +function formatDate() { + const now = DateTime.now(); + + return `${now.toLocaleString(DateTime.DATE_HUGE)} - ${now.toLocaleString(DateTime.TIME_WITH_SHORT_OFFSET)}`.green.italic; +} + function generatePromptConfig(name: string, message: string) { return { type: 'input', @@ -29,7 +130,6 @@ async function generateTraktCredentials(): Promise { }`, ); - // Utilize the newly defined function to create prompt config return prompt([ generatePromptConfig('clientId', 'Please provide your Trakt Client ID:'), generatePromptConfig('clientSecret', 'Please provide your Trakt Client Secret:'), @@ -73,16 +173,16 @@ async function authoriseTrakt(gen: TraktCredentials) { async function main() { try { - // Execute the function to generate configuration if it doesn't already exist if (!existsSync('./config.json')) { const gen = await generateTraktCredentials(); if (gen) await authoriseTrakt(gen); } + const trakt = await createTrakt(); + await spawnRPC(trakt); } catch (error) { console.error(`\nAn error occurred: ${error}`.red); process.exit(1); } } -// Execute the main function main(); From 77ae675ada04ddf9a6b6c6fa465aeae1098dcced Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:07:11 +0000 Subject: [PATCH 10/25] =?UTF-8?q?=F0=9F=94=A5=20chore(index.ts):=20update?= =?UTF-8?q?=20packages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- yarn.lock | 849 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 752 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index 716391b..3ca0e19 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,15 @@ "type": "module", "dependencies": { "@types/luxon": "^3.3.7", - "@xhayper/discord-rpc": "^1.1.1", "colors": "^1.4.0", + "discord-rpc": "^4.0.1", "enquirer": "^2.4.1", "luxon": "^3.4.4", "trakt.tv": "^8.2.0", "ts-node": "^10.9.2" }, "devDependencies": { + "@types/discord-rpc": "^4", "@types/node": "^20.10.4", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^6.14.0", diff --git a/yarn.lock b/yarn.lock index 320230f..f36e6bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,6 +88,20 @@ __metadata: languageName: node linkType: hard +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.1 resolution: "@jridgewell/resolve-uri@npm:3.1.1" @@ -139,6 +153,35 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -195,6 +238,22 @@ __metadata: languageName: node linkType: hard +"@types/discord-rpc@npm:^4": + version: 4.0.8 + resolution: "@types/discord-rpc@npm:4.0.8" + dependencies: + "@types/events": "npm:*" + checksum: 134e3dcc972bd92dbe3037c01efd4e010bfd7bdb890b4a5871fc928ef2b38ab8eca661f392195c348638319fedb40f6c5f87d8bea850cca60312ec1fa0a68dc2 + languageName: node + linkType: hard + +"@types/events@npm:*": + version: 3.0.3 + resolution: "@types/events@npm:3.0.3" + checksum: 3a56f8c51eb4ebc0d05dcadca0c6636c816acc10216ce36c976fad11e54a01f4bb979a07211355686015884753b37f17d74bfdc7aaf4ebb027c1e8a501c7b21d + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" @@ -386,13 +445,10 @@ __metadata: languageName: node linkType: hard -"@xhayper/discord-rpc@npm:^1.1.1": - version: 1.1.1 - resolution: "@xhayper/discord-rpc@npm:1.1.1" - dependencies: - axios: "npm:^1.6.2" - ws: "npm:^8.14.2" - checksum: d53ec7a2e703c8beadcb3e4cf0f9abb1059b4b9e39f77f457693073ce723ca5916b2baef4a9fdab3f331fffe01753324357c9bf7f653d2f5c5bdc372f3bf134a +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 languageName: node linkType: hard @@ -421,6 +477,25 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + "ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -459,6 +534,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -468,6 +550,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -571,13 +660,6 @@ __metadata: languageName: node linkType: hard -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -585,17 +667,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.2": - version: 1.6.2 - resolution: "axios@npm:1.6.2" - dependencies: - follow-redirects: "npm:^1.15.0" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 9b77e030e85e4f9cbcba7bb52fbff67d6ce906c92d213e0bd932346a50140faf83733bf786f55bd58301bd92f9973885c7b87d6348023e10f7eaf286d0791a1d - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -603,6 +674,15 @@ __metadata: languageName: node linkType: hard +"bindings@npm:^1.3.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -613,6 +693,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + "braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" @@ -622,6 +711,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^18.0.0": + version: 18.0.1 + resolution: "cacache@npm:18.0.1" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: a31666805a80a8b16ad3f85faf66750275a9175a3480896f4f6d31b5d53ef190484fabd71bdb6d2ea5603c717fbef09f4af03d6a65b525c8ef0afaa44c361866 + languageName: node + linkType: hard + "cacheable-lookup@npm:^5.0.3": version: 5.0.4 resolution: "cacheable-lookup@npm:5.0.4" @@ -672,6 +781,20 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + "clone-response@npm:^1.0.2": version: 1.0.3 resolution: "clone-response@npm:1.0.3" @@ -704,15 +827,6 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -734,7 +848,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -745,16 +859,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -766,6 +871,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -811,13 +925,6 @@ __metadata: languageName: node linkType: hard -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -834,6 +941,20 @@ __metadata: languageName: node linkType: hard +"discord-rpc@npm:^4.0.1": + version: 4.0.1 + resolution: "discord-rpc@npm:4.0.1" + dependencies: + node-fetch: "npm:^2.6.1" + register-scheme: "github:devsnek/node-register-scheme" + ws: "npm:^7.3.1" + dependenciesMeta: + register-scheme: + optional: true + checksum: 9a055efcbd252b5ba91cbfc2c1a0130eba75e389c2b7ede5b0db2d7c7499b36d1a36c3503dad50370df184cfabd7e4e5c4689a7e043222fc4baf37a020fa3957 + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -852,6 +973,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -859,6 +987,22 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + "end-of-stream@npm:^1.1.0": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" @@ -878,6 +1022,20 @@ __metadata: languageName: node linkType: hard +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + "es-abstract@npm:^1.22.1": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" @@ -1163,6 +1321,13 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -1215,6 +1380,13 @@ __metadata: languageName: node linkType: hard +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -1252,16 +1424,6 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 - languageName: node - linkType: hard - "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -1271,14 +1433,31 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 languageName: node linkType: hard @@ -1364,6 +1543,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + "glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -1438,6 +1632,13 @@ __metadata: languageName: node linkType: hard +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -1500,13 +1701,23 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc languageName: node linkType: hard +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + languageName: node + linkType: hard + "http2-wrapper@npm:^1.0.0-beta.5.2": version: 1.0.3 resolution: "http2-wrapper@npm:1.0.3" @@ -1517,6 +1728,25 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + "ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.0 resolution: "ignore@npm:5.3.0" @@ -1541,6 +1771,13 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -1569,6 +1806,13 @@ __metadata: languageName: node linkType: hard +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: 8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 + languageName: node + linkType: hard + "is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": version: 3.0.2 resolution: "is-array-buffer@npm:3.0.2" @@ -1647,6 +1891,13 @@ __metadata: languageName: node linkType: hard +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -1746,6 +1997,26 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -1845,6 +2116,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 778bc8b2626daccd75f24c4b4d10632496e21ba064b126f526c626fbdbc5b28c472013fccd45d7646b9e1ef052444824854aed617b59cd570d01a8b7d651fc1e + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -1868,6 +2146,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + "merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -1885,22 +2182,6 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -1924,6 +2205,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -1931,6 +2221,99 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -1952,6 +2335,67 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-addon-api@npm:^1.3.0": + version: 1.7.2 + resolution: "node-addon-api@npm:1.7.2" + dependencies: + node-gyp: "npm:latest" + checksum: bcf526f2ce788182730d3c3df5206585873d1e837a6e1378ff84abccf2f19cf3f93a8274f9c1245af0de63a0dbd1bb95ca2f767ecf5c678d6930326aaf396c4e + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + "normalize-url@npm:^6.0.1": version: 6.1.0 resolution: "normalize-url@npm:6.1.0" @@ -2078,6 +2522,15 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -2115,6 +2568,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -2136,10 +2599,20 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 languageName: node linkType: hard @@ -2185,6 +2658,16 @@ __metadata: languageName: node linkType: hard +"register-scheme@github:devsnek/node-register-scheme": + version: 0.0.2 + resolution: "register-scheme@https://github.com/devsnek/node-register-scheme.git#commit=e7cc9a63a1f512565da44cb57316d9fb10750e17" + dependencies: + bindings: "npm:^1.3.0" + node-addon-api: "npm:^1.3.0" + checksum: a73a5ea3f07fc9a916329b7c304ee891eff7bd3e24d2f00be3e775743423c47a1281de12874308f39fa05ebefee825c99467f465817872f4e09d35634fc50104 + languageName: node + linkType: hard + "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" @@ -2241,6 +2724,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -2291,6 +2781,13 @@ __metadata: languageName: node linkType: hard +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + "semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -2300,7 +2797,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.4": +"semver@npm:^7.3.5, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -2361,6 +2858,13 @@ __metadata: languageName: node linkType: hard +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -2379,7 +2883,44 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^4.2.3": +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: 43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -2390,6 +2931,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" @@ -2423,7 +2975,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -2432,6 +2984,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -2475,6 +3036,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -2491,16 +3066,24 @@ __metadata: languageName: node linkType: hard +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + "trakt-discord-presence@workspace:.": version: 0.0.0-use.local resolution: "trakt-discord-presence@workspace:." dependencies: + "@types/discord-rpc": "npm:^4" "@types/luxon": "npm:^3.3.7" "@types/node": "npm:^20.10.4" "@typescript-eslint/eslint-plugin": "npm:^6.14.0" "@typescript-eslint/parser": "npm:^6.14.0" - "@xhayper/discord-rpc": "npm:^1.1.1" colors: "npm:^1.4.0" + discord-rpc: "npm:^4.0.1" enquirer: "npm:^2.4.1" eslint: "npm:^8.56.0" eslint-config-airbnb: "npm:^19.0.4" @@ -2683,6 +3266,24 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -2699,6 +3300,23 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -2736,6 +3354,39 @@ __metadata: languageName: node linkType: hard +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -2743,18 +3394,18 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.14.2": - version: 8.15.1 - resolution: "ws@npm:8.15.1" +"ws@npm:^7.3.1": + version: 7.5.9 + resolution: "ws@npm:7.5.9" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 9964360dd5ab35c7376bd7c4295a3c8bd44ea0838c9413742548a6fb3ec371fc6c18552d5b8e76bdc21536db1909765612815bae072674b5ec69971605395a96 + checksum: aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 languageName: node linkType: hard From 1ddac097c95b9fd3e92294fbe187d00634b8484f Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:34:14 +0000 Subject: [PATCH 11/25] =?UTF-8?q?=E2=9C=A8=20feat(index.ts):=20refactor=20?= =?UTF-8?q?code=20to=20use=20classes=20for=20DiscordRPC=20and=20TraktInsta?= =?UTF-8?q?nce=20to=20improve=20code=20organization=20and=20reusability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is rough, some comments blocking errors, the reason I am including this, is so you can see my progress :) --- src/index.ts | 173 +++++++++++++++++++++++++++------------------------ 1 file changed, 92 insertions(+), 81 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2d7f96e..1ee053c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,8 @@ -import 'colors'; import { existsSync, readFileSync, writeFileSync } from 'fs'; +import 'colors'; import Enquirer from 'enquirer'; -// @ts-ignore +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-expect-error import Trakt from 'trakt.tv'; import { Client } from 'discord-rpc'; import { DateTime } from 'luxon'; @@ -23,92 +24,97 @@ interface TraktContent { state?: string } -async function fetchTraktCredentials(): Promise { - const configData = readFileSync('./config.json', 'utf8'); - return JSON.parse(configData); -} +class DiscordRPC { + rpc: Client | null; -let rpc: Client | null; -// eslint-disable-next-line no-undef -let statusInt: string | number | NodeJS.Timeout | undefined; + statusInt: NodeJS.Timeout | undefined; -const spawnRPC = async (trakt: Trakt) => { - try { - console.log(trakt); - const traktCredentials = await fetchTraktCredentials(); - rpc = new Client({ transport: 'ipc' }); + constructor() { + this.rpc = null; + } - rpc.on('error', (err) => { - console.log(err); - }); - rpc.on('ready', () => { - console.log('Successfully connected to Discord!'.green); - }); - await rpc.login({ clientId: traktCredentials.discordClientId }); - await updateStatus(trakt); - - statusInt = setInterval(() => { - updateStatus(trakt); - }, 15000); - } catch (err) { - console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red); - setTimeout(() => { - spawnRPC(trakt); - }, 15000); + async spawnRPC(trakt: TraktInstance) { + try { + const traktCredentials = await fetchTraktCredentials(); + this.rpc = new Client({ transport: 'ipc' }); + this.rpc.on('ready', () => { + console.log('Successfully connected to Discord!'.green); + }); + await this.rpc.login({ clientId: traktCredentials.discordClientId }); + await trakt.updateStatus(this.rpc, this.statusInt); + this.statusInt = setInterval(async () => { + await trakt.updateStatus(this.rpc, this.statusInt); + }, 15000); + } catch { + console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red); + setTimeout(() => { + this.spawnRPC(trakt); + }, 15000); + } } -}; - -async function createTrakt() { - const traktCredentials = await fetchTraktCredentials(); - const trakt = new Trakt({ - client_id: traktCredentials.clientId, - client_secret: traktCredentials.clientSecret, - }); - trakt.import_token(traktCredentials.oAuth); - return trakt; } -async function updateStatus(trakt: Trakt) { - if (rpc) { - // @ts-ignore - if (rpc.transport.socket.readyState !== 'open') { - clearInterval(statusInt); - await rpc.destroy(); - rpc = null; - await spawnRPC(trakt); - return; - } +class TraktInstance { + trakt: Trakt; - const user = await trakt.users.settings(); - const watching = await trakt.users.watching({ username: user.user.username }); - - if (watching) { - const type: TraktContent = { - smallImageKey: 'play', - largeImageKey: 'trakt', - startTimestamp: new Date(watching.started_at), - }; - - // Set the activity - if (watching.type === 'movie') { - const { movie } = watching; - type.details = `${movie.title} (${movie.year})`; - } else if (watching.type === 'episode') { - const { show, episode } = watching; - type.details = `${show.title}`; - type.state = `S${episode.season}E${episode.number} (${episode.title})`; + async createTrakt() { + const traktCredentials = await fetchTraktCredentials(); + this.trakt = new Trakt({ + client_id: traktCredentials.clientId, + client_secret: traktCredentials.clientSecret, + }); + this.trakt.import_token(traktCredentials.oAuth); + return this.trakt; + } + + // eslint-disable-next-line no-undef + async updateStatus(rpc: Client | null, statusInt: string | number | NodeJS.Timeout | undefined) { + if (rpc) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + if (rpc.transport.socket.readyState !== 'open') { + if (statusInt) clearInterval(statusInt); + await rpc.destroy(); + // eslint-disable-next-line no-param-reassign + rpc = null; + await new DiscordRPC().spawnRPC(this); + return; } - await rpc.setActivity({ ...type }); - console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`); - } else { - // Check if the user is currently watching something and if not, run on a timeout. - console.log(`${formatDate()} | ${'Trakt:'.red.underline} Not Playing.`); - await rpc.clearActivity(); + const user = await this.trakt.users.settings(); + const watching = await this.trakt.users.watching({ username: user.user.username }); + + if (watching) { + const type: TraktContent = { + smallImageKey: 'play', + largeImageKey: 'trakt', + startTimestamp: new Date(watching.started_at), + }; + + if (watching.type === 'movie') { + const { movie } = watching; + type.details = `${movie.title} (${movie.year})`; + } else if (watching.type === 'episode') { + const { show, episode } = watching; + type.details = `${show.title}`; + type.state = `S${episode.season}E${episode.number} (${episode.title})`; + } + await rpc.setActivity({ ...type }); + + console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`); + } else { + console.log(`${formatDate()} | ${'Trakt:'.red.underline} Not Playing.`); + await rpc.clearActivity(); + } } } } +async function fetchTraktCredentials(): Promise { + const configData = readFileSync('./config.json', 'utf8'); + return JSON.parse(configData); +} + function formatDate() { const now = DateTime.now(); @@ -171,18 +177,23 @@ async function authoriseTrakt(gen: TraktCredentials) { process.exit(1); } +async function initializeTraktAndDiscordRPC() { + const traktInstance = new TraktInstance(); + await traktInstance.createTrakt(); + const discordRPC = new DiscordRPC(); + await discordRPC.spawnRPC(traktInstance); +} + async function main() { try { if (!existsSync('./config.json')) { - const gen = await generateTraktCredentials(); - if (gen) await authoriseTrakt(gen); + const generatedCredentials = await generateTraktCredentials(); + if (generatedCredentials) await authoriseTrakt(generatedCredentials); } - const trakt = await createTrakt(); - await spawnRPC(trakt); + await initializeTraktAndDiscordRPC(); } catch (error) { console.error(`\nAn error occurred: ${error}`.red); process.exit(1); } } - -main(); +await main(); From 35559e517f69db2bc68b4e33ab0ccb8a71aa3686 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 17:36:21 +0000 Subject: [PATCH 12/25] =?UTF-8?q?=E2=9C=A8=20feat(index.ts):=20add=20compr?= =?UTF-8?q?ehensive=20comments=20and=20TSDoc=20annotations=20to=20improve?= =?UTF-8?q?=20code=20readability=20and=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 212 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 183 insertions(+), 29 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1ee053c..2bc4fce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,7 @@ import { existsSync, readFileSync, writeFileSync } from 'fs'; import 'colors'; import Enquirer from 'enquirer'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-expect-error +// @ts-expect-error [currently, no types are present in trakt.tv, so this will cause an error] import Trakt from 'trakt.tv'; import { Client } from 'discord-rpc'; import { DateTime } from 'luxon'; @@ -24,26 +23,48 @@ interface TraktContent { state?: string } -class DiscordRPC { - rpc: Client | null; - - statusInt: NodeJS.Timeout | undefined; +/** + * This variable can be either an instance of the `Client` from 'discord-rpc' or null. + * It is used to control the Discord Rich Presence client. + * + * @example + * ```typescript + * import { Client } from 'discord-rpc'; + * let rpc: Client | null; + * ``` + * @see {@link DiscordRPC#spawnRPC} for the method where this variable is mainly used. + * + * @type Client | null + */ +let rpc: Client | null; - constructor() { - this.rpc = null; - } +/** + * This class is responsible for managing the Discord Rich Presence Client and its connection. + * + * @class + */ +class DiscordRPC { + public statusInt: NodeJS.Timeout | undefined; + /** + * Spawns and manages a Discord Rich Presence client. + * + * @async + * @public + * @param trakt - An instance of Trakt that contains the necessary methods to interact with the Trakt service. + * @throws When it fails to connect to Discord or fetch Trakt Credentials. + */ async spawnRPC(trakt: TraktInstance) { try { const traktCredentials = await fetchTraktCredentials(); - this.rpc = new Client({ transport: 'ipc' }); - this.rpc.on('ready', () => { + rpc = new Client({ transport: 'ipc' }); + rpc.on('ready', () => { console.log('Successfully connected to Discord!'.green); }); - await this.rpc.login({ clientId: traktCredentials.discordClientId }); - await trakt.updateStatus(this.rpc, this.statusInt); + await rpc.login({ clientId: traktCredentials.discordClientId }); + await trakt.updateStatus(this.statusInt); this.statusInt = setInterval(async () => { - await trakt.updateStatus(this.rpc, this.statusInt); + await trakt.updateStatus(this.statusInt); }, 15000); } catch { console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red); @@ -54,10 +75,21 @@ class DiscordRPC { } } +/** + * This class encapsulates the Trakt API with necessary methods to interact with the service. + * + * @class + */ class TraktInstance { trakt: Trakt; - async createTrakt() { + /** + * Initializes the Trakt API object. + * + * @async + * @returns Returns a promise that resolves with an instance of the Trakt API. + */ + async createTrakt(): Promise { const traktCredentials = await fetchTraktCredentials(); this.trakt = new Trakt({ client_id: traktCredentials.clientId, @@ -67,15 +99,19 @@ class TraktInstance { return this.trakt; } - // eslint-disable-next-line no-undef - async updateStatus(rpc: Client | null, statusInt: string | number | NodeJS.Timeout | undefined) { + /** + * Checks the user's Trakt status and sends it to Discord. + * + * @async + * @param statusInt - An interval ID used with the Node.js global setInterval() function, or undefined. + * @throws When the RPC connection isn't open or if it fails to fetch Trakt user or watching data. + */ + async updateStatus(statusInt: NodeJS.Timeout | undefined) { if (rpc) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error + // @ts-expect-error [currently, no types are present in trakt.tv, so this will cause an error] if (rpc.transport.socket.readyState !== 'open') { if (statusInt) clearInterval(statusInt); await rpc.destroy(); - // eslint-disable-next-line no-param-reassign rpc = null; await new DiscordRPC().spawnRPC(this); return; @@ -101,26 +137,81 @@ class TraktInstance { } await rpc.setActivity({ ...type }); - console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`); + console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`.bold); } else { - console.log(`${formatDate()} | ${'Trakt:'.red.underline} Not Playing.`); + console.log(`${formatDate()} | ${'Trakt:'.red} Not Playing.`.bold); await rpc.clearActivity(); } } } } +/** + * Asynchronously fetches Trakt credentials from a `config.json` file. + * + * @returns Returns a promise that resolves with the Trakt Credentials. + * + * @example + * ```typescript + * const credentials = await fetchTraktCredentials(); + * ``` + * + * The `TraktCredentials` interface consists of the following properties: + * - `clientId`: string + * - `clientSecret`: string + * - `discordClientId`: string + * - `oAuth?`: string (optional) + * + * The function reads a JSON file using `readFileSync` from the `fs` module and parses it to a JavaScript object. + * In case of an error during reading the file, it will throw an error. + */ async function fetchTraktCredentials(): Promise { const configData = readFileSync('./config.json', 'utf8'); return JSON.parse(configData); } -function formatDate() { +/** + * Formats the current date and time into a specific format. + * + * @returns Returns the current date and time as a string, formatted like: + * 'Thursday, April 14, 2022' for date, and '11:37 PM +08:00' for time. + * The formatted date and time is styled using ANSI escape codes to be green and italic. + * + * @example + * ```typescript + * console.log(formatDate()); + * ``` + * will log the current date and time, formatted and styled as described above. + * + * Note: The ANSI styling will only be visible in environments that support it, like many terminal emulators. + * + * This function uses `DateTime` from the `luxon` module to get the current date and time, and format it. + */ +function formatDate(): string { const now = DateTime.now(); return `${now.toLocaleString(DateTime.DATE_HUGE)} - ${now.toLocaleString(DateTime.TIME_WITH_SHORT_OFFSET)}`.green.italic; } +/** + * Generates a configuration object for creating a prompt in enquirer's prompt interface. + * + * @param name - The name of the input field (also used as a key in the final object response i.e. `clientId`, `clientSecret`, `discordClientId`, `oAuth`). + * @param message - The message to show in the prompt. + * + * @returns An object with properties `type`, `name`, and `message` which can be used with enquirer's prompt interface. + * + * @example + * Usage with Enquirer prompt function: + * + * ```typescript + * prompt([ + * generatePromptConfig('clientId', 'Please provide your Trakt Client ID:') + * ]) + * ``` + * + * It will create a single input prompt with name as 'clientId' and message as 'Please provide your Trakt Client ID:'. + */ function generatePromptConfig(name: string, message: string) { return { type: 'input', @@ -129,6 +220,32 @@ function generatePromptConfig(name: string, message: string) { }; } +/** + * Asynchronously generates Trakt credentials by prompting for necessary inputs. + * + * It sends prompts to the console for `clientId`, `clientSecret`, and `discordClientId` and + * returns an object containing these inputs after successful entry. + * + * @remarks + * This method should be run if there's no existing 'config.json' file. + * It utilizes `generatePromptConfig` to generate prompt configurations for enquirer's prompt interface. + * Once the necessary input prompts are answered correctly, the function returns + * an object that satisfies the `TraktCredentials` interface. + * + * @example + * If there's no 'config.json' file, it will generate Trakt credentials: + * + * ```typescript + * if (!existsSync('./config.json')) { + * const generatedCredentials = await generateTraktCredentials(); + * } + * ``` + * + * @returns A Promise that resolves to an object satisfying the `TraktCredentials` + * interface or null if inputs were not provided or there was an error. + * + * @async + */ async function generateTraktCredentials(): Promise { console.log( `Kindly adhere to the instructions displayed on the screen to authenticate your account.\n${ @@ -143,6 +260,26 @@ async function generateTraktCredentials(): Promise { ]); } +/** + * Authorizes Trakt by generating a new Trakt instance, creating and sending a request + * to acquire an authorization code, and then exchanging that code for a token. + * The obtained token is then saved into a file named `config.json`. + * In case the provided token is incorrect, the function logs the error message and terminates the process. + * + * @param gen - An object of type `TraktCredentials` that contains + * `clientId`, `clientSecret`, and `discordClientId`. + * + * @throws When the received token is incorrect or if unable + * to write the received token into `config.json`. + * + * @remarks + * The function uses the `prompt` function to interact with the user directly. + * + * @returns A Promise that is resolved when the process of authorization + * is finished successfully or throws an error otherwise. + * + * @async + */ async function authoriseTrakt(gen: TraktCredentials) { const qOptions = { client_id: gen.clientId, @@ -165,26 +302,43 @@ async function authoriseTrakt(gen: TraktCredentials) { try { await qTrakt.exchange_code(auth.oAuth, null); - const token = await qTrakt.export_token(); - arr.oAuth = token; + arr.oAuth = await qTrakt.export_token(); } catch { - console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red); process.exit(1); + console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red.bold); process.exit(1); } writeFileSync('./config.json', JSON.stringify(arr, null, 3)); - console.log('\nPlease restart this program.'.green); + console.log('\nPlease restart this program.'.green.bold); process.exit(1); } -async function initializeTraktAndDiscordRPC() { +/** + * Initializes instances of Trakt and Discord RPC. + * + * @throws When there is a failure to initialize Trakt and Discord RPC. + * @returns A Promise that resolves when the operation is finished. + */ +async function initializeTraktAndDiscordRPC(): Promise { const traktInstance = new TraktInstance(); await traktInstance.createTrakt(); const discordRPC = new DiscordRPC(); await discordRPC.spawnRPC(traktInstance); } -async function main() { +/** + * The main function of the application. + * + * If there's no 'config.json' file, it will generate Trakt credentials and authorize them. + * Then, it will initialize Trakt and Discord RPC. + * + * If any error occurs during these operations, it will be logged in the console, + * and the process will exit with status code 1. + * + * @throws When unable to perform operations. + * @returns A Promise that resolves when all operations are finished. + */ +async function main(): Promise { try { if (!existsSync('./config.json')) { const generatedCredentials = await generateTraktCredentials(); From 7fed931807717e6eab41fd116260a1ef9d6d833f Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 23:49:01 +0000 Subject: [PATCH 13/25] :sparkles: feat(index.ts): add support for progress bar visualization using cli-progress module to show movie and tv show play time progress --- src/index.ts | 360 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 296 insertions(+), 64 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2bc4fce..3974cf8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,14 @@ import { existsSync, readFileSync, writeFileSync } from 'fs'; import 'colors'; import Enquirer from 'enquirer'; -// @ts-expect-error [currently, no types are present in trakt.tv, so this will cause an error] +// @ts-expect-error [currently, no types file exists for trakt.tv, so this will cause an error] import Trakt from 'trakt.tv'; import { Client } from 'discord-rpc'; import { DateTime } from 'luxon'; +import { + GenericFormatter, Options, Params, SingleBar, +} from 'cli-progress'; +import prettyMilliseconds from 'pretty-ms'; const { prompt } = Enquirer; @@ -23,28 +27,54 @@ interface TraktContent { state?: string } +interface Movie { + expires_at: string; + started_at: string; + movie: { + title: string; + year: number; + } + +} + +interface TvShow { + expires_at: string; + started_at: string; + show: { + title: string; + } + episode: { + season: number; + number: number; + title: string; + } +} + /** * This variable can be either an instance of the `Client` from 'discord-rpc' or null. * It is used to control the Discord Rich Presence client. * - * @example - * ```typescript - * import { Client } from 'discord-rpc'; - * let rpc: Client | null; - * ``` - * @see {@link DiscordRPC#spawnRPC} for the method where this variable is mainly used. - * * @type Client | null */ let rpc: Client | null; +/** + * `progressBar` is a SingleBar instance from the `cli-progress` module that represents a progress bar instance. + * It is initially null but will be assigned later when a movie starts playing. + * + * The SingleBar instance is used to visualize the progress of the movie's play time on the terminal. + * + * @see {@link https://www.npmjs.com/package/cli-progress} for more information about how the cli-progress module works. + */ +let progressBar: SingleBar | null; + /** * This class is responsible for managing the Discord Rich Presence Client and its connection. * * @class */ class DiscordRPC { - public statusInt: NodeJS.Timeout | undefined; + public statusInt: NodeJS.Timeout | null = null; /** * Spawns and manages a Discord Rich Presence client. @@ -57,20 +87,31 @@ class DiscordRPC { async spawnRPC(trakt: TraktInstance) { try { const traktCredentials = await fetchTraktCredentials(); + + // Initialize the RPC client with IPC transport rpc = new Client({ transport: 'ipc' }); + + // Event handler for when the RPC client is ready rpc.on('ready', () => { console.log('Successfully connected to Discord!'.green); }); + + // Login to Discord using Trakt's Discord client ID await rpc.login({ clientId: traktCredentials.discordClientId }); + + // Update the status initially await trakt.updateStatus(this.statusInt); + + // Set up interval for updating status this.statusInt = setInterval(async () => { await trakt.updateStatus(this.statusInt); - }, 15000); - } catch { - console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red); + }, 15 * 1000); + } catch (err) { + // Handle errors and retry after 15 seconds + console.log('Failed to connect to Discord. Retrying in 15 seconds.'.red, `(${err})`.italic); setTimeout(() => { this.spawnRPC(trakt); - }, 15000); + }, 15 * 1000); } } } @@ -90,62 +131,222 @@ class TraktInstance { * @returns Returns a promise that resolves with an instance of the Trakt API. */ async createTrakt(): Promise { + // Fetch Trakt credentials const traktCredentials = await fetchTraktCredentials(); + + // Create a new Trakt instance this.trakt = new Trakt({ client_id: traktCredentials.clientId, client_secret: traktCredentials.clientSecret, }); + + // Import Trakt OAuth token this.trakt.import_token(traktCredentials.oAuth); + + // Return the Trakt instance return this.trakt; } /** - * Checks the user's Trakt status and sends it to Discord. + * Connects with the Discord RPC and updates the status. * * @async - * @param statusInt - An interval ID used with the Node.js global setInterval() function, or undefined. - * @throws When the RPC connection isn't open or if it fails to fetch Trakt user or watching data. + * @param discordStatusInterval - Timeout interval for updating the Discord status. */ - async updateStatus(statusInt: NodeJS.Timeout | undefined) { - if (rpc) { - // @ts-expect-error [currently, no types are present in trakt.tv, so this will cause an error] - if (rpc.transport.socket.readyState !== 'open') { - if (statusInt) clearInterval(statusInt); - await rpc.destroy(); - rpc = null; - await new DiscordRPC().spawnRPC(this); - return; - } + async updateStatus(discordStatusInterval: NodeJS.Timeout | null) { + if (!rpc) return; + + // Check if the RPC transport socket is not open + // @ts-expect-error [currently, no types file exists for trakt.tv, so this will cause an error] + if (rpc.transport.socket.readyState !== 'open') { + // Clear the Discord status interval + if (discordStatusInterval) clearInterval(discordStatusInterval); + + // Destroy the RPC client + await rpc.destroy(); + rpc = null; + + // Stop the progress bar if it exists + if (progressBar) progressBar.stop(); + + // Respawn the RPC client + await new DiscordRPC().spawnRPC(this); + return; + } + + // Fetch user settings and currently watching content from Trakt + const user = await this.trakt.users.settings(); + const watching = await this.trakt.users.watching({ username: user.user.username }); - const user = await this.trakt.users.settings(); - const watching = await this.trakt.users.watching({ username: user.user.username }); - - if (watching) { - const type: TraktContent = { - smallImageKey: 'play', - largeImageKey: 'trakt', - startTimestamp: new Date(watching.started_at), - }; - - if (watching.type === 'movie') { - const { movie } = watching; - type.details = `${movie.title} (${movie.year})`; - } else if (watching.type === 'episode') { - const { show, episode } = watching; - type.details = `${show.title}`; - type.state = `S${episode.season}E${episode.number} (${episode.title})`; - } - await rpc.setActivity({ ...type }); - - console.log(`${formatDate()} | ${'Trakt Playing:'.red} ${type.details}${type.state ? ` - ${type.state}` : ''}`.bold); - } else { - console.log(`${formatDate()} | ${'Trakt:'.red} Not Playing.`.bold); - await rpc.clearActivity(); + if (watching) { + // Prepare Trakt content for Discord RPC + let traktContent: TraktContent = { + smallImageKey: 'play', + largeImageKey: 'trakt', + startTimestamp: new Date(watching.started_at), + }; + + // Handle different content types (movie or episode) + if (watching.type === 'movie') { + traktContent = await this.handleMovie(watching, traktContent); + } else if (watching.type === 'episode') { + traktContent = await this.handleEpisode(watching, traktContent); } + + // Set Discord activity with Trakt content + await rpc.setActivity({ ...traktContent }); + return; + } + + // Stop the progress bar if not watching anything, and it exists + if (progressBar) progressBar.stop(); + + // Log that Trakt is not playing anything + console.log(`${formatDate()} | ${'Trakt:'.red} Not Playing.`.bold); + + // Clear Discord activity + await rpc.clearActivity(); + } + + /** + * Processes a movie object received from Trakt and prepares it for Discord. + * + * @private + * @async + * @param watching - The movie object from Trakt. + * @param traktContent - The content to send to Discord. + * @returns The modified content to send to Discord. + */ + private async handleMovie(watching: Movie, traktContent: TraktContent): Promise { + const { movie } = watching; + const detail = `${movie.title} (${movie.year})`; + + // Calculate total and elapsed durations in seconds + const totalDuration = DateTime.fromISO(watching.expires_at).diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; + const elapsedDuration = DateTime.local().diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; + + // Initialize progress bar if it doesn't exist + if (!progressBar) { + progressBar = await generateProgressBar(); + progressBar.start(totalDuration, elapsedDuration, { + content: detail, + startedAt: watching.started_at, + endsAt: watching.expires_at, + }); + } + + // Update Trakt content details + return { ...traktContent, details: detail }; + } + + /** + * Processes a TV show object received from Trakt and prepares it for Discord. + * + * @private + * @async + * @param watching - The TV show object from Trakt. + * @param traktContent - The content to send to Discord. + * @returns The modified content to send to Discord. + */ + private async handleEpisode(watching: TvShow, traktContent: TraktContent): Promise { + const { show, episode } = watching; + const detail = `${show.title}`; + const state = `S${episode.season}E${episode.number} (${episode.title})`; + + // Calculate total and elapsed durations in seconds + const totalDuration = DateTime.fromISO(watching.expires_at).diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; + const elapsedDuration = DateTime.local().diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; + + // Initialize progress bar if it doesn't exist + if (!progressBar) { + progressBar = await generateProgressBar(); + progressBar.start(totalDuration, elapsedDuration, { + content: `${detail} - ${state}`, + startedAt: watching.started_at, + endsAt: watching.expires_at, + }); } + + // Update Trakt content details and state + return { ...traktContent, details: detail, state }; } } +/** + * Formats a date and time string into a localized time string using the current time zone. + * + * @param date - A string representing a date and time. + * @returns A string representing the formatted time in the local time zone. + */ +function formatDateTime(date: string): string { + return DateTime.fromISO(date).setZone('local').toLocaleString(DateTime.TIME_SIMPLE); +} + +/** + * Calculates the elapsed duration in seconds between the current time and the specified starting time. + * + * @param startedAt - A string representing the starting date and time. + * @returns The elapsed duration in seconds. + */ +function calculateElapsedDuration(startedAt: string): number { + return DateTime.local().diff(DateTime.fromISO(startedAt), 'seconds').seconds; +} + +/** + * Generates a string representing a progress bar based on the specified options and parameters. + * + * @param options - An object containing optional settings for the progress bar. + * @param params - An object containing parameters for generating the progress bar. + * @returns A string representing the generated progress bar. + */ +function generateBarProgress(options: Options, params: Params): string { + // Calculate the number of complete and incomplete characters based on the progress and bar size. + const complete = (options.barCompleteString || '').slice(0, Math.round(params.progress * (options.barsize ?? 0))); + const incomplete = (options.barIncompleteString || '').slice(0, Math.round((1 - params.progress) * (options.barsize ?? 0))); + + // Combine complete and incomplete parts to form the progress bar string. + return complete + incomplete; +} + +/** + * Asynchronously generates a progress bar using the provided options and parameters. + * + * @returns A `SingleBar` instance representing the generated progress bar. + */ +async function generateProgressBar() { + // Define a custom format function for the progress bar + const formatFunction: GenericFormatter = (options, params, payload) => { + // Extract relevant information from the payload + const { startedAt, endsAt, content } = payload; + + // Format start and end dates in local time + const localStartDate = formatDateTime(startedAt); + const localEndDate = formatDateTime(endsAt); + + // Calculate elapsed duration and format it in a human-readable format + const elapsedDuration = calculateElapsedDuration(startedAt); + const prettyDuration = prettyMilliseconds(elapsedDuration * 1000, { secondsDecimalDigits: 0 }); + + // Generate progress bar + const barProgress = generateBarProgress(options, params); + + // Construct the progress bar line with formatted information + return `${content.cyan.padStart(3)} ${barProgress} Started at ${localStartDate.green.bold} | Ends at ${localEndDate.green.bold} | Time Elapsed: ${prettyDuration.green.bold}`; + }; + + // todo pretty duration started at negative numbers for me idk why + + // Create a new SingleBar instance with specified options + return new SingleBar({ + format: formatFunction, + barCompleteChar: 'â–ˆ', + barIncompleteChar: 'â–‘', + hideCursor: true, + clearOnComplete: true, + linewrap: true, + }); +} + /** * Asynchronously fetches Trakt credentials from a `config.json` file. * @@ -166,8 +367,17 @@ class TraktInstance { * In case of an error during reading the file, it will throw an error. */ async function fetchTraktCredentials(): Promise { - const configData = readFileSync('./config.json', 'utf8'); - return JSON.parse(configData); + try { + // Read the configuration file synchronously + const configData = readFileSync('./config.json', 'utf8'); + + // Return the parsed credentials + return JSON.parse(configData); + } catch (error) { + // Handle errors during file reading or JSON parsing + console.error('Error fetching Trakt credentials:', error); + process.exit(1); + } } /** @@ -266,7 +476,7 @@ async function generateTraktCredentials(): Promise { * The obtained token is then saved into a file named `config.json`. * In case the provided token is incorrect, the function logs the error message and terminates the process. * - * @param gen - An object of type `TraktCredentials` that contains + * @param gen - An object of a type `TraktCredentials` that contains * `clientId`, `clientSecret`, and `discordClientId`. * * @throws When the received token is incorrect or if unable @@ -281,34 +491,45 @@ async function generateTraktCredentials(): Promise { * @async */ async function authoriseTrakt(gen: TraktCredentials) { - const qOptions = { + // Create a Trakt instance with client ID and client secret + const traktOptions = { client_id: gen.clientId, client_secret: gen.clientSecret, }; + const traktInstance = new Trakt(traktOptions); - const qTrakt = new Trakt(qOptions); - - const traktAuthUrl = qTrakt.get_url(); + // Get the Trakt authorization URL + const traktAuthUrl = traktInstance.get_url(); + // Prompt the user to visit the Trakt authorization URL and enter the received code const auth = await prompt([ generatePromptConfig('oAuth', `Please visit the following link and subsequently, paste the received code into the console:\n${traktAuthUrl}\n`), ]); - const arr: TraktCredentials = { + // Prepare a TraktCredentials object with essential information + const updatedCredentials: TraktCredentials = { clientId: gen.clientId, clientSecret: gen.clientSecret, discordClientId: gen.discordClientId, }; try { - await qTrakt.exchange_code(auth.oAuth, null); - arr.oAuth = await qTrakt.export_token(); - } catch { - console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red.bold); process.exit(1); + // Exchange the authorization code for an access token + await traktInstance.exchange_code(auth.oAuth, null); + + // Export the Trakt access token and store it in the credentials object + updatedCredentials.oAuth = await traktInstance.export_token(); + } catch (error) { + // Handle errors during the token exchange process + console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red.bold); + console.error(error); + process.exit(1); } - writeFileSync('./config.json', JSON.stringify(arr, null, 3)); + // Write the updated credentials to the configuration file + writeFileSync('./config.json', JSON.stringify(updatedCredentials, null, 3)); + // Prompt the user to restart the program console.log('\nPlease restart this program.'.green.bold); process.exit(1); } @@ -340,14 +561,25 @@ async function initializeTraktAndDiscordRPC(): Promise { */ async function main(): Promise { try { + // Check if the configuration file exists if (!existsSync('./config.json')) { + // Generate Trakt credentials if the file doesn't exist const generatedCredentials = await generateTraktCredentials(); - if (generatedCredentials) await authoriseTrakt(generatedCredentials); + + // If credentials were generated, authorize Trakt + if (generatedCredentials) { + await authoriseTrakt(generatedCredentials); + } } + + // Initialize Trakt and Discord RPC await initializeTraktAndDiscordRPC(); } catch (error) { + // Handle and log errors console.error(`\nAn error occurred: ${error}`.red); process.exit(1); } } + +// Call the main function await main(); From f3483d5bd5496b9d7ec98c88b467407160327126 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 23:49:39 +0000 Subject: [PATCH 14/25] :package: chore(package.json): add dependencies for cli-progress and pretty-ms packages --- package.json | 3 +++ yarn.lock | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/package.json b/package.json index 3ca0e19..08d5d7b 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,17 @@ "type": "module", "dependencies": { "@types/luxon": "^3.3.7", + "cli-progress": "^3.12.0", "colors": "^1.4.0", "discord-rpc": "^4.0.1", "enquirer": "^2.4.1", "luxon": "^3.4.4", + "pretty-ms": "^8.0.0", "trakt.tv": "^8.2.0", "ts-node": "^10.9.2" }, "devDependencies": { + "@types/cli-progress": "^3", "@types/discord-rpc": "^4", "@types/node": "^20.10.4", "@typescript-eslint/eslint-plugin": "^6.14.0", diff --git a/yarn.lock b/yarn.lock index f36e6bb..c29deda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -238,6 +238,15 @@ __metadata: languageName: node linkType: hard +"@types/cli-progress@npm:^3": + version: 3.11.5 + resolution: "@types/cli-progress@npm:3.11.5" + dependencies: + "@types/node": "npm:*" + checksum: bf00f543ee677f61b12e390876df59354943d6c13d96640171528e9b7827f4edb7701cdd4675d6256d13ef9ee542731bd5cae585e1b43502553f69fc210dcb92 + languageName: node + linkType: hard + "@types/discord-rpc@npm:^4": version: 4.0.8 resolution: "@types/discord-rpc@npm:4.0.8" @@ -795,6 +804,15 @@ __metadata: languageName: node linkType: hard +"cli-progress@npm:^3.12.0": + version: 3.12.0 + resolution: "cli-progress@npm:3.12.0" + dependencies: + string-width: "npm:^4.2.3" + checksum: f464cb19ebde2f3880620a2adfaeeefaec6cb15c8e610c8a659ca1047ee90d69f3bf2fdabbb1fe33ac408678e882e3e0eecdb84ab5df0edf930b269b8a72682d + languageName: node + linkType: hard + "clone-response@npm:^1.0.2": version: 1.0.3 resolution: "clone-response@npm:1.0.3" @@ -2540,6 +2558,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^3.0.0": + version: 3.0.0 + resolution: "parse-ms@npm:3.0.0" + checksum: 056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -2599,6 +2624,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^8.0.0": + version: 8.0.0 + resolution: "pretty-ms@npm:8.0.0" + dependencies: + parse-ms: "npm:^3.0.0" + checksum: e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d + languageName: node + linkType: hard + "proc-log@npm:^3.0.0": version: 3.0.0 resolution: "proc-log@npm:3.0.0" @@ -3077,11 +3111,13 @@ __metadata: version: 0.0.0-use.local resolution: "trakt-discord-presence@workspace:." dependencies: + "@types/cli-progress": "npm:^3" "@types/discord-rpc": "npm:^4" "@types/luxon": "npm:^3.3.7" "@types/node": "npm:^20.10.4" "@typescript-eslint/eslint-plugin": "npm:^6.14.0" "@typescript-eslint/parser": "npm:^6.14.0" + cli-progress: "npm:^3.12.0" colors: "npm:^1.4.0" discord-rpc: "npm:^4.0.1" enquirer: "npm:^2.4.1" @@ -3090,6 +3126,7 @@ __metadata: eslint-formatter-table: "npm:^7.32.1" eslint-plugin-import: "npm:^2.29.1" luxon: "npm:^3.4.4" + pretty-ms: "npm:^8.0.0" trakt.tv: "npm:^8.2.0" ts-node: "npm:^10.9.2" typescript: "npm:^5.3.3" From aa1d2d28fdeb12c1d313e610d8369026404be4d1 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Sun, 17 Dec 2023 23:54:50 +0000 Subject: [PATCH 15/25] :hammer: refactor(index.ts): change prompt type from hardcoded 'input' to the passed `type` parameter in `generatePromptConfig` function --- src/index.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3974cf8..6ec26cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -406,6 +406,7 @@ function formatDate(): string { /** * Generates a configuration object for creating a prompt in enquirer's prompt interface. * + * @param type - The type of prompt * @param name - The name of the input field (also used as a key in the final object response i.e. `clientId`, `clientSecret`, `discordClientId`, `oAuth`). * @param message - The message to show in the prompt. * @@ -422,9 +423,9 @@ function formatDate(): string { * * It will create a single input prompt with name as 'clientId' and message as 'Please provide your Trakt Client ID:'. */ -function generatePromptConfig(name: string, message: string) { +function generatePromptConfig(type: string, name: string, message: string) { return { - type: 'input', + type, name, message, }; @@ -464,9 +465,9 @@ async function generateTraktCredentials(): Promise { ); return prompt([ - generatePromptConfig('clientId', 'Please provide your Trakt Client ID:'), - generatePromptConfig('clientSecret', 'Please provide your Trakt Client Secret:'), - generatePromptConfig('discordClientId', 'Please provide your Discord Client ID:'), + generatePromptConfig('input', 'clientId', 'Please provide your Trakt Client ID:'), + generatePromptConfig('input', 'clientSecret', 'Please provide your Trakt Client Secret:'), + generatePromptConfig('input', 'discordClientId', 'Please provide your Discord Client ID:'), ]); } @@ -503,7 +504,7 @@ async function authoriseTrakt(gen: TraktCredentials) { // Prompt the user to visit the Trakt authorization URL and enter the received code const auth = await prompt([ - generatePromptConfig('oAuth', `Please visit the following link and subsequently, paste the received code into the console:\n${traktAuthUrl}\n`), + generatePromptConfig('input', 'oAuth', `Please visit the following link and subsequently, paste the received code into the console:\n${traktAuthUrl}\n`), ]); // Prepare a TraktCredentials object with essential information From fce3440bca2f1c50b83111cffe0405d85fe3a7f0 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 00:30:05 +0000 Subject: [PATCH 16/25] =?UTF-8?q?=E2=9C=A8=20feat(index.ts):=20add=20suppo?= =?UTF-8?q?rt=20for=20different=20UI=20modes=20(progress=20bar=20or=20stan?= =?UTF-8?q?dard=20log)=20by=20adding=20a=20mode=20property=20to=20the=20Co?= =?UTF-8?q?nfiguration=20interface=20and=20updating=20the=20TraktInstance?= =?UTF-8?q?=20class=20to=20use=20the=20mode=20property=20for=20conditional?= =?UTF-8?q?=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6ec26cf..026d94a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,11 +12,12 @@ import prettyMilliseconds from 'pretty-ms'; const { prompt } = Enquirer; -interface TraktCredentials { +interface Configuration { clientId: string; clientSecret: string; discordClientId: string; oAuth?: string; + mode: string; } interface TraktContent { @@ -24,7 +25,7 @@ interface TraktContent { largeImageKey: string; startTimestamp: Date; details?: string; - state?: string + state?: string; } interface Movie { @@ -124,6 +125,8 @@ class DiscordRPC { class TraktInstance { trakt: Trakt; + private credentials: Configuration | null = null; + /** * Initializes the Trakt API object. * @@ -134,6 +137,9 @@ class TraktInstance { // Fetch Trakt credentials const traktCredentials = await fetchTraktCredentials(); + // Store the credentials for use in other TraktInstance functions + this.credentials = traktCredentials; + // Create a new Trakt instance this.trakt = new Trakt({ client_id: traktCredentials.clientId, @@ -226,7 +232,7 @@ class TraktInstance { const elapsedDuration = DateTime.local().diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; // Initialize progress bar if it doesn't exist - if (!progressBar) { + if (!progressBar && this.credentials?.mode === 'progress_bar') { progressBar = await generateProgressBar(); progressBar.start(totalDuration, elapsedDuration, { content: detail, @@ -235,6 +241,11 @@ class TraktInstance { }); } + // If the mode is set to standard cli logging + if (this.credentials?.mode === 'log') { + console.log(`${formatDate()} | ${'Trakt Playing:'.red.bold} ${detail} (${movie.year})`); + } + // Update Trakt content details return { ...traktContent, details: detail }; } @@ -258,7 +269,7 @@ class TraktInstance { const elapsedDuration = DateTime.local().diff(DateTime.fromISO(watching.started_at), 'seconds').seconds; // Initialize progress bar if it doesn't exist - if (!progressBar) { + if (!progressBar && this.credentials?.mode === 'progress_bar') { progressBar = await generateProgressBar(); progressBar.start(totalDuration, elapsedDuration, { content: `${detail} - ${state}`, @@ -267,6 +278,11 @@ class TraktInstance { }); } + // If the mode is set to standard cli logging + if (this.credentials?.mode === 'log') { + console.log(`${formatDate()} | ${'Trakt Playing:'.red.bold} ${detail} - ${state}`); + } + // Update Trakt content details and state return { ...traktContent, details: detail, state }; } @@ -334,8 +350,6 @@ async function generateProgressBar() { return `${content.cyan.padStart(3)} ${barProgress} Started at ${localStartDate.green.bold} | Ends at ${localEndDate.green.bold} | Time Elapsed: ${prettyDuration.green.bold}`; }; - // todo pretty duration started at negative numbers for me idk why - // Create a new SingleBar instance with specified options return new SingleBar({ format: formatFunction, @@ -366,7 +380,7 @@ async function generateProgressBar() { * The function reads a JSON file using `readFileSync` from the `fs` module and parses it to a JavaScript object. * In case of an error during reading the file, it will throw an error. */ -async function fetchTraktCredentials(): Promise { +async function fetchTraktCredentials(): Promise { try { // Read the configuration file synchronously const configData = readFileSync('./config.json', 'utf8'); @@ -457,17 +471,29 @@ function generatePromptConfig(type: string, name: string, message: string) { * * @async */ -async function generateTraktCredentials(): Promise { +async function generateTraktCredentials(): Promise { console.log( `Kindly adhere to the instructions displayed on the screen to authenticate your account.\n${ '**CRUCIAL: Handle your login credentials with the highest level of privacy and avoid disclosing them. They will be stored in a `config.json` file.\n'.red.italic }`, ); + const modePrompt = [{ + type: 'select', + name: 'mode', + message: 'Please select which UI you would prefer.', + initial: 0, + choices: [ + { name: 'Progress Bar', message: 'Progress Bar', value: '#ff0000' }, + { name: 'Standard Log', message: 'Standard Log', value: '#00ff00' }, + ], + }]; + return prompt([ generatePromptConfig('input', 'clientId', 'Please provide your Trakt Client ID:'), generatePromptConfig('input', 'clientSecret', 'Please provide your Trakt Client Secret:'), generatePromptConfig('input', 'discordClientId', 'Please provide your Discord Client ID:'), + ...modePrompt, ]); } @@ -491,7 +517,7 @@ async function generateTraktCredentials(): Promise { * * @async */ -async function authoriseTrakt(gen: TraktCredentials) { +async function authoriseTrakt(gen: Configuration) { // Create a Trakt instance with client ID and client secret const traktOptions = { client_id: gen.clientId, @@ -503,15 +529,16 @@ async function authoriseTrakt(gen: TraktCredentials) { const traktAuthUrl = traktInstance.get_url(); // Prompt the user to visit the Trakt authorization URL and enter the received code - const auth = await prompt([ + const auth = await prompt([ generatePromptConfig('input', 'oAuth', `Please visit the following link and subsequently, paste the received code into the console:\n${traktAuthUrl}\n`), ]); // Prepare a TraktCredentials object with essential information - const updatedCredentials: TraktCredentials = { + const updatedCredentials: Configuration = { clientId: gen.clientId, clientSecret: gen.clientSecret, discordClientId: gen.discordClientId, + mode: gen.mode === 'Progress Bar' ? 'progress_bar' : 'log', }; try { @@ -523,7 +550,6 @@ async function authoriseTrakt(gen: TraktCredentials) { } catch (error) { // Handle errors during the token exchange process console.log('\nAn incorrect token has been provided! Please restart the program and try again.'.red.bold); - console.error(error); process.exit(1); } From 467cca5e463ede6bfa8905af75b9ddfcfcaf05ba Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:44:05 +0000 Subject: [PATCH 17/25] =?UTF-8?q?=F0=9F=90=9B=20fix(index.ts):=20update=20?= =?UTF-8?q?mode=20values=20from=20'log'=20to=20'standard=5Flog'=20to=20imp?= =?UTF-8?q?rove=20clarity=20and=20semantics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 026d94a..13f50d2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -242,7 +242,7 @@ class TraktInstance { } // If the mode is set to standard cli logging - if (this.credentials?.mode === 'log') { + if (this.credentials?.mode === 'standard_log') { console.log(`${formatDate()} | ${'Trakt Playing:'.red.bold} ${detail} (${movie.year})`); } @@ -279,7 +279,7 @@ class TraktInstance { } // If the mode is set to standard cli logging - if (this.credentials?.mode === 'log') { + if (this.credentials?.mode === 'standard_log') { console.log(`${formatDate()} | ${'Trakt Playing:'.red.bold} ${detail} - ${state}`); } @@ -538,7 +538,7 @@ async function authoriseTrakt(gen: Configuration) { clientId: gen.clientId, clientSecret: gen.clientSecret, discordClientId: gen.discordClientId, - mode: gen.mode === 'Progress Bar' ? 'progress_bar' : 'log', + mode: gen.mode === 'Progress Bar' ? 'progress_bar' : 'standard_log', }; try { From fcf16eb85a0338d450ce70ab400f2c1a5ef1df7e Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:44:40 +0000 Subject: [PATCH 18/25] =?UTF-8?q?=F0=9F=94=A5=20chore(example.png):=20remo?= =?UTF-8?q?ved=20unused=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example.png | Bin 18864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 example.png diff --git a/example.png b/example.png deleted file mode 100644 index a2c5077a43318d390741b65d59ba37b1dfd96848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18864 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 h{OZeoU-&P={|^vRWTo`n{p Date: Mon, 18 Dec 2023 11:45:14 +0000 Subject: [PATCH 19/25] :hammer: refactor(README.md): updated formatting and wording of guide --- README.md | 117 +++++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 4f39637..9c6824c 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,86 @@ - -[![Codacy Badge](https://img.shields.io/codacy/grade/eb4d99a79b5c4151a7431b1cb1057e1b?style=for-the-badge)](https://www.codacy.com/gh/RagnarLothbrok-Odin/trakt-discord-presence/dashboard?utm_source=github.com&utm_medium=referral&utm_content=RagnarLothbrok-Odin/trakt-discord-presence&utm_campaign=Badge_Grade) -![Repo Size](https://img.shields.io/github/languages/code-size/RagnarLothbrok-Odin/trakt-discord-presence.svg?style=for-the-badge) -![TOP_LANGUAGE](https://img.shields.io/github/languages/top/RagnarLothbrok-Odin/trakt-discord-presence.svg?style=for-the-badge) -![Stars](https://img.shields.io/github/stars/RagnarLothbrok-Odin/trakt-discord-presence.svg?style=for-the-badge) -![FORKS](https://img.shields.io/github/forks/RagnarLothbrok-Odin/trakt-discord-presence.svg?style=for-the-badge&social) - +
+
+

+ DiscordGPT +

+
+

+ + Support + + + Language + + + Issues + + + Pull Requests + + + Codacy Ranking + +

+
# Trakt Discord Presence -Set your Discord presence according to what you are watching on [Trakt](https://trakt.tv/) -Due to Discord limitations, your Discord client **MUST** be running on the same device as this script. +Instantly stream your watching status on Discord courtesy [Trakt](https://trakt.tv/). Please note, due to certain +limitations on Discord, this script is required to run on the same device as your Discord client. -## Prerequisites -* [Node.js](https://nodejs.org) -* [Yarn](https://yarnpkg.com) -* [Trakt.tv Account](https://trakt.tv) -* [Discord Account](https://discord.com) +## Requirements -## Installation -1. [Download the latest release](https://github.com/RagnarLothbrok-Odin/trakt-discord-presence/releases) - * Extract the folder that was downloaded to your desired location using your preferred software, [WinRar for example](https://www.win-rar.com) +- [Node.js](https://nodejs.org) +- [Yarn](https://yarnpkg.com) +- [Trakt.tv](https://trakt.tv) & [Discord](https://discord.com) accounts -2. [Download Node.js](https://nodejs.org) - * `LTS` preferred, Current should work but `LTS` is recommended - * Ensure that `Node` is installed to `PATH`, it should be an option while installing +## Installation & Setup -3. [Install Yarn](https://classic.yarnpkg.com/en/docs/install) - * Open CMD/terminal/console on your device - * Run the following command +1. [Download](https://github.com/RagnarLothbrok-Odin/trakt-discord-presence/releases), extract, and move the latest + release to your chosen location. - npm install --global yarn - * Point your CMD/terminal/console to the folder that you extracted the source to, by using the `cd` command, an example follows: +2. [Install Node.js](https://nodejs.org) (preferably the `LTS` version) and ensure `Node` is added to `PATH`. - cd /Users/ragnarlothbrok/Downloads/trakt-discord-presence +3. [Install Yarn](https://classic.yarnpkg.com/en/docs/install) globally, navigate to the source directory using the `cd` + command. + ```Shell + npm install --global yarn + cd /path/to/your/extracted/source + ``` -4. Install the necessary packages with the following command: +4. Install packages using `yarn install`. A confirmation message appears upon successful installation. - yarn install - * A message will indicate when this step is completed +## App Configuration -## Setup -1. [Create your Trakt application](https://trakt.tv/oauth/applications) - * After clicking the above link, click `NEW APPLICATION` - * Set the `Name` as: `Discord` - * Set the `Redirect uri` as `urn:ietf:wg:oauth:2.0:oob` +1. [Create a new Trakt application](https://trakt.tv/oauth/applications), name it `Discord` and set `Redirect uri` + as `urn:ietf:wg:oauth:2.0:oob`. -2. [Create your Discord application](https://discord.com/developers/applications) - * After clicking the above link, click `New Application` - * Set the `NAME` as: `Trakt` - * Set the app icon by clicking the box under where it says `APP ICON` _(Set this image to the file named_ `trakt.png` _(you can find this file in the folder named_ `images` _in the extracted source)_ - * Click `Rich Presence` on the left hand pane - * Set the cover image by clicking the box under where it say `Select Image` _(Set this image to the file named_ `trakt.png` _(you can find this file in the folder named_ `images` _in the extracted source)_ - * Click `Add Image(s)` and upload the images you can find in the folder named `images` in the extracted source +2. [Create a new Discord application](https://discord.com/developers/applications), name it `Trakt` and + add `trakt.png` (available in `images` folder) as the app icon and as the cover image in `Rich Presence` section. + Upload the remaining images found in `images` folder. -## Usage -1. Run the program by running the following command: +## How to Use - yarn start +1. Run the program using `yarn start`. -2. You will be asked for your [Trakt Client ID](https://trakt.tv/oauth/applications), if you did not create an application, ensure you read the [Setup section of this page](https://github.com/RagnarLothbrok-Odin/trakt-discord-presence/blob/main/README.md#setup) +2. It prompts for [Trakt Client ID and Secret](https://trakt.tv/oauth/applications) + and [Discord Client ID](https://discord.com/developers/applications) (Refer to `App Configuration` section if not + already setup). -3. You will be asked for your [Trakt Client Secret](https://trakt.tv/oauth/applications) +3. It prompts for your preferred UI mode, either 'Progress Bar' or 'Standard Log' Examples of both outputs can be seen + at the bottom of this page. -4. You will be asked for your [Discord Client ID](https://discord.com/developers/applications), if you did not create an application, ensure you read the [Setup section of this page](https://github.com/RagnarLothbrok-Odin/trakt-discord-presence/blob/main/README.md#setup) +4. You're then provided a `URL`. Paste this onto any browser, retrieve the code and enter it in your terminal. -5. You will be provided a `URL`, you must paste this link into a browser of your choosing - * Once you visit this `URL`, a code will be provided, you must paste this code into your CMD/terminal/console - -6. Finally, you must now run the following code to start the program. +5. Run `yarn start` to launch the program. - yarn start +If set up correctly, your output should resemble this: -## Functionality -If you follow all the steps correctly, you should see an output similar to the following - +- **Progress Bar** +
Progress Bar +- **Standard Log** +
Standard Log ## License + From 9420963697896dc892cd5e319e73e4f95a5297df Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:49:19 +0000 Subject: [PATCH 20/25] =?UTF-8?q?=F0=9F=93=9D=20docs(README.md):=20update?= =?UTF-8?q?=20image=20alt=20text=20and=20width=20for=20better=20clarity=20?= =?UTF-8?q?and=20accessibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9c6824c..786f784 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

- DiscordGPT + Trakt Discord Presence


@@ -77,9 +77,9 @@ limitations on Discord, this script is required to run on the same device as you If set up correctly, your output should resemble this: - **Progress Bar** -
Progress Bar +
Progress Bar - **Standard Log** -
Standard Log +
Standard Log ## License From 559d5de36bd110b008e72d657bad162d2e4e6365 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:02:52 +0000 Subject: [PATCH 21/25] =?UTF-8?q?=F0=9F=94=84=20chore(package.json):=20upd?= =?UTF-8?q?ate=20devDependencies=20versions=20for=20"@types/cli-progress",?= =?UTF-8?q?=20"@types/discord-rpc",=20and=20"@types/node"=20to=20their=20l?= =?UTF-8?q?atest=20versions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 10 +++++----- yarn.lock | 40 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 08d5d7b..d1fc326 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "trakt-discord-presence", + "name": "traktdiscordpresence", "description": "Set your Discord presence according to what you are watching on Trakt.tv", "version": "2.0.0", - "repository": "https://github.com/RagnarLothbrok-Odin/trakt-discord-presence.git", + "repository": "https://github.com/RagnarLothbrok-Odin/TraktDiscordPresence.git", "author": "Ragnar Lothbrok ", "license": "MIT", "engines": { @@ -24,9 +24,9 @@ "ts-node": "^10.9.2" }, "devDependencies": { - "@types/cli-progress": "^3", - "@types/discord-rpc": "^4", - "@types/node": "^20.10.4", + "@types/cli-progress": "^3.11.5", + "@types/discord-rpc": "^4.0.8", + "@types/node": "^20.10.5", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^6.14.0", "eslint": "^8.56.0", diff --git a/yarn.lock b/yarn.lock index c29deda..7d8736d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -238,7 +238,7 @@ __metadata: languageName: node linkType: hard -"@types/cli-progress@npm:^3": +"@types/cli-progress@npm:^3.11.5": version: 3.11.5 resolution: "@types/cli-progress@npm:3.11.5" dependencies: @@ -247,7 +247,7 @@ __metadata: languageName: node linkType: hard -"@types/discord-rpc@npm:^4": +"@types/discord-rpc@npm:^4.0.8": version: 4.0.8 resolution: "@types/discord-rpc@npm:4.0.8" dependencies: @@ -300,12 +300,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^20.10.4": - version: 20.10.4 - resolution: "@types/node@npm:20.10.4" +"@types/node@npm:*, @types/node@npm:^20.10.5": + version: 20.10.5 + resolution: "@types/node@npm:20.10.5" dependencies: undici-types: "npm:~5.26.4" - checksum: 2c8b70cba731eb2ae3ae046daa74903bfcbb0e7b9196da767e5895054f6d252296ae7a04fb1dbbcb53bb004c4c658c05eaea2731bc9e2dd9e08f7e88d672f563 + checksum: be30609aae0bfe492097815f166ccc07f465220cb604647fa4e5ec05a1d16c012a41b82b5f11ecfe2485cbb479d4d20384b95b809ca0bcff6d94d5bbafa645bb languageName: node linkType: hard @@ -3107,14 +3107,23 @@ __metadata: languageName: node linkType: hard -"trakt-discord-presence@workspace:.": +"trakt.tv@npm:^8.2.0": + version: 8.2.0 + resolution: "trakt.tv@npm:8.2.0" + dependencies: + got: "npm:11.8.6" + checksum: 27d8b0f9f82c990cef9aed9d9a4e834f61db315fb0d0395cc4a2c14f79f4b8dc9e9df13d5fddbbc566b58f37f934113db26f75a98bbbbd7566b636aa93158276 + languageName: node + linkType: hard + +"traktdiscordpresence@workspace:.": version: 0.0.0-use.local - resolution: "trakt-discord-presence@workspace:." + resolution: "traktdiscordpresence@workspace:." dependencies: - "@types/cli-progress": "npm:^3" - "@types/discord-rpc": "npm:^4" + "@types/cli-progress": "npm:^3.11.5" + "@types/discord-rpc": "npm:^4.0.8" "@types/luxon": "npm:^3.3.7" - "@types/node": "npm:^20.10.4" + "@types/node": "npm:^20.10.5" "@typescript-eslint/eslint-plugin": "npm:^6.14.0" "@typescript-eslint/parser": "npm:^6.14.0" cli-progress: "npm:^3.12.0" @@ -3133,15 +3142,6 @@ __metadata: languageName: unknown linkType: soft -"trakt.tv@npm:^8.2.0": - version: 8.2.0 - resolution: "trakt.tv@npm:8.2.0" - dependencies: - got: "npm:11.8.6" - checksum: 27d8b0f9f82c990cef9aed9d9a4e834f61db315fb0d0395cc4a2c14f79f4b8dc9e9df13d5fddbbc566b58f37f934113db26f75a98bbbbd7566b636aa93158276 - languageName: node - linkType: hard - "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" From ddb77c0b7cb5bf103d2c1c21cc30c4c63f569178 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:03:29 +0000 Subject: [PATCH 22/25] =?UTF-8?q?=F0=9F=93=9D=20docs(README.md):=20update?= =?UTF-8?q?=20repository=20and=20release=20links=20to=20point=20to=20the?= =?UTF-8?q?=20correct=20location?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 786f784..d928f3d 100644 --- a/README.md +++ b/README.md @@ -8,16 +8,16 @@ Support - - Language + + Language - - Issues + + Issues - - Pull Requests + + Pull Requests - + Codacy Ranking

@@ -36,7 +36,7 @@ limitations on Discord, this script is required to run on the same device as you ## Installation & Setup -1. [Download](https://github.com/RagnarLothbrok-Odin/trakt-discord-presence/releases), extract, and move the latest +1. [Download](https://github.com/RagnarLothbrok-Odin/TraktDiscordPresence/releases), extract, and move the latest release to your chosen location. 2. [Install Node.js](https://nodejs.org) (preferably the `LTS` version) and ensure `Node` is added to `PATH`. From 0af3ebaabb3f52c5c2dcec55ebeb6c52f41ccf01 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:24:18 +0000 Subject: [PATCH 23/25] =?UTF-8?q?=F0=9F=93=9D=20docs(README.md):=20remove?= =?UTF-8?q?=20logo=20(while=20its=20still=20being=20created)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index d928f3d..df18dfd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@

-

- Trakt Discord Presence -


From 206d0a5a6cc20b12575f257a53a655f6a6b579d2 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:24:23 +0000 Subject: [PATCH 24/25] :bookmark: chore(package.json): update version from 2.0.0 to 2.0.35 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1fc326..590204c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "traktdiscordpresence", "description": "Set your Discord presence according to what you are watching on Trakt.tv", - "version": "2.0.0", + "version": "2.0.35", "repository": "https://github.com/RagnarLothbrok-Odin/TraktDiscordPresence.git", "author": "Ragnar Lothbrok ", "license": "MIT", From f2812493c33ad22f015f7cad7f161d006c31d596 Mon Sep 17 00:00:00 2001 From: Ragnar Lothbrok <30740511+RagnarLothbrok-Odin@users.noreply.github.com> Date: Mon, 18 Dec 2023 12:25:51 +0000 Subject: [PATCH 25/25] =?UTF-8?q?=E2=9C=A8=20feat(.github):=20include=20.g?= =?UTF-8?q?ithub=20templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.yml | 46 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 35 ++++++++++++++++ .github/pull_request_template.md | 28 +++++++++++++ .github/workflows/stale.yml | 30 ++++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/stale.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..8555d4e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,46 @@ +name: Bug report +description: Create a report to help us improve +title: "[BUG] Short Description" +labels: bug +body: + - type: textarea + attributes: + label: Current Behavior + description: A clear and concise description of what you're experiencing. Do NOT combine multiple bugs into one issue. If you have multiple bugs to report please open separate issues for EACH bug. + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. Go to ... + 2. Click on ... + 3. Scroll to ... + 4. See error ... + validations: + required: true + - type: textarea + attributes: + label: Screenshots and Additional Info + description: | + Provide any relevant additional information such as screenshots or other details here. + + Tip: You can attach images files by clicking this area to highlight it and then dragging files in. + validations: + required: false + - type: checkboxes + attributes: + label: Checklist + description: Before submitting your bug report. + options: + - label: I have made a separate issue for each bug that I am reporting. + required: true + - label: I have searched the issues and this bug has not been reported. + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ec4bb38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..54ffdb6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,35 @@ +name: Feature request +description: Suggest an idea for this project +title: "[Feature] Short Description" +labels: enhancement +body: + - type: textarea + attributes: + label: Feature description + description: A clear and concise description of what you want to happen. Do NOT combine multiple feature requests into one issue. Open new issues for EACH request. + validations: + required: true + - type: textarea + attributes: + label: Why is this feature needed? Please justify and explain. + description: A clear and concise explanation justifying why this feature is needed. Ex. I'm always frustrated when [...] + validations: + required: true + - type: textarea + attributes: + label: Screenshots and Additional Info + description: | + Provide any relevant additional information such as screenshots or other details here. + + Tip: You can attach images files by clicking this area to highlight it and then dragging files in. + validations: + required: false + - type: checkboxes + attributes: + label: Checklist + description: Before submitting your feature request. + options: + - label: I have made a separate issue for each feature I am requesting. + required: true + - label: I have searched the issues and this feature has not been requested. + required: true \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..cdda3e1 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ + + +## Pull request type + + + +Please check the type of change your PR introduces: + +- [ ] Bugfix +- [ ] Feature + +## What is the current behavior? + + + +Issue Number: N/A + +## What is the new behavior? + + + +- +- +- + +## Other information + + diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..24401b4 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,30 @@ +name: Close stale issues and PRs +'on': + schedule: + - cron: 0 0 * * * +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v8 + with: + days-before-stale: 30 + days-before-close: 5 + stale-issue-message: >- + This issue has been automatically flagged as stale due to a lack of + recent updates. It will be closed if no further activity is + observed. We appreciate your contributions. + stale-pr-message: >- + This pull request has been automatically flagged as stale due to a + lack of recent updates. It will be closed if no further activity is + observed. We appreciate your contributions. + close-issue-message: >- + This issue has been closed due to inactivity. Please feel free to + reopen if further action is required or additional information is + provided. + close-pr-message: >- + This pull request has been closed due to inactivity. Please feel + free to reopen if further action is required or additional + information is provided. + exempt-issue-labels: in-progress + exempt-pr-labels: in-progress