diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ab9b63f..c7dad92 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,12 +13,12 @@ name: "CodeQL" on: push: - branches: [ "main" ] + branches: ["main"] pull_request: # The branches below must be a subset of the branches above - branches: [ "main" ] + branches: ["main"] schedule: - - cron: '19 6 * * 1' + - cron: "19 6 * * 1" jobs: analyze: @@ -32,43 +32,42 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript' ] + language: ["javascript"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - - name: Checkout repository - uses: actions/checkout@v3 + - name: Checkout repository + uses: actions/checkout@v3 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{matrix.language}}" + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dba760b..ed70dc5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: name: Test code strategy: matrix: - version: [18.x, 16.x, 14.x] + version: [19.x, 18.x, 16.x, 14.x] runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index 5d187f3..89ff802 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,30 @@ - # Meowclient [![Test](https://github.com/webdev03/meowclient/actions/workflows/test.yml/badge.svg)](https://github.com/webdev03/meowclient/actions/workflows/test.yml) - -

A very cool library to connect to Scratch.

-## Getting Started +

A feature-rich library to connect to Scratch.

+ +## Getting Started Follow the steps below: -### âŗ Installation +### âŗ Installation -Install Meowclient with this **Quickstart** command to install the latest version of meowclient in your `package.json`. +If you run this install command you will get the latest version of meowclient in your `package.json`. ```bash npm install meowclient ``` -This command generates a brand new project with the default features. -#### The library supports both CJS and ESM. - ## Example (async) ```javascript -import { ScratchSession } from "meowclient"; +import { ScratchSession, Profile } from "meowclient"; const session = new ScratchSession(); await session.init("user", "pass"); -const me = session.getProfile(session.username); -// next line gets html and stores it so only 1 fetch request and no .init function - recreate the object to reset it +const me = new Profile(session, session.username); console.log("My status is " + (await me.getStatus())); ``` -You might be able to use this **without even logging in by not running .init** on the session. +Some features are available without logging in if you don't run the `session.init` function. ### The CJS way (if you still use it) @@ -37,26 +32,15 @@ You might be able to use this **without even logging in by not running .init** o const { ScratchSession } = require("meowclient"); const session = new ScratchSession(); await session.init("user", "pass"); -const me = session.getProfile(session.username); -// next line gets html and stores it so only 1 fetch request and no .init function - recreate the object to reset it +const me = new Profile(session, session.username); +// User.getStatus gets the status of the user, either "New Scratcher", "Scratcher" or "Scratch Team" console.log("My status is " + (await me.getStatus())); ``` -## Awesome features - -CJS **and** ESM support powered by tsup package! -This is made with _typescript_ so you will also get .d.ts definition file and I will try my best to make good documentation! Some JSDoc comments are there too. - -## Why not _insert library name here_? +## Note -ESM support, typescript, comments parsing - -## Extra things - -I will not add any social actions to the library because then less chance of people getting banned from Scratch. +Automating social actions such as loving, favouriting, commenting, or following users is not allowed in the Scratch Terms of Use so I won't add those features to meowclient unless you have a good reason, although if you know how to use the Scratch API you can definitely make your own fetch requests with the session. ## Thanks Thanks to [Scratchclient](https://github.com/CubeyTheCube/scratchclient) and Raihan142857 ([CubeyTheCube](https://github.com/CubeyTheCube)) for a lot of the login stuff! - - diff --git a/docs/pages/ScratchSession.md b/docs/pages/ScratchSession.md deleted file mode 100644 index 8af28b8..0000000 --- a/docs/pages/ScratchSession.md +++ /dev/null @@ -1,51 +0,0 @@ -# ScratchSession - -The main part of meowclient. - -## Methods - -### init - -Initialises the `ScratchSession` to perform authenticated actions. You can perform limited actions without calling this method. - -#### Parameters - -- `user` (`string`) - The username of the user you want to log in to -- `pass` (`string`) - The password of the user you want to log in to - -### getProject - -Gets a project. - -#### Parameters - -- `id` (`number`) - The ID of the project you want to get. - -#### Returns - -This returns a `Project` class. - -### getProfile - -Gets a profile. - -#### Parameters - -- `username` (`string`) - The username of the profile you want to get. - -#### Returns - -This returns a `Profile` class. - -### getStudio - -Gets a studio. - -#### Parameters - -- `id` (`number`) - The ID of the studio you want to get. - -### logout - -Logs out of Scratch. -**Note:** Currently it still keeps `csrfToken`, `token`, and `sessionJSON` intact. If you want to re-login, use the `init` method or create a new `ScratchSession`. diff --git a/docs/pages/classes/CloudConnection.md b/docs/pages/classes/CloudConnection.md deleted file mode 100644 index 6990132..0000000 --- a/docs/pages/classes/CloudConnection.md +++ /dev/null @@ -1,59 +0,0 @@ -# CloudConnection - -The class to use cloud variables. Accessible through `Project.createCloudConnection`. - -**Note: This is also an EventEmitter!** - -## Methods - -### setVariable - -Sets a cloud variable - -#### Parameters - -- `variable` (`string`) The variable name -- `value` (`string` | `number`) The value to set the variable to - -### getVariable - -Gets a cloud variable - -#### Parameters - -- `variable` (`string`) The variable name - -#### Returns - -This returns a `string` containing the value of the variable. - -### close - -Closes the cloud connection. - -## Properties - -### variables - -Returns an object with the cloud variable data. - -### connection - -Returns a websocket connection. This uses the [ws](https://github.com/websockets/ws) library. - -## EventEmitter - -There are different events: - -- `set` (Set a variable) -- `connect` (Connect to cloud data) -- `reconnect` (Reconnect to cloud data) -- `error` (Error in WS connection) - -You can use it like this: - -```ts -CloudConnection.on("set", (data) => { - console.log(`Variable ${data.name} set to ${data.value}`); -}); -``` diff --git a/docs/pages/classes/Forums.md b/docs/pages/classes/Forums.md deleted file mode 100644 index 5a26841..0000000 --- a/docs/pages/classes/Forums.md +++ /dev/null @@ -1,91 +0,0 @@ -# Forums - -Access the Scratch forums through meowclient! - -## getForum - -Gets a forum. Accessible with `ScratchSession.getForum`. - -### Parameters - -- `id` (`number`): The id of the forum. If not provided, only a few options will work. - -### Returns - -A `Forum` object. - -## Forum - -### getTopics (Promise) - -Gets the topics in the forum. Only works when `id` is provided. - -#### Returns - -An array of `Topic` objects. - -### getTopic - -Gets a topic. - -#### Parameters - -- `id` (`number`): The id of the topic. - -#### Returns - -A `Topic` object. - -### setSignature - -Sets the user's signature - -#### Parameters - -- `content` (`string`): The content to set the signature to. - -#### Returns - -A `Topic` object. - -## Topic - -### getPosts (Promise) - -Gets the posts in the topic. - -#### Returns - -An array of `Post` objects. - -### follow (Promise) - -Follows the topic. - -#### Returns - -A `Response` object. - -### unfollow (Promise) - -Unfollows the topic. - -#### Returns - -A `Response` object. - -## Post - -- `id` (`number`): The id of the post. -- `author` (`string`): The author of the post. -- `content` (`string`): The content of the post. -- `parsableContent` (`HTMLElement`): Parsable content with `node-html-parser`. -- `time` (`Date`): The time the post was created. - -### edit (Promise) - -Edits the post. - -#### Returns - -A `Response` object. diff --git a/docs/pages/classes/Profile.md b/docs/pages/classes/Profile.md deleted file mode 100644 index f02a2e7..0000000 --- a/docs/pages/classes/Profile.md +++ /dev/null @@ -1,86 +0,0 @@ -# Profile - -The class to get and set a user's Scratch profile data. Accessible through `ScratchSession.getProfile`. - -## Functions - -### getStatus - -Gets the current status of the user. - -#### Returns - -Returns either `Scratcher`, `New Scratcher`, or `Scratch Team`. - -### getComments - -Gets the comments on the user's profile. - -#### Parameters - -- `page` (`number`) The page of comments to view - -#### Returns - -This returns an Array of `ProfileComment`s. - -```ts -[ - { - id: string, - username: string, - content: string, - apiID: string, - replies: [ - { - id: string, - username: string, - content: string, - apiID: string - }, - { - id: string, - username: string, - content: string, - apiID: string - } - ] - } -]; -``` - -### deleteComment - -Deletes a comment from the user's profile page. - -#### Parameters - -- `id` (`string` or `number`) The ID of the comment to delete. Must be `12345`, **not** `comment-12345`. - -### getUserAPI - -Gets the response from `https://api.scratch.mit.edu/users/:user`. - -#### Returns - -```ts -id: number, -username: string, -scratchteam: boolean, -history: { - joined: string -}, -profile: { - id: number, - images: { - '90x90': string, - '60x60': string, - '55x55': string, - '50x50': string, - '32x32': string - }, - status: string, - bio: string, - country: string -} -``` diff --git a/docs/pages/classes/Project.md b/docs/pages/classes/Project.md deleted file mode 100644 index e49743e..0000000 --- a/docs/pages/classes/Project.md +++ /dev/null @@ -1,133 +0,0 @@ -# Project - -Used for Scratch projects. Accessible through `ScratchSession.getProject`. - -## Methods - -### getAPIData - -Gets the API data of the project. - -#### Returns - -```ts -id: number, -title: string, -description: string, -instructions: string, -visibility: string, -public: boolean, -comments_allowed: boolean, -is_published: boolean, -author: { - id: number, - username: string, - scratchteam: boolean, - history: { - joined: string - }, - profile: { - id: null | number, // unsure about this one - images: { - '90x90': string, - '60x60': string, - '55x55': string, - '50x50': string, - '32x32': string - } - } -} -image: string, -images: { - '282x218': string, - '216x163': string, - '200x200': string, - '144x108': string, - '135x102': string, - '100x80': string -}, -history: { - created: string, - modified: string, - shared: string -}, -stats: { - views: number, - loves: number, - favorites: number, - remixes: number -}, -remix: { - parent: null | number, - root: null | number -} -``` - -### getComments - -Gets the comments on the project. - -#### Parameters - -- `offset` (`number`) The offset of comments to return -- `limit` (`number`) The limit of comments to return - -#### Returns - -An array of - -```ts -id: number; -parent_id: null | number; -commentee_id: null | number; -content: string; -datetime_created: string; -datetime_modified: string; -visibility: "visible" | "hidden"; -author: { - id: number; - username: string; - scratchteam: boolean; - image: string; -} -``` - -### setTitle - -Sets the project title (requires you to own the project). - -#### Parameters - -- `value` (`string`) The value to set the title to - -### setInstructions - -Sets the project instructions (requires you to own the project). - -#### Parameters - -- `value` (`string`) The value to set the instructions to - -### setNotesAndCredits - -Sets the project Notes and Credits (requires you to own the project). - -#### Parameters - -- `value` (`string`) The value to set the Notes and Credits to - -### unshare - -Unshares the project (requires you to own the project). - -### share - -Shares the project (requires you to own the project). - -### createCloudConnection - -Creates a cloud connection - -#### Returns - -This returns a CloudConnection class. diff --git a/docs/pages/classes/Studio.md b/docs/pages/classes/Studio.md deleted file mode 100644 index 929db9c..0000000 --- a/docs/pages/classes/Studio.md +++ /dev/null @@ -1,138 +0,0 @@ -# Studio - -Gets a studio. Accessible through `ScratchSession.getStudio`. - -## Functions - -### getAPIData - -Gets the API data for the studio. - -### setTitle - -Sets the title of the studio. - -#### Parameters - -- `value` (`string`) The value to set the title to. - -#### Returns - -A `Response` object. - -### setDescription - -Sets the description of the studio. - -#### Parameters - -- `value` (`string`) The value to set the description to. - -#### Returns - -A `Response` object. - -### inviteCurator - -Invites a user to be a curator of the studio. - -#### Parameters - -- `username` (`string`) The username of the user to invite. - -#### Returns - -A `Response` object. - -### removeCurator - -Removes a user from the studio. - -#### Parameters - -- `username` (`string`) The username of the user to remove. - -#### Returns - -A `Response` object. - -### addProject - -Adds a project to the studio. - -#### Parameters - -- `project` (`number`) The ID of the project to add. - -#### Returns - -A `Response` object. - -### removeProject - -Removes a project from the studio. - -#### Parameters - -- `project` (`number`) The ID of the project to remove. - -#### Returns - -A `Response` object. - -### getCurators - -Gets the curators of the studio. - -#### Parameters - -- `limit` (`number`) The maximum number of curators to return. -- `offset` (`number`) The offset of the curators to return. - -#### Returns - -A `Promise` that resolves to an array of `User` objects (which are curators). - -### getManagers - -Gets the managers of the studio. - -#### Parameters - -- `limit` (`number`) The maximum number of managers to return. -- `offset` (`number`) The offset of the managers to return. - -### Returns - -A `Promise` that resolves to an array of `User` objects (which are managers). - -### getProjects - -Gets the projects in the studio. - -#### Parameters - -- `limit` (`number`) The maximum number of projects to return. -- `offset` (`number`) The offset of the projects to return. - -#### Returns - -A `Promise` that resolves to an array containing: - -```ts -interface OldProjectResponse { - id: number; - title: string; - image: string; - creator_id: number; - username: string; - avatar: { - "90x90": string; - "60x60": string; - "55x55": string; - "50x50": string; - "32x32": string; - }; - actor_id: number; -} -``` diff --git a/docs/pages/examples/forums/changeSignature.md b/docs/pages/examples/forums/changeSignature.md new file mode 100644 index 0000000..92c7f62 --- /dev/null +++ b/docs/pages/examples/forums/changeSignature.md @@ -0,0 +1,11 @@ +# Change Signature + +This example shows how to change your forums signature with meowclient. + +```ts +import { ScratchSession } from "meowclient"; +const session = new ScratchSession(); +await session.init("user", "pass"); +const forum = session.getForum(); +await forum.setSignature(`I am ${session.username}!`); +``` diff --git a/docs/pages/examples/forums/topicsAndPosts.md b/docs/pages/examples/forums/topicsAndPosts.md new file mode 100644 index 0000000..6ef8769 --- /dev/null +++ b/docs/pages/examples/forums/topicsAndPosts.md @@ -0,0 +1,32 @@ +# Topics and Posts + +This example shows how to get topics in a subforum. To get the subforum ID, go to the page of the subforum (for example, [https://scratch.mit.edu/discuss/31](https://scratch.mit.edu/discuss/31) for the Advanced Topics subforum) and get the numbers at the end of the URL (for the Advanced Topics it is 31). + +```ts +import { ScratchSession } from "meowclient"; +const session = new ScratchSession(); +await session.init("user", "pass"); + +const subforumID = 31; +const forum = session.getForum(subforumID); +const topics = await forum.getTopics(); +for (const topic of topics) { + topic.title; // The title of the topic + topic.id; // The ID of the topic + topic.replyCount; // The number of replies in the topic + + await topic.follow(); // Follow the topic + await topic.unfollow(); // Unfollow the topic + + const posts = await topic.getPosts(); + for (const post of posts) { + post.id; // The ID of the post + post.content; // The content of the post + post.parsableContent; // The content of the post that can be parsed (uses node-html-parser) + post.author; // The username of the post author + post.time; // The time when the post was made + + await post.edit(`This is a post by ${post.author}!`); // Edits the post + } +} +``` diff --git a/docs/pages/examples/getSessionJSON.md b/docs/pages/examples/getSessionJSON.md new file mode 100644 index 0000000..a4afc74 --- /dev/null +++ b/docs/pages/examples/getSessionJSON.md @@ -0,0 +1,10 @@ +# Get Session JSON + +This example shows how to get your session JSON. + +```ts +import { ScratchSession } from "meowclient"; +const session = new ScratchSession(); +await session.init("user", "pass"); +console.log(session.sessionJSON); +``` diff --git a/docs/pages/index.md b/docs/pages/index.md index c03b468..8f60523 100644 --- a/docs/pages/index.md +++ b/docs/pages/index.md @@ -23,13 +23,13 @@ const { ScratchSession } = require("meowclient"); A basic starter program: ```js -import { ScratchSession } from "meowclient"; -(async () => { - const session = new ScratchSession(); - await session.init("user", "pass"); // change these to your scratch login credentials - const me = session.getProfile(session.username); - console.log("My status is " + (await me.getStatus())); -})(); +import { ScratchSession, Profile } from "meowclient"; +const session = new ScratchSession(); +await session.init("user", "pass"); // change these to your scratch login credentials +const me = new Profile(session, session.username); +console.log("My status is " + (await me.getStatus())); ``` -Documentation is **work in progress** and not all things have been added yet. +If you use VS Code, you should be able to use the JSDoc documentation. If you use TypeScript you can also take full advantage of the types. + +This will soon be a collection of examples for using meowclient. If you cannot find what you want, you can go through the [source code](https://github.com/webdev03/meowclient) or you can ask for help in the [official meowclient forum topic](https://scratch.mit.edu/discuss/topic/574321). diff --git a/package.json b/package.json index f1f11d6..22d1150 100644 --- a/package.json +++ b/package.json @@ -12,24 +12,26 @@ "build": "tsup src/index.ts --format cjs,esm --minify --dts", "build:watch": "tsup src/index.ts --format cjs,esm --minify --dts --watch", "prepublish": "tsup src/index.ts --format cjs,esm --minify --dts", - "test": "tsup src/index.ts --format cjs,esm --minify && tap", + "test": "tap --no-coverage --node-arg=--loader=ts-node/esm --node-arg=--experimental-specifier-resolution=node", "lint": "prettier --check .", "format": "prettier --write ." }, "author": "", "license": "MIT", "devDependencies": { - "@types/node": "^17.0.14", - "@types/ws": "^8.2.2", - "prettier": "^2.5.1", - "tap": "^16.1.0", - "tsup": "^5.11.13", - "typescript": "^4.5.5" + "@types/node": "^17.0.45", + "@types/tap": "^15.0.7", + "@types/ws": "^8.5.3", + "prettier": "^2.8.0", + "tap": "^16.3.2", + "ts-node": "^10.9.1", + "tsup": "^6.5.0", + "typescript": "^4.9.3" }, "dependencies": { "cross-fetch": "^3.1.5", - "node-html-parser": "^5.2.0", - "ws": "^8.4.2" + "node-html-parser": "^5.4.2", + "ws": "^8.11.0" }, "exports": { ".": { @@ -42,5 +44,6 @@ "engines": { "node": ">13" }, - "engineStrict": true + "engineStrict": true, + "sideEffects": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2525db..4f0b071 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,66 +1,71 @@ lockfileVersion: 5.4 specifiers: - '@types/node': ^17.0.14 - '@types/ws': ^8.2.2 + '@types/node': ^17.0.45 + '@types/tap': ^15.0.7 + '@types/ws': ^8.5.3 cross-fetch: ^3.1.5 - node-html-parser: ^5.2.0 - prettier: ^2.5.1 - tap: ^16.1.0 - tsup: ^5.11.13 - typescript: ^4.5.5 - ws: ^8.4.2 + node-html-parser: ^5.4.2 + prettier: ^2.8.0 + tap: ^16.3.2 + ts-node: ^10.9.1 + tsup: ^6.5.0 + typescript: ^4.9.3 + ws: ^8.11.0 dependencies: cross-fetch: 3.1.5 - node-html-parser: 5.2.0 - ws: 8.4.2 + node-html-parser: 5.4.2 + ws: 8.11.0 devDependencies: - '@types/node': 17.0.14 - '@types/ws': 8.2.2 - prettier: 2.5.1 - tap: 16.1.0_typescript@4.5.5 - tsup: 5.11.13_typescript@4.5.5 - typescript: 4.5.5 + '@types/node': 17.0.45 + '@types/tap': 15.0.7 + '@types/ws': 8.5.3 + prettier: 2.8.0 + tap: 16.3.2_2dtigtkb225m7ii7q45utxqwgi + ts-node: 10.9.1_7cep2inysldxstbcrxlp3njwym + tsup: 6.5.0_2dtigtkb225m7ii7q45utxqwgi + typescript: 4.9.3 packages: - /@ampproject/remapping/2.1.2: - resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.17.9 + '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.17.7: - resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} + /@babel/compat-data/7.20.1: + resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.17.9: - resolution: {integrity: sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==} + /@babel/core/7.20.2: + resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.1.2 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.9 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.9 - '@babel/parser': 7.17.9 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 - convert-source-map: 1.8.0 - debug: 4.3.3 + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.1 + '@babel/parser': 7.20.3 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + convert-source-map: 1.9.0 + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.1 semver: 6.3.0 @@ -68,160 +73,189 @@ packages: - supports-color dev: true - /@babel/generator/7.17.9: - resolution: {integrity: sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==} + /@babel/generator/7.20.4: + resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 + '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 - source-map: 0.5.7 dev: true - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.9: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2: + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.17.7 - '@babel/core': 7.17.9 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.3 + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 dev: true - /@babel/helper-function-name/7.17.9: - resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 dev: true - /@babel/helper-hoist-variables/7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 dev: true - /@babel/helper-module-imports/7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 dev: true - /@babel/helper-module-transforms/7.17.7: - resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} + /@babel/helper-module-transforms/7.20.2: + resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-simple-access/7.17.7: - resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 dev: true - /@babel/helper-split-export-declaration/7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.17.9: - resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} + /@babel/helpers/7.20.1: + resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight/7.17.9: - resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser/7.17.9: - resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} + /@babel/parser/7.20.3: + resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.20.2 dev: true - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.9 - '@babel/types': 7.17.0 + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 dev: true - /@babel/traverse/7.17.9: - resolution: {integrity: sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==} + /@babel/traverse/7.20.1: + resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.9 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.9 - '@babel/types': 7.17.0 - debug: 4.3.3 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} + /@babel/types/7.20.2: + resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 dev: true + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@esbuild/android-arm/0.15.15: + resolution: {integrity: sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.15: + resolution: {integrity: sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -238,20 +272,49 @@ packages: engines: {node: '>=8'} dev: true - /@jridgewell/resolve-uri/3.0.6: - resolution: {integrity: sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==} + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/sourcemap-codec/1.4.11: - resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 dev: true /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.0.6 - '@jridgewell/sourcemap-codec': 1.4.11 + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 dev: true /@nodelib/fs.scandir/2.1.5: @@ -275,14 +338,47 @@ packages: fastq: 1.13.0 dev: true - /@types/node/17.0.14: - resolution: {integrity: sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng==} + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@types/ws/8.2.2: - resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==} + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/node/17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: true + + /@types/tap/15.0.7: + resolution: {integrity: sha512-TTMajw4gxQfFgYbhXhy/Tb2OiNcwS+4oP/9yp1/GdU0pFJo3wtnkYhRgmQy39ksh+rnoa0VrPHJ4Tuv2cLNQ5A==} + dependencies: + '@types/node': 17.0.45 + dev: true + + /@types/ws/8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 17.0.14 + '@types/node': 17.0.45 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true dev: true /aggregate-error/3.1.0: @@ -293,11 +389,6 @@ packages: indent-string: 4.0.0 dev: true - /ansi-regex/2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} - engines: {node: '>=0.10.0'} - dev: true - /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -318,11 +409,11 @@ packages: dev: true /any-promise/1.3.0: - resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 @@ -333,11 +424,15 @@ packages: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} engines: {node: '>=8'} dependencies: - default-require-extensions: 3.0.0 + default-require-extensions: 3.0.1 dev: true /archy/1.0.0: - resolution: {integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=} + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true /argparse/1.0.10: @@ -371,7 +466,7 @@ packages: dev: true /boolbase/1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false /brace-expansion/1.1.11: @@ -388,34 +483,33 @@ packages: fill-range: 7.0.1 dev: true - /browserslist/4.20.3: - resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001332 - electron-to-chromium: 1.4.118 - escalade: 3.1.1 - node-releases: 2.0.3 - picocolors: 1.0.0 + caniuse-lite: 1.0.30001434 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 dev: true /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /bundle-require/3.0.4_esbuild@0.14.18: - resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} + /bundle-require/3.1.2_esbuild@0.15.15: + resolution: {integrity: sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.13' dependencies: - esbuild: 0.14.18 + esbuild: 0.15.15 load-tsconfig: 0.2.3 dev: true - /cac/6.7.12: - resolution: {integrity: sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==} + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true @@ -434,8 +528,8 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite/1.0.30001332: - resolution: {integrity: sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==} + /caniuse-lite/1.0.30001434: + resolution: {integrity: sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==} dev: true /chalk/2.4.2: @@ -451,7 +545,7 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.2 + anymatch: 3.1.3 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -497,7 +591,7 @@ packages: dev: true /color-name/1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true /color-name/1.1.4: @@ -515,17 +609,19 @@ packages: dev: true /commondir/1.0.1: - resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true - /convert-source-map/1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} - dependencies: - safe-buffer: 5.1.2 + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /cross-fetch/3.1.5: @@ -545,23 +641,23 @@ packages: which: 2.0.2 dev: true - /css-select/4.2.1: - resolution: {integrity: sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==} + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: boolbase: 1.0.0 - css-what: 5.1.0 - domhandler: 4.3.0 + css-what: 6.1.0 + domhandler: 4.3.1 domutils: 2.8.0 - nth-check: 2.0.1 + nth-check: 2.1.1 dev: false - /css-what/5.1.0: - resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} dev: false - /debug/4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -573,12 +669,12 @@ packages: dev: true /decamelize/1.2.0: - resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /default-require-extensions/3.0.0: - resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} + /default-require-extensions/3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} dependencies: strip-bom: 4.0.0 @@ -596,35 +692,35 @@ packages: path-type: 4.0.0 dev: true - /dom-serializer/1.3.2: - resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: - domelementtype: 2.2.0 - domhandler: 4.3.0 + domelementtype: 2.3.0 + domhandler: 4.3.1 entities: 2.2.0 dev: false - /domelementtype/2.2.0: - resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false - /domhandler/4.3.0: - resolution: {integrity: sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==} + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: - domelementtype: 2.2.0 + domelementtype: 2.3.0 dev: false /domutils/2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: - dom-serializer: 1.3.2 - domelementtype: 2.2.0 - domhandler: 4.3.0 + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 dev: false - /electron-to-chromium/1.4.118: - resolution: {integrity: sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==} + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true /emoji-regex/8.0.0: @@ -639,8 +735,17 @@ packages: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: true - /esbuild-android-arm64/0.14.18: - resolution: {integrity: sha512-AuE8vIwc6QLquwykyscFk0Ji3RFczoOvjka64FJlcjLLhD6VsS584RYlQrSnPpRkv69PunUvyrBoEF7JFTJijg==} + /esbuild-android-64/0.15.15: + resolution: {integrity: sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.15: + resolution: {integrity: sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -648,8 +753,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.18: - resolution: {integrity: sha512-nN1XziZtDy8QYOggaXC3zu0vVh8YJpS8Bol7bHaxx0enTLDSFBCXUUJEKYpmAAJ4OZRPgjXv8NzEHHQWQvLzXg==} + /esbuild-darwin-64/0.15.15: + resolution: {integrity: sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -657,8 +762,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.18: - resolution: {integrity: sha512-v0i2n6TCsbxco/W1fN8RgQt3RW00Q9zJO2eqiAdmLWg6Hx0HNHloZyfhF11i7nMUUgW8r5n++ZweIXjAFPE/gQ==} + /esbuild-darwin-arm64/0.15.15: + resolution: {integrity: sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -666,8 +771,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.18: - resolution: {integrity: sha512-XLyJZTWbSuQJOqw867tBxvto6GjxULvWZYKs6RFHYQPCqgQ0ODLRtBmp4Fqqpde52yOe45npaaoup9IXNfr32A==} + /esbuild-freebsd-64/0.15.15: + resolution: {integrity: sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -675,8 +780,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.18: - resolution: {integrity: sha512-0ItfrR8hePnDcUXxUQxY+VfICcBfeMJCdK6mcNUXnXw6LyHjyUYXWpFXF+J18pg1/YUWRWO1HbsJ7FEwELcQIA==} + /esbuild-freebsd-arm64/0.15.15: + resolution: {integrity: sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -684,8 +789,8 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.18: - resolution: {integrity: sha512-mnG84D9NsEsoQdBpBT0IsFjm5iAwnd81SP4tRMXZLl09lPvIWjHHSq6LDlb4+L5H5K5y68WC//X5Dr2MtNY3DQ==} + /esbuild-linux-32/0.15.15: + resolution: {integrity: sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -693,8 +798,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.18: - resolution: {integrity: sha512-HvExRtkeA8l/p+7Lf6aBrnLH+jTCFJTUMJxGKExh2RD8lCXGTeDJFyP+BOEetP80fuuH+Syj79+LVQ9MihdBsg==} + /esbuild-linux-64/0.15.15: + resolution: {integrity: sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -702,8 +807,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.18: - resolution: {integrity: sha512-+ZL8xfXVNaeaZ2Kxqlw2VYZWRDZ7NSK4zOV9GKNAtkkWURLsPUU84aUOBatRe9BH1O5FDo3LLQSlaA04ed6lhA==} + /esbuild-linux-arm/0.15.15: + resolution: {integrity: sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -711,8 +816,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.18: - resolution: {integrity: sha512-CCWmilODE1ckw+M7RVqoqKWA4UB0alCyK2bv0ikEeEAwkzinlJeoe94t9CnT/ECSQ2sL+C16idsr+aUviGp7sg==} + /esbuild-linux-arm64/0.15.15: + resolution: {integrity: sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -720,8 +825,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.18: - resolution: {integrity: sha512-8LjO4+6Vxz5gbyCHO4OONYMF689nLderCtzb8lG1Bncs4ZXHpo6bjvuWeTMRbGUkvAhp+P6hMTzia7RHOC53wQ==} + /esbuild-linux-mips64le/0.15.15: + resolution: {integrity: sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -729,8 +834,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.18: - resolution: {integrity: sha512-0OJk/6iYEmF1J7LXY6+cqf6Ga5vG4an7n1nubTKce7kYqaTyNGfYcTjDZce6lnDVlZTJtwntIMszq1+ZX7Kenw==} + /esbuild-linux-ppc64le/0.15.15: + resolution: {integrity: sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -738,8 +843,17 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.18: - resolution: {integrity: sha512-UNY7YKZHjY31KcNanJK4QaT2/aoIQyS+jViP3QuDRIoYAogRnc6WydylzIkkEzGMaC4fzaXOmQ8fxwpLAXK4Yg==} + /esbuild-linux-riscv64/0.15.15: + resolution: {integrity: sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.15: + resolution: {integrity: sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -747,8 +861,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.18: - resolution: {integrity: sha512-wE/2xT9KNzLCfEBw24YbVmMmXH92cFIzrRPUlwWH9dIizjvEYYcyQ+peTMVkqzUum7pdlVLZ2CDDqAaZo/nW/w==} + /esbuild-netbsd-64/0.15.15: + resolution: {integrity: sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -756,8 +870,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.18: - resolution: {integrity: sha512-vdymE2jyuH/FRmTvrguCYSrq81/rUwuhMYyvt/6ibv9ac7xQ674c8qTdT+RH73sR9/2WUD/NsYxrBA/wUVTxcg==} + /esbuild-openbsd-64/0.15.15: + resolution: {integrity: sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -765,8 +879,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.18: - resolution: {integrity: sha512-X/Tesy6K1MdJF1d5cbzFDxrIMMn0ye+VgTQRI8P5Vo2CcKxOdckwsKUwpRAvg+VDZ6MxrSOTYS9OOoggPUjxTg==} + /esbuild-sunos-64/0.15.15: + resolution: {integrity: sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -774,8 +888,8 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.18: - resolution: {integrity: sha512-glG23I/JzCL4lu7DWFUtVwqFwNwlL0g+ks+mcjjUisHcINoSXTeCNToUN0bHhzn6IlXXnggNQ38Ew/idHPM8+g==} + /esbuild-windows-32/0.15.15: + resolution: {integrity: sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -783,8 +897,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.18: - resolution: {integrity: sha512-zEiFKHgV/3z14wsVamV98/5mxeOwz+ecyg0pD3fWcBz9j4EOIT1Tg47axypD4QLwiKFvve9mUBYX1cD99qxOyw==} + /esbuild-windows-64/0.15.15: + resolution: {integrity: sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -792,8 +906,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.18: - resolution: {integrity: sha512-Mh8lZFcPLat13dABN7lZThGUOn9YxoH5RYkhBq0U3WqQohHzKRhllYh7ibFixnkpMLnv8OZEbl8bGLMy03MpfA==} + /esbuild-windows-arm64/0.15.15: + resolution: {integrity: sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -801,30 +915,34 @@ packages: dev: true optional: true - /esbuild/0.14.18: - resolution: {integrity: sha512-vCUoISSltnX7ax01w70pWOSQT+e55o+2P/a+A9MSTukJAt3T4aDZajcjeG4fnZbkvOEv+dkKgdkvljz6vVQD4A==} + /esbuild/0.15.15: + resolution: {integrity: sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-arm64: 0.14.18 - esbuild-darwin-64: 0.14.18 - esbuild-darwin-arm64: 0.14.18 - esbuild-freebsd-64: 0.14.18 - esbuild-freebsd-arm64: 0.14.18 - esbuild-linux-32: 0.14.18 - esbuild-linux-64: 0.14.18 - esbuild-linux-arm: 0.14.18 - esbuild-linux-arm64: 0.14.18 - esbuild-linux-mips64le: 0.14.18 - esbuild-linux-ppc64le: 0.14.18 - esbuild-linux-s390x: 0.14.18 - esbuild-netbsd-64: 0.14.18 - esbuild-openbsd-64: 0.14.18 - esbuild-sunos-64: 0.14.18 - esbuild-windows-32: 0.14.18 - esbuild-windows-64: 0.14.18 - esbuild-windows-arm64: 0.14.18 + '@esbuild/android-arm': 0.15.15 + '@esbuild/linux-loong64': 0.15.15 + esbuild-android-64: 0.15.15 + esbuild-android-arm64: 0.15.15 + esbuild-darwin-64: 0.15.15 + esbuild-darwin-arm64: 0.15.15 + esbuild-freebsd-64: 0.15.15 + esbuild-freebsd-arm64: 0.15.15 + esbuild-linux-32: 0.15.15 + esbuild-linux-64: 0.15.15 + esbuild-linux-arm: 0.15.15 + esbuild-linux-arm64: 0.15.15 + esbuild-linux-mips64le: 0.15.15 + esbuild-linux-ppc64le: 0.15.15 + esbuild-linux-riscv64: 0.15.15 + esbuild-linux-s390x: 0.15.15 + esbuild-netbsd-64: 0.15.15 + esbuild-openbsd-64: 0.15.15 + esbuild-sunos-64: 0.15.15 + esbuild-windows-32: 0.15.15 + esbuild-windows-64: 0.15.15 + esbuild-windows-arm64: 0.15.15 dev: true /escalade/3.1.1: @@ -833,7 +951,7 @@ packages: dev: true /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true @@ -849,7 +967,7 @@ packages: dev: true /events-to-array/1.1.2: - resolution: {integrity: sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=} + resolution: {integrity: sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==} dev: true /execa/5.1.1: @@ -863,19 +981,19 @@ packages: merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 strip-final-newline: 2.0.0 dev: true - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.5 dev: true /fastq/1.13.0: @@ -909,7 +1027,7 @@ packages: dev: true /findit/2.0.0: - resolution: {integrity: sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=} + resolution: {integrity: sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==} dev: true /foreground-child/2.0.0: @@ -917,7 +1035,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: cross-spawn: 7.0.3 - signal-exit: 3.0.6 + signal-exit: 3.0.7 dev: true /fromentries/1.3.2: @@ -925,11 +1043,11 @@ packages: dev: true /fs-exists-cached/1.0.0: - resolution: {integrity: sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=} + resolution: {integrity: sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==} dev: true /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true /fsevents/2.3.2: @@ -977,7 +1095,18 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -993,7 +1122,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.11 + fast-glob: 3.2.12 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -1004,7 +1133,7 @@ packages: dev: true /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true @@ -1041,7 +1170,7 @@ packages: dev: true /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true @@ -1051,7 +1180,7 @@ packages: dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -1069,7 +1198,7 @@ packages: dev: true /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true @@ -1096,7 +1225,7 @@ packages: dev: true /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true /is-windows/1.0.2: @@ -1105,7 +1234,7 @@ packages: dev: true /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /istanbul-lib-coverage/3.2.0: @@ -1124,7 +1253,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.9 + '@babel/core': 7.20.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -1132,17 +1261,16 @@ packages: - supports-color dev: true - /istanbul-lib-processinfo/2.0.2: - resolution: {integrity: sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==} + /istanbul-lib-processinfo/2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} engines: {node: '>=8'} dependencies: archy: 1.0.0 cross-spawn: 7.0.3 istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 p-map: 3.0.0 rimraf: 3.0.2 - uuid: 3.4.0 + uuid: 8.3.2 dev: true /istanbul-lib-report/3.0.0: @@ -1158,23 +1286,23 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.3 + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.4: - resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 dev: true - /jackspeak/1.4.1: - resolution: {integrity: sha512-npN8f+M4+IQ8xD3CcWi3U62VQwKlT3Tj4GxbdT/fYTmeogD9eBF9OFdpoFG/VPNoshRjPUijdkp/p2XrzUHaVg==} + /jackspeak/1.4.2: + resolution: {integrity: sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==} engines: {node: '>=8'} dependencies: cliui: 7.0.4 @@ -1217,19 +1345,19 @@ packages: bind-obj-methods: 3.0.0 diff: 4.0.2 function-loop: 2.0.1 - minipass: 3.1.6 + minipass: 3.3.6 own-or: 1.0.0 own-or-env: 1.0.2 - signal-exit: 3.0.6 - stack-utils: 2.0.5 - tap-parser: 11.0.1 - tap-yaml: 1.0.0 + signal-exit: 3.0.7 + stack-utils: 2.0.6 + tap-parser: 11.0.2 + tap-yaml: 1.0.2 tcompare: 5.0.7 trivial-deferred: 1.0.1 dev: true - /lilconfig/2.0.4: - resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true @@ -1250,7 +1378,11 @@ packages: dev: true /lodash.flattendeep/4.4.0: - resolution: {integrity: sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=} + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + + /lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true /make-dir/3.1.0: @@ -1260,6 +1392,10 @@ packages: semver: 6.3.0 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -1269,8 +1405,8 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch/4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 @@ -1282,14 +1418,14 @@ packages: engines: {node: '>=6'} dev: true - /minimatch/3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minipass/3.1.6: - resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + /minipass/3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 @@ -1325,10 +1461,10 @@ packages: whatwg-url: 5.0.0 dev: false - /node-html-parser/5.2.0: - resolution: {integrity: sha512-fmiwLfQu+J2A0zjwSEkztSHexAf5qq/WoiL/Hgo1K7JpfEP+OGWY5maG0kGaM+IFVdixF/1QbyXaQ3h4cGfeLw==} + /node-html-parser/5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} dependencies: - css-select: 4.2.1 + css-select: 4.3.0 he: 1.2.0 dev: false @@ -1339,8 +1475,8 @@ packages: process-on-spawn: 1.0.0 dev: true - /node-releases/2.0.3: - resolution: {integrity: sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==} + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true /normalize-path/3.0.0: @@ -1355,8 +1491,8 @@ packages: path-key: 3.1.1 dev: true - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: false @@ -1369,27 +1505,27 @@ packages: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 caching-transform: 4.0.0 - convert-source-map: 1.8.0 + convert-source-map: 1.9.0 decamelize: 1.2.0 find-cache-dir: 3.3.2 find-up: 4.1.0 foreground-child: 2.0.0 get-package-type: 0.1.0 - glob: 7.1.6 + glob: 7.2.3 istanbul-lib-coverage: 3.2.0 istanbul-lib-hook: 3.0.0 istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.2 + istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 + istanbul-reports: 3.1.5 make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 process-on-spawn: 1.0.0 resolve-from: 5.0.0 rimraf: 3.0.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 spawn-wrap: 2.0.0 test-exclude: 6.0.0 yargs: 15.4.1 @@ -1398,12 +1534,12 @@ packages: dev: true /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true @@ -1427,7 +1563,7 @@ packages: dev: true /own-or/1.0.0: - resolution: {integrity: sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=} + resolution: {integrity: sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==} dev: true /p-limit/2.3.0: @@ -1472,7 +1608,7 @@ packages: dev: true /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true @@ -1507,21 +1643,25 @@ packages: find-up: 4.1.0 dev: true - /postcss-load-config/3.1.1: - resolution: {integrity: sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==} + /postcss-load-config/3.1.4_ts-node@10.9.1: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: + postcss: '>=8.0.9' ts-node: '>=9.0.0' peerDependenciesMeta: + postcss: + optional: true ts-node: optional: true dependencies: - lilconfig: 2.0.4 + lilconfig: 2.0.6 + ts-node: 10.9.1_7cep2inysldxstbcrxlp3njwym yaml: 1.10.2 dev: true - /prettier/2.5.1: - resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} + /prettier/2.8.0: + resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -1550,14 +1690,14 @@ packages: dev: true /release-zalgo/1.0.0: - resolution: {integrity: sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=} + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} dependencies: es6-error: 4.1.1 dev: true /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true @@ -1579,12 +1719,12 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.1.6 + glob: 7.2.3 dev: true - /rollup/2.67.0: - resolution: {integrity: sha512-W83AaERwvDiHwHEF/dfAfS3z1Be5wf7n+pO3ZAO5IQadCT2lBTr7WQ2MwZZe+nodbD+n3HtC4OCOAdsOPPcKZQ==} - engines: {node: '>=10.0.0'} + /rollup/3.4.0: + resolution: {integrity: sha512-4g8ZrEFK7UbDvy3JF+d5bLiC8UKkS3n/27/cnVeESwB1LVPl6MoPL32/6+SCQ1vHTp6Mvp2veIHtwELhi+uXEw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 @@ -1596,17 +1736,13 @@ packages: queue-microtask: 1.2.3 dev: true - /safe-buffer/5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true /set-blocking/2.0.0: - resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true /shebang-command/2.0.0: @@ -1621,8 +1757,8 @@ packages: engines: {node: '>=8'} dev: true - /signal-exit/3.0.6: - resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true /slash/3.0.0: @@ -1637,19 +1773,16 @@ packages: source-map: 0.6.1 dev: true - /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} - engines: {node: '>=0.10.0'} - dev: true - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + /source-map/0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 dev: true /spawn-wrap/2.0.0: @@ -1660,16 +1793,16 @@ packages: is-windows: 1.0.2 make-dir: 3.1.0 rimraf: 3.0.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 which: 2.0.2 dev: true /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 @@ -1684,13 +1817,6 @@ packages: strip-ansi: 6.0.1 dev: true - /strip-ansi/3.0.1: - resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1708,8 +1834,8 @@ packages: engines: {node: '>=6'} dev: true - /sucrase/3.20.3: - resolution: {integrity: sha512-azqwq0/Bs6RzLAdb4dXxsCgMtAaD2hzmUr4UhSfsxO46JFPAwMnnb441B/qsudZiS6Ylea3JXZe3Q497lsgXzQ==} + /sucrase/3.29.0: + resolution: {integrity: sha512-bZPAuGA5SdFHuzqIhTAqt9fvNEo9rESqXIG3oiKdF8K4UmkQxC4KlNL3lVyAErXp+mPvUqZ5l13qx6TrDIGf3A==} engines: {node: '>=8'} hasBin: true dependencies: @@ -1741,35 +1867,35 @@ packages: hasBin: true dependencies: color-support: 1.1.3 - debug: 4.3.3 + debug: 4.3.4 diff: 4.0.2 escape-string-regexp: 2.0.0 - glob: 7.1.6 - tap-parser: 11.0.1 - tap-yaml: 1.0.0 - unicode-length: 2.0.2 + glob: 7.2.3 + tap-parser: 11.0.2 + tap-yaml: 1.0.2 + unicode-length: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /tap-parser/11.0.1: - resolution: {integrity: sha512-5ow0oyFOnXVSALYdidMX94u0GEjIlgc/BPFYLx0yRh9hb8+cFGNJqJzDJlUqbLOwx8+NBrIbxCWkIQi7555c0w==} + /tap-parser/11.0.2: + resolution: {integrity: sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==} engines: {node: '>= 8'} hasBin: true dependencies: events-to-array: 1.1.2 - minipass: 3.1.6 - tap-yaml: 1.0.0 + minipass: 3.3.6 + tap-yaml: 1.0.2 dev: true - /tap-yaml/1.0.0: - resolution: {integrity: sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==} + /tap-yaml/1.0.2: + resolution: {integrity: sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==} dependencies: yaml: 1.10.2 dev: true - /tap/16.1.0_typescript@4.5.5: - resolution: {integrity: sha512-EFERYEEDCLjvsT+B+z/qAVuxh5JPEmtn0aGh1ZT/2BN5nVLm6VbcL9fR/Y2FtsxvHuEC3Q2xLc1n1h7mnWVP9w==} + /tap/16.3.2_2dtigtkb225m7ii7q45utxqwgi: + resolution: {integrity: sha512-4MWMObR8unbv5gAHHVW9F0MNk3opQMnLusSWvt4KBAnKmkwpBRKIfNF64fimQbcR4y9a7U9ISV7pCldlV3J8Pw==} engines: {node: '>=12'} hasBin: true peerDependencies: @@ -1791,23 +1917,24 @@ packages: findit: 2.0.0 foreground-child: 2.0.0 fs-exists-cached: 1.0.0 - glob: 7.1.6 + glob: 7.2.3 isexe: 2.0.0 - istanbul-lib-processinfo: 2.0.2 - jackspeak: 1.4.1 + istanbul-lib-processinfo: 2.0.3 + jackspeak: 1.4.2 libtap: 1.4.0 - minipass: 3.1.6 + minipass: 3.3.6 mkdirp: 1.0.4 nyc: 15.1.0 opener: 1.5.2 rimraf: 3.0.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 source-map-support: 0.5.21 tap-mocha-reporter: 5.0.3 - tap-parser: 11.0.1 - tap-yaml: 1.0.0 + tap-parser: 11.0.2 + tap-yaml: 1.0.2 tcompare: 5.0.7 - typescript: 4.5.5 + ts-node: 10.9.1_7cep2inysldxstbcrxlp3njwym + typescript: 4.9.3 which: 2.0.2 transitivePeerDependencies: - supports-color @@ -1831,12 +1958,12 @@ packages: engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.1.6 - minimatch: 3.0.4 + glob: 7.2.3 + minimatch: 3.1.2 dev: true /thenify-all/1.6.0: - resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 @@ -1849,7 +1976,7 @@ packages: dev: true /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true @@ -1861,46 +1988,90 @@ packages: dev: true /tr46/0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false + /tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.1.1 + dev: true + /tree-kill/1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true /trivial-deferred/1.0.1: - resolution: {integrity: sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=} + resolution: {integrity: sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==} dev: true /ts-interface-checker/0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tsup/5.11.13_typescript@4.5.5: - resolution: {integrity: sha512-NVMK01gVmojZn7+iZwxRK1CzW2BIabaVMyEjs7Nm9lm4DrSf7IAqs2F3fg0vT7rH72x1cIBsW9U/TlWrCvHVQQ==} + /ts-node/10.9.1_7cep2inysldxstbcrxlp3njwym: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true 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 + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 17.0.45 + acorn: 8.8.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsup/6.5.0_2dtigtkb225m7ii7q45utxqwgi: + resolution: {integrity: sha512-36u82r7rYqRHFkD15R20Cd4ercPkbYmuvRkz3Q1LCm5BsiFNUgpo36zbjVhCOgvjyxNBWNKHsaD5Rl8SykfzNA==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 typescript: ^4.1.0 peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true typescript: optional: true dependencies: - bundle-require: 3.0.4_esbuild@0.14.18 - cac: 6.7.12 + bundle-require: 3.1.2_esbuild@0.15.15 + cac: 6.7.14 chokidar: 3.5.3 - debug: 4.3.3 - esbuild: 0.14.18 + debug: 4.3.4 + esbuild: 0.15.15 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.1 + postcss-load-config: 3.1.4_ts-node@10.9.1 resolve-from: 5.0.0 - rollup: 2.67.0 - source-map: 0.7.3 - sucrase: 3.20.3 + rollup: 3.4.0 + source-map: 0.8.0-beta.0 + sucrase: 3.29.0 tree-kill: 1.2.2 - typescript: 4.5.5 + typescript: 4.9.3 transitivePeerDependencies: - supports-color - ts-node @@ -1917,38 +2088,63 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript/4.5.5: - resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} + /typescript/4.9.3: + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /unicode-length/2.0.2: - resolution: {integrity: sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==} + /unicode-length/2.1.0: + resolution: {integrity: sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==} dependencies: punycode: 2.1.1 - strip-ansi: 3.0.1 dev: true - /uuid/3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true /webidl-conversions/3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false + /webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + /whatwg-url/5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: false + /whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + /which-module/2.0.0: - resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true /which/2.0.2: @@ -1978,7 +2174,7 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true /write-file-atomic/3.0.3: @@ -1986,12 +2182,12 @@ packages: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 - signal-exit: 3.0.6 + signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 dev: true - /ws/8.4.2: - resolution: {integrity: sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==} + /ws/8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2040,3 +2236,8 @@ packages: y18n: 4.0.3 yargs-parser: 18.1.3 dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/src/ScratchSession.ts b/src/ScratchSession.ts index ff25fe1..79b37eb 100644 --- a/src/ScratchSession.ts +++ b/src/ScratchSession.ts @@ -1,14 +1,8 @@ -// manages authentication, and is the main handler of every other function -import Profile from "./classes/Profile"; -import Project from "./classes/Project"; -import Studio from "./classes/Studio"; -import Forum from "./classes/forums/Forum"; - import { SessionJSON, UserAgent } from "./Consts"; import fetch from "cross-fetch"; - +import { createHash } from "node:crypto"; /** - * Logs into Scratch + * Manages a Scratch session. */ class ScratchSession { username: string; @@ -18,9 +12,9 @@ class ScratchSession { sessionJSON: SessionJSON; /** - * Sets up the ScratchSession to use authenticated functions - * @param user The username of the user you want to log in to - * @param pass The password of the user you want to log in to + * Sets up the ScratchSession to use authenticated functions. + * @param user The username of the user you want to log in to. + * @param pass The password of the user you want to log in to. */ async init(user: string, pass: string) { this.username = user; @@ -76,43 +70,41 @@ class ScratchSession { } /** - * Gets a profile - * @param username The username of the profile you want to get - * @returns {Profile} The profile of the user - */ - getProfile(username: string): Profile { - return new Profile({ username: username, session: this }); - } - - /** - * Gets a project - * @param id The project ID - * @returns {Project} The project - */ - getProject(id: number): Project { - return new Project({ id: id, session: this }); - } - - /** - * Gets a studio - * @param id The studio ID - * @returns {Studio} The studio - */ - getStudio(id: number): Studio { - return new Studio({ id: id, session: this }); - } - - /** - * Gets a forum - * @param id (optional) The ID of the forum you want to get (for example, 31 for the "Advanced Topics" forum) - * @returns {Forum} The forum + * Uploads a file to assets.scratch.mit.edu. + * This can be used for adding images to be used in a forum post or signature. + * @param buffer The buffer of the file you want to upload. + * @param fileExtension The extension of the file you want to upload, for example "png". + * @returns The URL to access the file you have uploaded. + * @example + * await session.uploadToAssets(fs.readFileSync("photo.png"), "png"); // returns URL to image */ - getForum(id?: number): Forum { - return new Forum({ id: id, session: this }); + async uploadToAssets(buffer: Buffer, fileExtension: string) { + const md5hash = createHash("md5").update(buffer).digest("hex"); + const upload = await fetch( + `https://assets.scratch.mit.edu/${md5hash}.${fileExtension}`, + { + method: "POST", + body: buffer, + headers: { + Cookie: this.cookieSet, + "User-Agent": UserAgent, + Referer: "https://scratch.mit.edu/", + Host: "assets.scratch.mit.edu", + "Cache-Control": "no-cache", + Pragma: "no-cache", + Accept: "*/*", + "Accept-Encoding": "gzip, deflate, br" + } + } + ); + if (!upload.ok) { + throw new Error("Upload failed"); + } + return `https://assets.scratch.mit.edu/${md5hash}.${fileExtension}`; } /** - * Logs out of Scratch + * Logs out of Scratch. */ async logout() { if (!this.csrfToken || !this.token) return; diff --git a/src/classes/CloudConnection.ts b/src/classes/CloudConnection.ts index 633efa5..ea48764 100644 --- a/src/classes/CloudConnection.ts +++ b/src/classes/CloudConnection.ts @@ -4,8 +4,13 @@ import { WebSocket } from "ws"; import { Session } from "../Consts"; import events from "events"; +/** + * Class for cloud connections. + * @param session The ScratchSession that will be used. + * @param id The id of the project to connect to. + * @returns {Profile} The profile of the user. + */ class CloudConnection extends events.EventEmitter { - creator: string; id: number; session: Session; server: string; @@ -15,31 +20,24 @@ class CloudConnection extends events.EventEmitter { user: string; method: string; name: string; - value: string | number; + value: string; project_id: number; }> = []; - variables: object = {}; + variables: { + [name: string]: string; + } = {}; disconnected: boolean = false; - constructor({ - id, - session, - server = "wss://clouddata.scratch.mit.edu" - }: { - id: number; - session: Session; - server?: string; - }) { + constructor(session: Session, id: number) { super(); this.id = id; this.session = session; - this.server = server; this.connect(); } private connect() { this.open = false; - this.connection = new WebSocket(this.server, { + this.connection = new WebSocket("wss://clouddata.scratch.mit.edu", { headers: { Cookie: this.session.cookieSet, Origin: "https://scratch.mit.edu" @@ -81,7 +79,7 @@ class CloudConnection extends events.EventEmitter { } /** - * Sends a packet through cloud + * Sends a packet through cloud. */ private send(data) { this.emit("internal-send", data); @@ -89,15 +87,15 @@ class CloudConnection extends events.EventEmitter { } /** - * Sets a cloud variable - * @param variable The variable name to set - * @param value The value to set the variable to + * Sets a cloud variable. + * @param variable The variable name to set. + * @param value The value to set the variable to. */ - setVariable(variable: string, value: string | number) { + setVariable(variable: string, value: number | string) { const varname = variable.startsWith("☁ ") ? variable.substring(2) : variable; - this.variables[`☁ ${varname}`] = value; + this.variables[`☁ ${varname}`] = value.toString(); if (!this.open) { this.queue.push({ user: this.session.sessionJSON.user.username, @@ -118,8 +116,8 @@ class CloudConnection extends events.EventEmitter { } /** - * Gets a cloud variable - * @param variable The variable name to get + * Gets a cloud variable. + * @param variable The variable name to get. * @returns {string} The value of the variable in string format. */ getVariable(variable: string): string { @@ -130,7 +128,7 @@ class CloudConnection extends events.EventEmitter { } /** - * Closes the cloud connection + * Closes the cloud connection. */ close() { this.emit("close", null); diff --git a/src/classes/Profile.ts b/src/classes/Profile.ts index 711da03..9de6f4a 100644 --- a/src/classes/Profile.ts +++ b/src/classes/Profile.ts @@ -38,24 +38,25 @@ interface ProfileComment { apiID: string; replies: ProfileCommentReply[]; } - +/** + * Class for profiles. + * @param session The ScratchSession that will be used. + * @param username The username of the profile you want to get. + */ class Profile { user: string; - status: string; - private scratchUserHTML: string; session: Session; - scratchUserAPI: UserAPIResponse; - constructor({ username, session }: { username: string; session: Session }) { + constructor(session: Session, username: string) { this.user = username; this.session = session; } /** - * Gets the status of the user + * Gets the status of the user. * Can either be Scratcher, New Scratcher, or Scratch Team. * @returns {string} The status of the user. */ - async getStatus(): Promise<"Scratcher" | "New Scratcher" | "Scratch Team"> { + async getStatus() { const dom = parse(await this.getUserHTML()); return dom.querySelector(".group").innerHTML.trim() as | "Scratcher" @@ -64,8 +65,8 @@ class Profile { } /** - * Deletes a comment - * @param id The comment ID, for example 12345, *not* comment-12345 + * Deletes a comment. + * @param id The comment ID, for example 12345, *not* comment-12345. */ async deleteComment(id: string | number) { const delFetch = await fetch( @@ -90,46 +91,39 @@ class Profile { console.log(delFetch.status, await delFetch.text()); throw new Error("Error deleting comment."); } - return delFetch; } private async getUserHTML() { - if (!(typeof this.scratchUserHTML === "string")) { - const scratchUserFetch = await fetch( - `https://scratch.mit.edu/users/${this.user}` - ); - if (!scratchUserFetch.ok) { - throw new Error("Cannot find user."); - } - this.scratchUserHTML = await scratchUserFetch.text(); + const scratchUserFetch = await fetch( + `https://scratch.mit.edu/users/${this.user}` + ); + if (!scratchUserFetch.ok) { + throw new Error("Cannot find user."); } - return this.scratchUserHTML; + return await scratchUserFetch.text(); } /** - * Gets the API response of the user in the Profile - * @returns The API response of the user + * Gets the API response of the user in the Profile. + * @returns The API response of the user. */ async getUserAPI() { - if (typeof this.scratchUserAPI === "undefined") { - const scratchUserFetch = await fetch( - `https://api.scratch.mit.edu/users/${this.user}` - ); - if (!scratchUserFetch.ok) { - throw new Error("Cannot find user."); - } - this.scratchUserAPI = await scratchUserFetch.json(); + const scratchUserFetch = await fetch( + `https://api.scratch.mit.edu/users/${this.user}` + ); + if (!scratchUserFetch.ok) { + throw new Error("Cannot find user."); } - return this.scratchUserAPI; + return await scratchUserFetch.json(); } /** - * Gets comments on the user's profile + * Gets comments on the user's profile. * @param page The page to look at. - * @returns {Array} An array of comments. - * apiID is used to input into deleteComment + * @returns An array of comments. + * apiID is used to input into deleteComment. */ - async getComments(page: number = 1): Promise { + async getComments(page: number = 1) { const commentFetch = await fetch( `https://scratch.mit.edu/site-api/comments/user/${this.user}/?page=${page}` ); diff --git a/src/classes/Project.ts b/src/classes/Project.ts index cd8fd22..e1320a7 100644 --- a/src/classes/Project.ts +++ b/src/classes/Project.ts @@ -19,7 +19,7 @@ interface ProjectAPIResponse { joined: string; }; profile: { - id: null | number; // unsure about this one + id: number; images: { "90x90": string; "60x60": string; @@ -53,6 +53,7 @@ interface ProjectAPIResponse { parent: null | number; root: null | number; }; + project_token: string; } interface ProjectComment { @@ -87,44 +88,44 @@ interface ProjectCommentReply { }; reply_count: number; } - +/** + * Class for projects. + * @param session The ScratchSession that will be used. + * @param id The id of the project you want to get. + */ class Project { id: number; session: Session; - scratchProjectAPI: ProjectAPIResponse; - constructor({ id, session }: { id: number; session: Session }) { + constructor(session: Session, id: number) { this.id = id; this.session = session; } /** - * Gets the api.scratch.mit.edu response of the project + * Gets the api.scratch.mit.edu response of the project. */ - async getAPIData(): Promise { - if (typeof this.scratchProjectAPI === "undefined") { - const apiFetch = await fetch( - `https://api.scratch.mit.edu/projects/${this.id}`, - { - headers: { - "User-Agent": UserAgent - } + async getAPIData() { + const apiFetch = await fetch( + `https://api.scratch.mit.edu/projects/${this.id}`, + { + headers: { + "User-Agent": UserAgent } - ); - if (!apiFetch.ok) { - throw new Error("Cannot find project."); } - this.scratchProjectAPI = await apiFetch.json(); + ); + if (!apiFetch.ok) { + throw new Error("Cannot find project."); } - return this.scratchProjectAPI; + return (await apiFetch.json()) as ProjectAPIResponse; } /** - * Gets comments in the project - * @param offset The offset of comments - * @param limit The limit of comments to return - * @returns The API response + * Gets comments in the project. + * @param offset The offset of comments. + * @param limit The limit of comments to return. + * @returns The comments. */ - async getComments(offset = 0, limit = 20): Promise { + async getComments(offset = 0, limit = 20) { const apiData = await this.getAPIData(); const commentFetch = await fetch( `https://api.scratch.mit.edu/users/${apiData.author.username}/projects/${this.id}/comments?offset=${offset}&limit=${limit}`, @@ -139,21 +140,17 @@ class Project { `Comments returned status ${commentFetch.status} - ${commentFetch.statusText}` ); } - return await commentFetch.json(); + return (await commentFetch.json()) as ProjectComment[]; } /** - * Gets the comment replies to a comment - * @param offset The offset of comments - * @param limit The limit of comments to return - * @param id The id of the comment to get - * @returns The comment replies + * Gets the replies to a comment. + * @param offset The offset of comments. + * @param limit The limit of comments to return. + * @param id The id of the comment to get. + * @returns The comment replies. */ - async getCommentReplies( - offset = 0, - limit = 20, - id: number | string - ): Promise { + async getCommentReplies(id: number | string, offset = 0, limit = 20) { const apiData = await this.getAPIData(); const commentFetch = await fetch( `https://api.scratch.mit.edu/users/${apiData.author.username}/projects/${this.id}/comments/${id}/replies?offset=${offset}&limit=${limit}`, @@ -168,12 +165,12 @@ class Project { `Comments returned status ${commentFetch.status} - ${commentFetch.statusText}` ); } - return await commentFetch.json(); + return (await commentFetch.json()) as ProjectCommentReply[]; } /** - * Sets the title of the project (requires ownership of the project) - * @param value The value you want to set the title to + * Sets the title of the project (requires ownership of the project). + * @param value The value you want to set the title to. */ async setTitle(value: string) { const setFetch = await fetch( @@ -197,11 +194,10 @@ class Project { if (!setFetch.ok) { throw new Error(`Error in setting title. ${setFetch.status}`); } - this.scratchProjectAPI = undefined; // this is to reset it } /** - * Sets the instructions of the project (requires ownership of the project) - * @param value The value you want to set the instructions to + * Sets the instructions of the project (requires ownership of the project). + * @param value The value you want to set the instructions to. */ async setInstructions(value: string) { const setFetch = await fetch( @@ -225,12 +221,11 @@ class Project { if (!setFetch.ok) { throw new Error(`Error in setting instructions. ${setFetch.status}`); } - this.scratchProjectAPI = undefined; // this is to reset it } /** - * Sets the Notes and Credits of the project (requires ownership of the project) - * @param value The value you want to set the Notes and Credits to + * Sets the Notes and Credits of the project (requires ownership of the project). + * @param value The value you want to set the Notes and Credits to. */ async setNotesAndCredits(value: string) { const setFetch = await fetch( @@ -254,11 +249,10 @@ class Project { if (!setFetch.ok) { throw new Error(`Error in setting Notes and Credits. ${setFetch.status}`); } - this.scratchProjectAPI = undefined; // this is to reset it } /** - * Unshares the project (requires ownership of the project) + * Unshares the project (requires ownership of the project). */ async unshare() { const setFetch = await fetch( @@ -286,7 +280,7 @@ class Project { } /** - * Shares the project (requires ownership of the project) + * Shares the project (requires ownership of the project). */ async share() { const setFetch = await fetch( @@ -315,15 +309,6 @@ class Project { throw new Error(`Error in sharing. ${setFetch.status}`); } } - - /** - * Creates a cloud connection with the project - * @returns {CloudConnection} The cloud connection for the project - * TurboWarp support may be added in the future - */ - createCloudConnection(): CloudConnection { - return new CloudConnection({ id: this.id, session: this.session }); - } } export default Project; diff --git a/src/classes/Studio.ts b/src/classes/Studio.ts index 0fee5a9..975cbf3 100644 --- a/src/classes/Studio.ts +++ b/src/classes/Studio.ts @@ -39,34 +39,34 @@ interface StudioAPIResponse { projects: number; }; } - +/** + * Class for studios. + * @param session The ScratchSession that will be used. + * @param id The id of the studio you want to get. + */ class Studio { id: number; session: Session; - scratchStudioAPI: StudioAPIResponse; - constructor({ id, session }: { id: number; session: Session }) { + constructor(session: Session, id: number) { this.id = id; this.session = session; } - async getAPIData(): Promise { - if (typeof this.scratchStudioAPI === "undefined") { - const response = await fetch( - `https://api.scratch.mit.edu/studios/${this.id}/`, - { - headers: { - "User-Agent": UserAgent - } + async getAPIData() { + const response = await fetch( + `https://api.scratch.mit.edu/studios/${this.id}/`, + { + headers: { + "User-Agent": UserAgent } - ); - this.scratchStudioAPI = await response.json(); - } - return this.scratchStudioAPI; + } + ); + return (await response.json()) as StudioAPIResponse; } /** * Sets the title of the studio. - * @param value The value to set the title to + * @param value The value to set the title to. */ async setTitle(value: string) { const setFetch = await fetch( @@ -86,12 +86,11 @@ class Studio { if (!setFetch.ok) { throw new Error(`Could not set title - ${setFetch.statusText}`); } - return setFetch; } /** * Sets the description of the studio. - * @param value The value to set the description to + * @param value The value to set the description to. */ async setDescription(value: string) { const setFetch = await fetch( @@ -111,12 +110,11 @@ class Studio { if (!setFetch.ok) { throw new Error(`Could not set description - ${setFetch.statusText}`); } - return setFetch; } /** * Invites a curator to the studio. - * @param username The username of the user to add + * @param username The username of the user to add. */ async inviteCurator(username: string) { const inviteFetch = await fetch( @@ -133,12 +131,11 @@ class Studio { if (!inviteFetch.ok) { throw new Error(`Could not invite curator - ${inviteFetch.statusText}`); } - return inviteFetch; } /** * Removes a curator from the studio. - * @param username The username of the user to remove + * @param username The username of the user to remove. */ async removeCurator(username: string) { const removeFetch = await fetch( @@ -155,12 +152,11 @@ class Studio { if (!removeFetch.ok) { throw new Error(`Could not remove curator - ${removeFetch.statusText}`); } - return removeFetch; } /** * Adds a project to the studio. - * @param project The project ID to add to the studio + * @param project The project ID to add to the studio. */ async addProject(project: number) { const addFetch = await fetch( @@ -176,12 +172,11 @@ class Studio { if (!addFetch.ok) { throw new Error(`Could not add project - ${addFetch.statusText}`); } - return addFetch; } /** * Removes a project from the studio. - * @param project The project ID to remove from the studio + * @param project The project ID to remove from the studio. */ async removeProject(project: number) { const removeFetch = await fetch( @@ -197,19 +192,15 @@ class Studio { if (!removeFetch.ok) { throw new Error(`Could not remove project - ${removeFetch.statusText}`); } - return removeFetch; } /** * Gets the curators in a studio. - * @param limit The limit of curators to return - * @param offset The offset of the curators to return - * @returns An array of curators + * @param limit The limit of curators to return. + * @param offset The offset of the curators to return. + * @returns An array of curators. */ - async getCurators( - limit: number = 24, - offset: number = 0 - ): Promise { + async getCurators(limit: number = 24, offset: number = 0) { const getFetch = await fetch( `https://api.scratch.mit.edu/studios/${this.id}/curators/?limit=${limit}&offset=${offset}`, { @@ -221,19 +212,16 @@ class Studio { if (!getFetch.ok) { throw new Error(`Could not get curators - ${getFetch.statusText}`); } - return await getFetch.json(); + return (await getFetch.json()) as UserAPIResponse[]; } /** * Gets the managers in a studio. - * @param limit The limit of managers to return - * @param offset The offset of the managers to return - * @returns An array of managers + * @param limit The limit of managers to return. + * @param offset The offset of the managers to return. + * @returns An array of managers. */ - async getManagers( - limit: number = 24, - offset: number = 0 - ): Promise { + async getManagers(limit: number = 24, offset: number = 0) { const getFetch = await fetch( `https://api.scratch.mit.edu/studios/${this.id}/managers/?limit=${limit}&offset=${offset}`, { @@ -245,19 +233,16 @@ class Studio { if (!getFetch.ok) { throw new Error(`Could not get managers - ${getFetch.statusText}`); } - return await getFetch.json(); + return (await getFetch.json()) as UserAPIResponse[]; } /** * Gets the projects in a studio. - * @param limit The limit of projects to return - * @param offset The offset of the projects to return - * @returns An array of users + * @param limit The limit of projects to return. + * @param offset The offset of the projects to return. + * @returns An array of users. */ - async getProjects( - limit: number = 24, - offset: number = 0 - ): Promise { + async getProjects(limit: number = 24, offset: number = 0) { const getFetch = await fetch( `https://api.scratch.mit.edu/studios/${this.id}/projects/?limit=${limit}&offset=${offset}`, { @@ -269,7 +254,7 @@ class Studio { if (!getFetch.ok) { throw new Error(`Could not get projects - ${getFetch.statusText}`); } - return await getFetch.json(); + return (await getFetch.json()) as OldProjectResponse[]; } } diff --git a/src/classes/forums/Forum.ts b/src/classes/forums/Forum.ts index 2051e48..df71300 100644 --- a/src/classes/forums/Forum.ts +++ b/src/classes/forums/Forum.ts @@ -2,18 +2,22 @@ import fetch from "cross-fetch"; import Topic from "./Topic"; import { parse } from "node-html-parser"; import { Session, UserAgent } from "../../Consts"; - +/** + * Class for profiles. + * @param session The ScratchSession that will be used. + * @param [id] The ID of the forum you want to get. + */ class Forum { id?: number; session: Session; - constructor({ id, session }: { id?: number; session: Session }) { + constructor(session: Session, id?: number) { this.id = id; this.session = session; } /** - * Gets a list of topics - * @returns An array of topics + * Gets a list of topics. + * @returns An array of topics. */ async getTopics() { let topics: Topic[] = []; @@ -55,24 +59,9 @@ class Forum { return topics; } - /** - * Gets a topic - * - * Note: Topic.sticky, Topic.title, and Topic.replyCount give undefined when using this! - * @param id The ID of the topic - * @returns {Topic} The topic - */ - getTopic(id: number): Topic { - return new Topic({ - id: id, - session: this.session - }); - } - /** * Sets the currently logged in user's signature * @param content The content to set the signature to - * @returns {Request} The request to set the signature */ async setSignature(content: string) { const editFetch = await fetch( @@ -93,15 +82,12 @@ class Forum { method: "POST", body: `csrfmiddlewaretoken=${ this.session.csrfToken - }&signature=${encodeURIComponent(content) - .replace("%20", "+") - .replace("\n", "\r\n")}&update=` + }&signature=${encodeURIComponent(content)}&update=` } ); if (!editFetch.ok) { throw new Error(`Error editing signature - ${editFetch.statusText}`); } - return editFetch; } } diff --git a/src/classes/forums/Post.ts b/src/classes/forums/Post.ts index 548ff44..a82246f 100644 --- a/src/classes/forums/Post.ts +++ b/src/classes/forums/Post.ts @@ -35,7 +35,6 @@ class Post { /** * Edits the post (requires ownership of the post) * @param content The new content of the post - * @returns The API response */ async edit(content: string) { const editFetch = await fetch( @@ -56,9 +55,7 @@ class Post { method: "POST", body: `csrfmiddlewaretoken=${ this.session.csrfToken - }&body=${encodeURIComponent(content) - .replace("%20", "+") - .replace("\n", "\r\n")}` + }&body=${encodeURIComponent(content)}` } ); if (!editFetch.ok) { @@ -66,7 +63,6 @@ class Post { `Error editing post ${this.id} - ${editFetch.statusText}` ); } - return editFetch; } } diff --git a/src/classes/forums/Topic.ts b/src/classes/forums/Topic.ts index 5a1cc4d..2ab4128 100644 --- a/src/classes/forums/Topic.ts +++ b/src/classes/forums/Topic.ts @@ -30,8 +30,8 @@ class Topic { } /** - * Gets the posts in the topic - * @returns An array of posts in the topic + * Gets the posts in the topic. + * @returns An array of posts in the topic. */ async getPosts() { let posts = []; @@ -77,8 +77,7 @@ class Topic { } /** - * Follows the topic - * @returns The request + * Follows the topic. */ async follow() { const followFetch = await fetch( @@ -104,12 +103,10 @@ class Topic { `Error following topic ${this.id} - ${followFetch.statusText}` ); } - return followFetch; } /** - * Unfollows the topic - * @returns The request + * Unfollows the topic. */ async unfollow() { const unfollowFetch = await fetch( @@ -135,7 +132,6 @@ class Topic { `Error unfollowing topic ${this.id} - ${unfollowFetch.statusText}` ); } - return unfollowFetch; } } export default Topic; diff --git a/src/index.ts b/src/index.ts index 8be205b..c036d5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,6 @@ -import ScratchSession from "./ScratchSession"; -export { ScratchSession }; +export { default as ScratchSession } from "./ScratchSession"; +export { default as Profile } from "./classes/Profile"; +export { default as Studio } from "./classes/Studio"; +export { default as Project } from "./classes/Project"; +export { default as CloudConnection } from "./classes/CloudConnection"; +export { default as Forum } from "./classes/forums/Forum"; diff --git a/tests/profile.spec.js b/tests/profile.spec.ts similarity index 81% rename from tests/profile.spec.js rename to tests/profile.spec.ts index 31f4b19..ec1080d 100644 --- a/tests/profile.spec.js +++ b/tests/profile.spec.ts @@ -1,24 +1,17 @@ import tap from "tap"; -import { ScratchSession } from "../dist/index.js"; +import { ScratchSession, Profile } from "../src"; const session = new ScratchSession(); // basic variables const username = "-Akroation-"; -const user = session.getProfile(username); +const user = new Profile(session, username); tap.test("make sure status is string", async (t) => { t.type(await user.getStatus(), "string"); t.end(); }); -tap.test("make sure status is not empty", async (t) => { - if ((await user.getStatus()) === "") { - throw new Error("Status is empty"); - } - t.end(); -}); - // profile comments const profileComments = await user.getComments(); diff --git a/tests/project.spec.js b/tests/project.spec.ts similarity index 83% rename from tests/project.spec.js rename to tests/project.spec.ts index 9852fc7..1fe4f68 100644 --- a/tests/project.spec.js +++ b/tests/project.spec.ts @@ -1,11 +1,11 @@ import tap from "tap"; -import { ScratchSession } from "../dist/index.js"; +import { ScratchSession, Project } from "../src"; const session = new ScratchSession(); // basic variables const projectID = 601968190; -const project = session.getProject(projectID); +const project = new Project(session, projectID); const apiData = await project.getAPIData(); const comments = await project.getComments(); @@ -29,7 +29,7 @@ tap.test("make sure project comments are iterable", (t) => { tap.test("make sure project comment replies work", async (t) => { const id = comments[0].id; - const replies = await project.getCommentReplies(0, 20, id); + const replies = await project.getCommentReplies(id, 0, 20); const reply = replies[0]; t.type(reply, "object"); t.end(); diff --git a/tests/studio.spec.js b/tests/studio.spec.ts similarity index 92% rename from tests/studio.spec.js rename to tests/studio.spec.ts index 7e550e8..3ec3cbf 100644 --- a/tests/studio.spec.js +++ b/tests/studio.spec.ts @@ -1,10 +1,10 @@ import tap from "tap"; -import { ScratchSession } from "../dist/index.js"; +import { ScratchSession, Studio } from "../src"; const session = new ScratchSession(); // get studio -const studio = session.getStudio(30136012); +const studio = new Studio(session, 30136012); const apiData = await studio.getAPIData(); // main tests tap.test("make sure api data has correct types", (t) => { diff --git a/tsconfig.json b/tsconfig.json index dd32e4e..528b04b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,9 @@ "exclude": ["node_modules", "**/*.spec.ts", "dist"], "compilerOptions": { "moduleResolution": "node", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "module": "es2022", + "target": "es2020" } }