├── .eslintrc.json ├── .github └── workflows │ ├── codeql-analysis.yml │ └── docs.yml ├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── package.json ├── src ├── constants │ ├── anime.ts │ ├── clubs.ts │ ├── genres.ts │ ├── index.ts │ ├── manga.ts │ ├── schedules.ts │ ├── seasons.ts │ ├── top.ts │ └── users.ts ├── index.ts ├── lib │ ├── Marika.ts │ ├── index.ts │ └── jikan │ │ ├── anime.ts │ │ ├── characters.ts │ │ ├── clubs.ts │ │ ├── genres.ts │ │ ├── index.ts │ │ ├── magazines.ts │ │ ├── manga.ts │ │ ├── people.ts │ │ ├── producers.ts │ │ ├── random.ts │ │ ├── recommendations.ts │ │ ├── reviews.ts │ │ ├── schedules.ts │ │ ├── seasons.ts │ │ ├── top.ts │ │ ├── users.ts │ │ └── watch.ts ├── types │ ├── anime.ts │ ├── characters.ts │ ├── clubs.ts │ ├── genres.ts │ ├── index.ts │ ├── magazines.ts │ ├── manga.ts │ ├── pagination.ts │ ├── people.ts │ ├── producers.ts │ ├── recommendations.ts │ ├── schedules.ts │ ├── seasons.ts │ ├── top.ts │ ├── users.ts │ └── watch.ts └── utils │ ├── Error.ts │ ├── Fetch.ts │ ├── Utils.ts │ └── index.ts ├── tsconfig.json ├── typedoc.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2021": true, 4 | "node": true 5 | }, 6 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 7 | "parser": "@typescript-eslint/parser", 8 | "parserOptions": { 9 | "ecmaVersion": 7, 10 | "sourceType": "module" 11 | }, 12 | "plugins": ["@typescript-eslint"], 13 | "rules": { 14 | "@typescript-eslint/no-explicit-any": "off" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [main] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [main] 20 | schedule: 21 | - cron: "26 2 * * 2" 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: ["javascript"] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 37 | # Learn more: 38 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 39 | 40 | steps: 41 | - name: Checkout repository 42 | uses: actions/checkout@v2 43 | 44 | # Initializes the CodeQL tools for scanning. 45 | - name: Initialize CodeQL 46 | uses: github/codeql-action/init@v1 47 | with: 48 | languages: ${{ matrix.language }} 49 | # If you wish to specify custom queries, you can do so here or in a config file. 50 | # By default, queries listed here will override any specified in a config file. 51 | # Prefix the list here with "+" to use these queries and those in the config file. 52 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 53 | 54 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 55 | # If this step fails, then you should remove it and run the build manually (see below) 56 | - name: Autobuild 57 | uses: github/codeql-action/autobuild@v1 58 | 59 | # ℹ️ Command-line programs to run using the OS shell. 60 | # 📚 https://git.io/JvXDl 61 | 62 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 63 | # and modify them (or add more) to build your code if your project 64 | # uses a compiled language 65 | 66 | #- run: | 67 | # make bootstrap 68 | # make release 69 | 70 | - name: Perform CodeQL Analysis 71 | uses: github/codeql-action/analyze@v1 72 | 73 | - name: Setup Node.js environment 74 | uses: actions/setup-node@v2.4.0 75 | with: 76 | # Set always-auth in npmrc 77 | always-auth: false # optional, default is false 78 | # Version Spec of the version to use. Examples: 12.x, 10.15.1, >=10.15.0 79 | # node-version: # optional 80 | # Target architecture for Node to use. Examples: x86, x64. Will use system architecture by default. 81 | # architecture: # optional 82 | # Set this option if you want the action to check for the latest available version that satisfies the version spec 83 | # check-latest: # optional 84 | # Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN 85 | # registry-url: # optional 86 | # Optional scope for authenticating against scoped registries 87 | # scope: # optional 88 | # Used to pull node distributions from node-versions. Since there's a default, this is typically not supplied by the user. 89 | # token: # optional, default is ${{ github.token }} 90 | # Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm 91 | # cache: # optional 92 | # Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. Supports wildcards or a list of file names for caching multiple dependencies. 93 | # cache-dependency-path: # optional 94 | # Deprecated. Use node-version instead. Will not be supported after October 1, 2019 95 | # version: # optional 96 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Docs workflow 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | jobs: 8 | Build: 9 | runs-on: ubuntu-latest 10 | outputs: 11 | package-name: ${{ steps.packageInfo.outputs.package-name }} 12 | package-version: ${{ steps.packageInfo.outputs.package-version }} 13 | commit-msg: ${{ steps.packageInfo.outputs.commit-msg }} 14 | # Steps represent a sequence of tasks that will be executed as part of the job 15 | steps: 16 | - name: Checkout Commit 17 | uses: actions/checkout@v2 18 | 19 | - name: Parsing Package Info 20 | id: packageInfo 21 | run: | 22 | echo "::set-output name=package-name::$(jq -r .name package.json)" 23 | echo "::set-output name=package-version::$(jq -r .version package.json)" 24 | echo "::set-output name=commit-msg::$(git log -1 --pretty=%B)" 25 | 26 | - name: Setup Node.js environment 27 | uses: actions/setup-node@v2.1.1 28 | 29 | - name: Install Dependencies 30 | run: yarn install 31 | 32 | - name: Docs Build 33 | run: yarn docs 34 | 35 | - name: Publish to Pages 36 | uses: crazy-max/ghaction-github-pages@v2 37 | with: 38 | target_branch: gh-pages 39 | build_dir: docs 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | 45 | # TypeScript cache 46 | *.tsbuildinfo 47 | 48 | # Optional npm cache directory 49 | .npm 50 | 51 | # Optional eslint cache 52 | .eslintcache 53 | 54 | # Microbundle cache 55 | .rpt2_cache/ 56 | .rts2_cache_cjs/ 57 | .rts2_cache_es/ 58 | .rts2_cache_umd/ 59 | 60 | # Optional REPL history 61 | .node_repl_history 62 | 63 | # Output of 'npm pack' 64 | *.tgz 65 | 66 | # Yarn Integrity file 67 | .yarn-integrity 68 | 69 | # dotenv environment variables file 70 | .env 71 | .env.test 72 | 73 | # parcel-bundler cache (https://parceljs.org/) 74 | .cache 75 | 76 | # Next.js build output 77 | .next 78 | 79 | # Nuxt.js build / generate output 80 | .nuxt 81 | dist 82 | 83 | # Gatsby files 84 | .cache/ 85 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 86 | # https://nextjs.org/blog/next-9-1#public-directory-support 87 | # public 88 | 89 | # vuepress build output 90 | .vuepress/dist 91 | 92 | # Serverless directories 93 | .serverless/ 94 | 95 | # FuseBox cache 96 | .fusebox/ 97 | 98 | # DynamoDB Local files 99 | .dynamodb/ 100 | 101 | # TernJS port file 102 | .tern-port 103 | 104 | docs -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "printWidth": 120, 6 | "tabWidth": 4 7 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Shinei Ichijo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | I Love Chitoge more tbh 3 | 4 | # Marika 5 | 6 | [![NPM](https://img.shields.io/badge/Available%20On-NPM-lightgrey.svg?logo=npm&logoColor=339933&labelColor=white&style=flat-square)](https://www.npmjs.com/package/@shineiichijo/marika) 7 | 8 | A promise based API wrapper for the unofficial [MyAnimeList API](https://docs.api.jikan.moe/) 9 | 10 | [Documentation](https://luckyyam.github.io/Marika/) 11 | 12 |
13 | 14 | --- 15 | 16 | ## Installation 17 | 18 | ```sh 19 | npm i @shineiichijo/marika 20 | 21 | yarn add @shineiichijo/marika 22 | ``` 23 | 24 | ## 🚀 Usage Examples 25 | 26 | ```ts 27 | import { Marika } from '@shineiichijo/marika' 28 | 29 | ;(async () => { 30 | const { anime } = new Marika() 31 | await anime.getAnimeById(1) 32 | .then(console.log) 33 | .catch(console.error) 34 | })() 35 | ``` 36 | 37 | ```ts 38 | import { Manga } from '@shineiichijo/marika' 39 | 40 | ;(async () => { 41 | const manga = new Manga() 42 | await manga.getMangaSearch({ q: 'Nisekoi', page: 1, genres: [22, 4], limit: 1 }) 43 | .then(console.log) 44 | .catch(console.error) 45 | })() 46 | ``` 47 | 48 | ```ts 49 | import { Marika, AnimeSeasons, AnimeTypes } from '@shineiichijo/marika' 50 | 51 | ;(async () => { 52 | const { seasons } = new Marika() 53 | await seasons.getSeason(2023, AnimeSeasons['FALL'], { sfw: true, filter: AnimeTypes['TV'] }) 54 | .then(console.log) 55 | .catch(console.error) 56 | })() 57 | ``` 58 | 59 | ```ts 60 | import { Characters } from '@shineiichijo/marika' 61 | 62 | ;(async () => { 63 | const characters = new Characters() 64 | await characters.getCharacterFullById(66597) 65 | .then(console.log) 66 | .catch(console.error) 67 | })() 68 | ``` 69 | 70 | ```ts 71 | import { Marika, Days } from '@shineiichijo/marika' 72 | 73 | ;(async () => { 74 | const { schedules } = new Marika() 75 | await schedules.getSchedules({ filter: Days['MONDAY'] }) 76 | .then(console.log) 77 | .catch(console.error) 78 | })() 79 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@shineiichijo/marika", 3 | "version": "3.0.1", 4 | "description": "An API wrapper for the unofficial MyAnimeList API jikan.moe v4", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "dependencies": { 8 | "axios": "^1.5.0", 9 | "axios-cache-interceptor": "^1.3.0" 10 | }, 11 | "files": [ 12 | "dist" 13 | ], 14 | "scripts": { 15 | "build": "yarn rimraf dist/ && yarn tsc && yarn docs", 16 | "lint": "eslint . --ignore-path .gitignore --ext .ts", 17 | "lint:fix": "eslint . --ignore-path .gitignore --ext .ts --fix", 18 | "format": "yarn prettier --write --config .prettierrc.json \"src/**/*.ts\"", 19 | "prepack": "yarn build", 20 | "docs": "yarn typedoc" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/LuckyYam/Marika.git" 25 | }, 26 | "keywords": [ 27 | "anime", 28 | "manga", 29 | "anime-character", 30 | "jikan", 31 | "jikan-moe", 32 | "myanimelist", 33 | "MAL" 34 | ], 35 | "author": { 36 | "name": "Lucky Yambem", 37 | "url": "https://github.com/LuckyYam" 38 | }, 39 | "license": "MIT", 40 | "bugs": { 41 | "url": "https://github.com/LuckyYam/Marika/issues" 42 | }, 43 | "homepage": "https://github.com/LuckyYam/Marika", 44 | "devDependencies": { 45 | "@types/mocha": "^10.0.1", 46 | "@types/node": "^20.6.2", 47 | "@typescript-eslint/eslint-plugin": "^6.7.2", 48 | "@typescript-eslint/parser": "^6.7.2", 49 | "eslint": "^8.49.0", 50 | "mocha": "^10.2.0", 51 | "prettier": "^3.0.3", 52 | "ts-node": "^10.9.1", 53 | "typedoc": "^0.25.1", 54 | "typescript": "^5.2.2" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/constants/anime.ts: -------------------------------------------------------------------------------- 1 | export enum AnimeTypes { 2 | TV = 'TV', 3 | MOVIE = 'Movie', 4 | SPECIAL = 'Special', 5 | OVA = 'OVA', 6 | ONA = 'ONA', 7 | MUSIC = 'Music' 8 | } 9 | 10 | export enum Ratings { 11 | /** G - All Ages */ 12 | G = 'g', 13 | /** PG - Children */ 14 | PG = 'pg', 15 | /** PG-13 - Teens 13 or older */ 16 | PG_13 = 'pg13', 17 | /** R - 17+ (violence & profanity) */ 18 | R_17 = 'r17', 19 | /** R+ - Mild Nudity */ 20 | R = 'r', 21 | /** Rx - Hentai */ 22 | RX = 'rx' 23 | } 24 | 25 | export enum AnimeStatus { 26 | AIRING = 'airing', 27 | COMPLETE = 'complete', 28 | UPCOMING = 'upcoming' 29 | } 30 | -------------------------------------------------------------------------------- /src/constants/clubs.ts: -------------------------------------------------------------------------------- 1 | export enum ClubAccess { 2 | PUBLIC = 'public', 3 | PRIVATE = 'private', 4 | SECRET = 'secret' 5 | } 6 | 7 | export enum ClubCategories { 8 | ANIME = 'anime', 9 | MANGA = 'manga', 10 | ACTORS_AND_ARTISTS = 'actors_and_artists', 11 | CHARACTERS = 'characters', 12 | CITIES_AND_NEIGHBORHOODS = 'cities_and_neighborhoods', 13 | COMPANIES = 'companies', 14 | CONVENTIONS = 'conventions', 15 | GAMES = 'games', 16 | JAPAN = 'japan', 17 | MUSIC = 'music', 18 | OTHER = 'other', 19 | SCHOOLS = 'schools' 20 | } 21 | -------------------------------------------------------------------------------- /src/constants/genres.ts: -------------------------------------------------------------------------------- 1 | export enum GenresFilter { 2 | GENRES = 'genres', 3 | EXPLICIT_GENRES = 'explicit_genres', 4 | THEMES = 'themes', 5 | DEMOGRAPHICS = 'demographics' 6 | } 7 | -------------------------------------------------------------------------------- /src/constants/index.ts: -------------------------------------------------------------------------------- 1 | export const API_URL = 'https://api.jikan.moe/v4' 2 | 3 | export enum Sorting { 4 | DESCENDING = 'desc', 5 | ASCENDING = 'asc' 6 | } 7 | 8 | export enum Forums { 9 | ALL = 'all', 10 | EPISODE = 'episode', 11 | OTHER = 'other' 12 | } 13 | 14 | export * from './anime' 15 | export * from './clubs' 16 | export * from './genres' 17 | export * from './manga' 18 | export * from './schedules' 19 | export * from './seasons' 20 | export * from './users' 21 | export * from './top' 22 | -------------------------------------------------------------------------------- /src/constants/manga.ts: -------------------------------------------------------------------------------- 1 | export enum MangaTypes { 2 | Manga = 'manga', 3 | Novel = 'novel', 4 | 'Light Novel' = 'lightnovel', 5 | 'One-shot' = 'oneshot', 6 | Doujin = 'doujin', 7 | Manhwa = 'manhwa', 8 | Manhua = 'manhua' 9 | } 10 | 11 | export enum MangaStatus { 12 | PUBLISHING = 'publishing', 13 | COMPLETE = 'complete', 14 | HIATUS = 'hiatus', 15 | DISCONTINUED = 'discontinued', 16 | UPCOMING = 'upcoming' 17 | } 18 | -------------------------------------------------------------------------------- /src/constants/schedules.ts: -------------------------------------------------------------------------------- 1 | export enum Days { 2 | MONDAY = 'monday', 3 | TUESDAY = 'tuesday', 4 | WEDNESDAY = 'wednesday', 5 | THURSDAY = 'thursday', 6 | FRIDAY = 'friday', 7 | SATURDAY = 'saturday', 8 | SUNDAY = 'sunday' 9 | } 10 | -------------------------------------------------------------------------------- /src/constants/seasons.ts: -------------------------------------------------------------------------------- 1 | export enum AnimeSeasons { 2 | FALL = 'fall', 3 | SUMMER = 'summer', 4 | SPRING = 'spring', 5 | WINTER = 'winter' 6 | } 7 | -------------------------------------------------------------------------------- /src/constants/top.ts: -------------------------------------------------------------------------------- 1 | export enum AnimeFilters { 2 | BY_POPULARITY = 'bypopularity', 3 | AIRING = 'airing', 4 | UPCOMING = 'upcoming', 5 | FAVORITE = 'favorite' 6 | } 7 | 8 | export enum MangaFilters { 9 | BY_POPULARITY = 'bypopularity', 10 | UPCOMING = 'upcoming', 11 | FAVORITE = 'favorite', 12 | PUBLISHING = 'publishing' 13 | } 14 | -------------------------------------------------------------------------------- /src/constants/users.ts: -------------------------------------------------------------------------------- 1 | export enum Genders { 2 | MALE = 'male', 3 | FEMALE = 'female', 4 | ANY = 'any', 5 | NON_BINARY = 'nonbinary' 6 | } 7 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types' 2 | export * from './constants' 3 | export * from './lib' 4 | -------------------------------------------------------------------------------- /src/lib/Marika.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { 3 | Anime, 4 | Characters, 5 | Clubs, 6 | Genres, 7 | Magazines, 8 | Manga, 9 | People, 10 | Producers, 11 | Random, 12 | Recommendations, 13 | Reviews, 14 | Schedules, 15 | Seasons, 16 | Top, 17 | Users, 18 | Watch 19 | } from './jikan' 20 | 21 | export class Marika { 22 | /** 23 | * Constructs an instance of the [main](https://docs.api.jikan.moe/) client 24 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 25 | */ 26 | constructor(cacheOptions?: CacheOptions) { 27 | this.anime = new Anime(cacheOptions) 28 | this.characters = new Characters(cacheOptions) 29 | this.clubs = new Clubs(cacheOptions) 30 | this.genres = new Genres(cacheOptions) 31 | this.magazines = new Magazines(cacheOptions) 32 | this.manga = new Manga(cacheOptions) 33 | this.people = new People(cacheOptions) 34 | this.reviews = new Reviews(cacheOptions) 35 | this.schedules = new Schedules(cacheOptions) 36 | this.producers = new Producers(cacheOptions) 37 | this.recommendations = new Recommendations(cacheOptions) 38 | this.seasons = new Seasons(cacheOptions) 39 | this.users = new Users(cacheOptions) 40 | this.watch = new Watch(cacheOptions) 41 | this.random = new Random(cacheOptions) 42 | this.top = new Top(cacheOptions) 43 | } 44 | 45 | /** Client of [anime](https://docs.api.jikan.moe/#tag/anime) */ 46 | public anime: Anime 47 | /** Client of [characters](https://docs.api.jikan.moe/#tag/characters) */ 48 | public characters: Characters 49 | /** Client of [clubs](https://docs.api.jikan.moe/#tag/clubs) */ 50 | public clubs: Clubs 51 | /** Client of [genres](https://docs.api.jikan.moe/#tag/genres) */ 52 | public genres: Genres 53 | /** Client of [magazines](https://docs.api.jikan.moe/#tag/magazines) */ 54 | public magazines: Magazines 55 | /** Client of [manga](https://docs.api.jikan.moe/#tag/manga) */ 56 | public manga: Manga 57 | /** Client of [people](https://docs.api.jikan.moe/#tag/people) */ 58 | public people: People 59 | /** Client of [reviews](https://docs.api.jikan.moe/#tag/reviews) */ 60 | public reviews: Reviews 61 | /** Client of [schedules](https://docs.api.jikan.moe/#tag/schedules) */ 62 | public schedules: Schedules 63 | /** Client of [producers](https://docs.api.jikan.moe/#tag/producers) */ 64 | public producers: Producers 65 | /** Client of [recommendations](https://docs.api.jikan.moe/#tag/recommendations) */ 66 | public recommendations: Recommendations 67 | /** Client of [seasons](https://docs.api.jikan.moe/#tag/seasons) */ 68 | public seasons: Seasons 69 | /** Client of [users](https://docs.api.jikan.moe/#tag/users) */ 70 | public users: Users 71 | /** Client of [watch](https://docs.api.jikan.moe/#tag/watch) */ 72 | public watch: Watch 73 | /** Client of [random](https://docs.api.jikan.moe/#tag/random) */ 74 | public random: Random 75 | /** Client of [top](https://docs.api.jikan.moe/#tag/top) */ 76 | public top: Top 77 | } 78 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Marika' 2 | export * from './jikan' 3 | -------------------------------------------------------------------------------- /src/lib/jikan/anime.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { Fetch, getQueryString, getURL, getTypeErrorMessage } from '../../utils' 3 | import { 4 | IAnime, 5 | IAnimeCharacter, 6 | IAnimeFull, 7 | IAnimeStaff, 8 | IPagination, 9 | IEpisodeFromList, 10 | ICommonConfig, 11 | IEpisodeResponse, 12 | INewsResponse, 13 | IForumConfig, 14 | IForum, 15 | IAnimeVideo, 16 | IAnimeVideosEpisode, 17 | IPicture, 18 | IAnimeStatistics, 19 | IMoreInfo, 20 | IRecommendation, 21 | IAnimeUserUpdate, 22 | IAnimeReview, 23 | IReviewConfig, 24 | IRelation, 25 | IAnimeSearchConfig, 26 | IExtendedPagination 27 | } from '../../types' 28 | 29 | export class Anime { 30 | #fetch: Fetch['get'] 31 | /** 32 | * Constructs an instance of the [anime](https://docs.api.jikan.moe/#tag/anime) client 33 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 34 | */ 35 | constructor(cacheOptions?: CacheOptions) { 36 | this.#fetch = new Fetch(cacheOptions).get 37 | } 38 | 39 | /** 40 | * Gets anime data by its MyAnimeList ID 41 | * @param id MyAnimeList ID of the anime 42 | * @returns The data of the anime 43 | */ 44 | public getAnimeById = async (id: string | number): Promise => { 45 | if (typeof id !== 'string' && typeof id !== 'number') 46 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 47 | return (await this.#fetch<{ data: IAnime }>(getURL('anime', `${id}`))).data 48 | } 49 | 50 | /** 51 | * Gets the full data of anime by its MyAnimeList ID 52 | * @param id MyAnimeList ID of the anime 53 | * @returns The full data of the anime 54 | */ 55 | public getAnimeFullById = async (id: string | number): Promise => { 56 | if (typeof id !== 'string' && typeof id !== 'number') 57 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 58 | return (await this.#fetch<{ data: IAnimeFull }>(getURL('anime', `${id}`, 'full'))).data 59 | } 60 | 61 | /** 62 | * Gets the characters of the anime from its MyAnimeList ID 63 | * @param id MyAnimeList ID of the anime 64 | * @returns The characters of the given anime ID 65 | */ 66 | public getAnimeCharacters = async (id: string | number): Promise => { 67 | if (typeof id !== 'string' && typeof id !== 'number') 68 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 69 | return (await this.#fetch<{ data: IAnimeCharacter[] }>(getURL('anime', `${id}`, 'characters'))).data 70 | } 71 | 72 | /** 73 | * Gets the staffs of the anime from its MyAnimeList ID 74 | * @param id MyAnimeList ID of the anime 75 | * @returns The staffs of given anime ID 76 | */ 77 | public getAnimeStaff = async (id: string | number): Promise => { 78 | if (typeof id !== 'string' && typeof id !== 'number') 79 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 80 | return (await this.#fetch<{ data: IAnimeStaff[] }>(getURL('anime', `${id}`, 'staff'))).data 81 | } 82 | 83 | /** 84 | * Gets the episodes of the anime from its MyAnimeList ID 85 | * @param id MyAnimeList ID of the anime 86 | * @param config Config to make the request 87 | * @returns List of episodes with the pagination 88 | */ 89 | public getAnimeEpisodes = async ( 90 | id: string | number, 91 | config?: ICommonConfig 92 | ): Promise<{ data: IEpisodeFromList[]; pagination: IPagination }> => { 93 | if (typeof id !== 'string' && typeof id !== 'number') 94 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 95 | return await this.#fetch<{ data: IEpisodeFromList[]; pagination: IPagination }>( 96 | getURL('anime', `${id}`, 'episodes').concat(getQueryString(config || {})) 97 | ) 98 | } 99 | 100 | /** 101 | * Gets the data of an anime's episode by its anime & episode ID 102 | * @param id MyAnimeList ID of the anime 103 | * @param episode_id Episode ID of the anime 104 | * @returns Data of the required episode 105 | */ 106 | public getAnimeEpisodeById = async ( 107 | id: string | number, 108 | episode_id: string | number 109 | ): Promise => { 110 | if (typeof id !== 'string' && typeof id !== 'number') 111 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 112 | if (typeof episode_id !== 'string' && typeof episode_id !== 'number') 113 | throw new TypeError(getTypeErrorMessage('episode_id', 'string or number', typeof id)) 114 | return (await this.#fetch<{ data: IEpisodeResponse }>(getURL('anime', `${id}`, 'episodes', `${episode_id}`))) 115 | .data 116 | } 117 | 118 | /** 119 | * Gets the list of news related to a anime from its MyAnimeList ID 120 | * @param id MyAnimeList ID of the anime 121 | * @param config Config to make the request 122 | * @returns List of news related to the anime 123 | */ 124 | public getAnimeNews = async ( 125 | id: string | number, 126 | config?: ICommonConfig 127 | ): Promise<{ data: INewsResponse[]; pagination: IPagination }> => { 128 | if (typeof id !== 'string' && typeof id !== 'number') 129 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 130 | return await this.#fetch<{ data: INewsResponse[]; pagination: IPagination }>( 131 | getURL('anime', `${id}`, 'news').concat(getQueryString(config || {})) 132 | ) 133 | } 134 | 135 | /** 136 | * Gets the forums related to an anime from its MyAnimeList ID 137 | * @param id MyAnimeList ID of the anime 138 | * @param config Config to make the request 139 | * @returns List of the forums related to the anime 140 | */ 141 | public getAnimeForum = async (id: string | number, config?: IForumConfig): Promise => { 142 | if (typeof id !== 'string' && typeof id !== 'number') 143 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 144 | return ( 145 | await this.#fetch<{ data: IForum[] }>( 146 | getURL('anime', `${id}`, 'forum').concat(getQueryString(config || {})) 147 | ) 148 | ).data 149 | } 150 | 151 | /** 152 | * Gets the anime videos of the given MyAnimeList ID 153 | * @param id MyAnimeList ID of the anime 154 | * @returns Videos of the anime 155 | */ 156 | public getAnimeVideos = async (id: string | number): Promise => { 157 | if (typeof id !== 'string' && typeof id !== 'number') 158 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 159 | return (await this.#fetch<{ data: IAnimeVideo }>(getURL('anime', `${id}`, 'videos'))).data 160 | } 161 | 162 | /** 163 | * Gets the episode videos of an anime from its MyAnimeList ID 164 | * @param id MyAnimeList ID of the anime 165 | * @param config Config to make the request 166 | * @returns Episode videos of the anime 167 | */ 168 | public getAnimeVideosEpisodes = async ( 169 | id: string | number, 170 | config?: ICommonConfig 171 | ): Promise<{ data: IAnimeVideosEpisode[]; pagination: IPagination }> => { 172 | if (typeof id !== 'string' && typeof id !== 'number') 173 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 174 | return await this.#fetch<{ data: IAnimeVideosEpisode[]; pagination: IPagination }>( 175 | getURL('anime', `${id}`, 'videos', 'episodes').concat(getQueryString(config || {})) 176 | ) 177 | } 178 | 179 | /** 180 | * Gets the pictures of an anime from its MyAnimeList ID 181 | * @param id MyAnimeList ID of the anime 182 | * @returns List of images of the anime in different formats 183 | */ 184 | public getAnimePictures = async (id: string | number): Promise => { 185 | if (typeof id !== 'string' && typeof id !== 'number') 186 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 187 | return (await this.#fetch<{ data: IPicture[] }>(getURL('anime', `${id}`, 'pictures'))).data 188 | } 189 | 190 | /** 191 | * Gets the statistics of an anime from its MyAnimeList ID 192 | * @param id MyAnimeList ID of the anime 193 | * @returns Stats of the anime 194 | */ 195 | public getAnimeStatistics = async (id: string | number): Promise => { 196 | if (typeof id !== 'string' && typeof id !== 'number') 197 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 198 | return (await this.#fetch<{ data: IAnimeStatistics }>(getURL('anime', `${id}`, 'statistics'))).data 199 | } 200 | 201 | /** 202 | * Gets more info of an anime from its MyAnimeList ID 203 | * @param id MyAnimeList ID of the anime 204 | * @returns More info of the anime 205 | */ 206 | public getAnimeMoreInfo = async (id: string | number): Promise => { 207 | if (typeof id !== 'string' && typeof id !== 'number') 208 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 209 | return (await this.#fetch<{ data: IMoreInfo }>(getURL('anime', `${id}`, 'moreinfo'))).data 210 | } 211 | 212 | /** 213 | * Gets recommendations of an anime from its MyAnimeList ID 214 | * @param id MyAnimeList ID of the anime 215 | * @returns List of recommenedations from the anime 216 | */ 217 | public getAnimeRecommendations = async (id: string | number): Promise => { 218 | if (typeof id !== 'string' && typeof id !== 'number') 219 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 220 | return (await this.#fetch<{ data: IRecommendation[] }>(getURL('anime', `${id}`, 'recommendations'))).data 221 | } 222 | 223 | /** 224 | * Gets the list of user updates of an anime from its MyAnimeList ID 225 | * @param id MyAnimeList ID of the anime 226 | * @param config Config to make the request 227 | * @returns List of user updates of the anime 228 | */ 229 | public getAnimeUserUpdates = async ( 230 | id: string | number, 231 | config?: ICommonConfig 232 | ): Promise<{ data: IAnimeUserUpdate[]; pagination: IPagination }> => { 233 | if (typeof id !== 'string' && typeof id !== 'number') 234 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 235 | return await this.#fetch<{ data: IAnimeUserUpdate[]; pagination: IPagination }>( 236 | getURL('anime', `${id}`, 'userupdates').concat(getQueryString(config || {})) 237 | ) 238 | } 239 | 240 | /** 241 | * Gets the reviews of an anime by its MyAnimeList ID 242 | * @param id MyAnimeList ID of the anime 243 | * @param config Config to make the request 244 | * @returns Reviews of the anime 245 | */ 246 | public getAnimeReviews = async ( 247 | id: string | number, 248 | config?: IReviewConfig 249 | ): Promise<{ pagination: IPagination; data: IAnimeReview[] }> => { 250 | if (typeof id !== 'string' && typeof id !== 'number') 251 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 252 | return await this.#fetch<{ pagination: IPagination; data: IAnimeReview[] }>( 253 | getURL('anime', `${id}`, 'reviews').concat(getQueryString(config || {})) 254 | ) 255 | } 256 | 257 | /** 258 | * Gets the relations of an anime by its MyAnimeList ID 259 | * @param id MyAnimeList ID of the anime 260 | * @returns Relations of the anime 261 | */ 262 | public getAnimeRelations = async (id: string | number): Promise => { 263 | if (typeof id !== 'string' && typeof id !== 'number') 264 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 265 | return (await this.#fetch<{ data: IRelation[] }>(getURL('anime', `${id}`, 'relations'))).data 266 | } 267 | 268 | /** 269 | * Gets the themes of an anime by its MyAnimeList ID 270 | * @param id MyAnimeList ID of the anime 271 | * @returns Themes of the anime 272 | */ 273 | public getAnimeThemes = async (id: string | number): Promise => { 274 | if (typeof id !== 'string' && typeof id !== 'number') 275 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 276 | return (await this.#fetch<{ data: IAnime['themes'] }>(getURL('anime', `${id}`, 'themes'))).data 277 | } 278 | 279 | /** 280 | * Gets the external sites of an anime by its MyAnimeList ID 281 | * @param id MyAnimeList ID of the anime 282 | * @returns External sites of the anime 283 | */ 284 | public getAnimeExternal = async (id: string | number): Promise => { 285 | if (typeof id !== 'string' && typeof id !== 'number') 286 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 287 | return (await this.#fetch<{ data: IAnimeFull['external'] }>(getURL('anime', `${id}`, 'external'))).data 288 | } 289 | 290 | /** 291 | * Gets streaming platforms of an anime from its MyAnimeList ID 292 | * @param id MyAnimeList ID of the anime 293 | * @returns Streaming platforms of the anime with their URLs 294 | */ 295 | public getAnimeStreaming = async (id: string | number): Promise => { 296 | if (typeof id !== 'string' && typeof id !== 'number') 297 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 298 | return (await this.#fetch<{ data: IAnimeFull['streaming'] }>(getURL('anime', `${id}`, 'streaming'))).data 299 | } 300 | 301 | /** 302 | * Searches for anime in MyAnimeList 303 | * @param config Config to make the search 304 | * @returns Results of the search 305 | */ 306 | public getAnimeSearch = async ( 307 | config?: IAnimeSearchConfig 308 | ): Promise<{ data: IAnime[]; pagination: IExtendedPagination }> => 309 | await this.#fetch<{ data: IAnime[]; pagination: IExtendedPagination }>( 310 | getURL('anime').concat(getQueryString(config || {})) 311 | ) 312 | } 313 | -------------------------------------------------------------------------------- /src/lib/jikan/characters.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { ICharacter, ICharacterFull, ICommonPicture, ICharacterSearchConfig, IExtendedPagination } from '../../types' 3 | import { Fetch, getURL, getQueryString, getTypeErrorMessage } from '../../utils' 4 | 5 | export class Characters { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [characters](https://docs.api.jikan.moe/#tag/characters) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the data of a character from its MyAnimeList ID 17 | * @param id MyAnimeList ID of the character 18 | * @returns The data of the character 19 | */ 20 | public getCharacterById = async (id: string | number): Promise => { 21 | if (typeof id !== 'string' && typeof id !== 'number') 22 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 23 | return (await this.#fetch<{ data: ICharacter }>(getURL('characters', `${id}`))).data 24 | } 25 | 26 | /** 27 | * Gets the full data of a character from its MyAnimeList ID 28 | * @param id MyAnimeList ID of the character 29 | * @returns The full data of the character 30 | */ 31 | public getCharacterFullById = async (id: string | number): Promise => { 32 | if (typeof id !== 'string' && typeof id !== 'number') 33 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 34 | return (await this.#fetch<{ data: ICharacterFull }>(getURL('characters', `${id}`, 'full'))).data 35 | } 36 | 37 | /** 38 | * Gets the list of anime appeared by a character from its MyAnimeList ID 39 | * @param id MyAnimeList ID of the character 40 | * @returns List of anime appeared by the character 41 | */ 42 | public getCharacterAnime = async (id: string | number): Promise => { 43 | if (typeof id !== 'string' && typeof id !== 'number') 44 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 45 | return (await this.#fetch<{ data: ICharacterFull['anime'] }>(getURL('characters', `${id}`, 'anime'))).data 46 | } 47 | 48 | /** 49 | * Gets the list of manga appeared by a character from its MyAnimeList ID 50 | * @param id MyAnimeList ID of the character 51 | * @returns List of manga appeared by the character 52 | */ 53 | public getCharacterManga = async (id: string | number): Promise => { 54 | if (typeof id !== 'string' && typeof id !== 'number') 55 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 56 | return (await this.#fetch<{ data: ICharacterFull['manga'] }>(getURL('characters', `${id}`, 'manga'))).data 57 | } 58 | 59 | /** 60 | * Gets the voice actors of a character from its MyAnimeList ID 61 | * @param id MyAnimeList ID of the character 62 | * @returns Voice actors of the character 63 | */ 64 | public getCharacterVoiceActors = async (id: number | string): Promise => { 65 | if (typeof id !== 'string' && typeof id !== 'number') 66 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 67 | return (await this.#fetch<{ data: ICharacterFull['voices'] }>(getURL('characters', `${id}`, 'voices'))).data 68 | } 69 | 70 | /** 71 | * Gets the pictures of a character from its MyAnimeList ID 72 | * @param id MyAnimeList ID of the character 73 | * @returns Pictures of the character 74 | */ 75 | public getCharacterPictures = async (id: string | number): Promise => { 76 | if (typeof id !== 'string' && typeof id !== 'number') 77 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 78 | return (await this.#fetch<{ data: ICommonPicture[] }>(getURL('characters', `${id}`, 'pictures'))).data 79 | } 80 | 81 | /** 82 | * Searches for a character in MyAnimeList 83 | * @param config Config to make the search 84 | * @returns The results of the search 85 | */ 86 | public getCharactersSearch = async ( 87 | config?: ICharacterSearchConfig 88 | ): Promise<{ data: ICharacter[]; pagination: IExtendedPagination }> => 89 | await this.#fetch<{ data: ICharacter[]; pagination: IExtendedPagination }>( 90 | getURL('characters').concat(getQueryString(config || {})) 91 | ) 92 | } 93 | -------------------------------------------------------------------------------- /src/lib/jikan/clubs.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { Fetch, getQueryString, getTypeErrorMessage, getURL } from '../../utils' 3 | import { 4 | IClub, 5 | IClubMember, 6 | IClubRelations, 7 | IClubSearchConfig, 8 | IClubStaff, 9 | ICommonConfig, 10 | IPagination 11 | } from '../../types' 12 | 13 | export class Clubs { 14 | #fetch: Fetch['get'] 15 | /** 16 | * Constructs an instance of the [clubs](https://docs.api.jikan.moe/#tag/clubs) client 17 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 18 | */ 19 | constructor(cacheOptions?: CacheOptions) { 20 | this.#fetch = new Fetch(cacheOptions).get 21 | } 22 | 23 | /** 24 | * Gets the data of a MyAnimeList club from its ID 25 | * @param id MyAnimeList ID of the club 26 | * @returns The data of the club 27 | */ 28 | public getClubsById = async (id: string | number): Promise => { 29 | if (typeof id !== 'string' && typeof id !== 'number') 30 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 31 | return (await this.#fetch<{ data: IClub }>(getURL('clubs', `${id}`))).data 32 | } 33 | 34 | /** 35 | * Gets the members of a MyAnimeList club from its id 36 | * @param id MyAnimelist ID of the club 37 | * @returns Members of the club 38 | */ 39 | public getClubMembers = async ( 40 | id: string | number, 41 | config?: ICommonConfig 42 | ): Promise<{ pagination: IPagination; data: IClubMember[] }> => { 43 | if (typeof id !== 'string' && typeof id !== 'number') 44 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 45 | return await this.#fetch<{ data: IClubMember[]; pagination: IPagination }>( 46 | getURL('clubs', `${id}`, 'members').concat(getQueryString(config || {})) 47 | ) 48 | } 49 | 50 | /** 51 | * Gets the staffs of a MyAnimeList club from its ID 52 | * @param id MyAnimeList ID of the club 53 | * @returns Staffs of the club 54 | */ 55 | public getClubStaff = async (id: string | number): Promise => { 56 | if (typeof id !== 'string' && typeof id !== 'number') 57 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 58 | return (await this.#fetch<{ data: IClubStaff[] }>(getURL('clubs', `${id}`, 'staff'))).data 59 | } 60 | 61 | /** 62 | * Gets the relations of a MyAnimeList club from its ID 63 | * @param id MyAnimeList ID of the club 64 | * @returns Relations of the club 65 | */ 66 | public getClubRelations = async (id: string | number): Promise => { 67 | if (typeof id !== 'string' && typeof id !== 'number') 68 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 69 | return (await this.#fetch<{ data: IClubRelations }>(getURL('clubs', `${id}`, 'relations'))).data 70 | } 71 | 72 | /** 73 | * Searches for MyAnimeList clubs 74 | * @param config Config to make the search 75 | * @returns Search results of the clubs 76 | */ 77 | public getClubsSearch = async (config?: IClubSearchConfig) => 78 | await this.#fetch<{ data: IClub[]; pagination: IPagination }>( 79 | getURL('clubs').concat(getQueryString(config || {})) 80 | ) 81 | } 82 | -------------------------------------------------------------------------------- /src/lib/jikan/genres.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { getURL, getQueryString, Fetch } from '../../utils' 3 | import { IGenreConfig, ICommonResource } from '../../types' 4 | 5 | export class Genres { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [genres](https://docs.api.jikan.moe/#tag/genres) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the list of anime genres 17 | * @param config Config to make the request 18 | * @returns List of anime genres 19 | */ 20 | public getAnimeGenres = async (config?: IGenreConfig): Promise => 21 | ( 22 | await this.#fetch<{ data: ICommonResource[] }>( 23 | getURL('genres', 'anime').concat(getQueryString(config || {})) 24 | ) 25 | ).data 26 | 27 | /** 28 | * Gets the list of manga genres 29 | * @param config Config to make the request 30 | * @returns List of manga genres 31 | */ 32 | public getMangaGenres = async (config?: IGenreConfig): Promise => 33 | ( 34 | await this.#fetch<{ data: ICommonResource[] }>( 35 | getURL('genres', 'manga').concat(getQueryString(config || {})) 36 | ) 37 | ).data 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/jikan/index.ts: -------------------------------------------------------------------------------- 1 | export * from './anime' 2 | export * from './characters' 3 | export * from './clubs' 4 | export * from './genres' 5 | export * from './magazines' 6 | export * from './manga' 7 | export * from './people' 8 | export * from './reviews' 9 | export * from './schedules' 10 | export * from './producers' 11 | export * from './recommendations' 12 | export * from './seasons' 13 | export * from './users' 14 | export * from './watch' 15 | export * from './random' 16 | export * from './top' 17 | -------------------------------------------------------------------------------- /src/lib/jikan/magazines.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { Fetch, getURL, getQueryString } from '../../utils' 3 | import { ICommonResource, IMagazineConfig, IPagination } from '../../types' 4 | 5 | export class Magazines { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [magazines](https://docs.api.jikan.moe/#tag/magazines) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Searches for magazines in MyAnimeList 17 | * @param config Config to make the search 18 | * @returns Results of the magazine search 19 | */ 20 | public getMagazines = async ( 21 | config?: IMagazineConfig 22 | ): Promise<{ data: ICommonResource[]; pagination: IPagination }> => 23 | await this.#fetch<{ data: ICommonResource[]; pagination: IPagination }>( 24 | getURL('magazines').concat(getQueryString(config || {})) 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /src/lib/jikan/manga.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { Fetch, getURL, getTypeErrorMessage, getQueryString } from '../../utils' 3 | import { 4 | ICharacterFromSource, 5 | ICommonConfig, 6 | IForum, 7 | IManga, 8 | IMangaFull, 9 | IMangaStatistics, 10 | IMangaUserUpdate, 11 | IMoreInfo, 12 | INewsResponse, 13 | IPagination, 14 | IPicture, 15 | IRecommendation, 16 | IMangaReview, 17 | IReviewConfig, 18 | IExtendedPagination, 19 | IMangaSearchConfig, 20 | IForumConfig 21 | } from '../../types' 22 | 23 | export class Manga { 24 | #fetch: Fetch['get'] 25 | /** 26 | * Constructs an instance of the [manga](https://docs.api.jikan.moe/#tag/manga) client 27 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 28 | */ 29 | constructor(cacheOptions?: CacheOptions) { 30 | this.#fetch = new Fetch(cacheOptions).get 31 | } 32 | 33 | /** 34 | * Gets the data of a manga from its MyAnimeList ID 35 | * @param id MyAnimeList ID of the manga 36 | * @returns The data of the manga 37 | */ 38 | public getMangaById = async (id: string | number): Promise => { 39 | if (typeof id !== 'string' && typeof id !== 'number') 40 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 41 | return (await this.#fetch<{ data: IManga }>(getURL('manga', `${id}`))).data 42 | } 43 | 44 | /** 45 | * Gets the full data of a manga from its MyAnimeList ID 46 | * @param id MyAnimeList ID of the manga 47 | * @returns The full data of the manga 48 | */ 49 | public getMangaFullById = async (id: string | number): Promise => { 50 | if (typeof id !== 'string' && typeof id !== 'number') 51 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 52 | return (await this.#fetch<{ data: IMangaFull }>(getURL('manga', `${id}`, 'full'))).data 53 | } 54 | 55 | /** 56 | * Gets the list of characters of a manga from its MyAnimeList ID 57 | * @param id MyAnimeList ID of the manga 58 | * @returns List of characters of the manga 59 | */ 60 | public getMangaCharacters = async (id: string | number): Promise => { 61 | if (typeof id !== 'string' && typeof id !== 'number') 62 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 63 | return (await this.#fetch<{ data: ICharacterFromSource[] }>(getURL('manga', `${id}`, 'characters'))).data 64 | } 65 | 66 | /** 67 | * Gets the list of news related to a manga from its MyAnimeList ID 68 | * @param id MyAnimeList ID of the manga 69 | * @param config Config to make the request 70 | * @returns List of news related to the manga 71 | */ 72 | public getMangaNews = async ( 73 | id: string | number, 74 | config?: ICommonConfig 75 | ): Promise<{ data: INewsResponse[]; pagination: IPagination }> => { 76 | if (typeof id !== 'string' && typeof id !== 'number') 77 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 78 | return await this.#fetch<{ data: INewsResponse[]; pagination: IPagination }>( 79 | getURL('manga', `${id}`, 'news').concat(getQueryString(config || {})) 80 | ) 81 | } 82 | 83 | /** 84 | * Gets the topics related to a manga from its MyAnimeList ID 85 | * @param id MyAnimeList ID of the manga 86 | * @returns List of topics related to the manga 87 | */ 88 | public getMangaTopics = async (id: string | number, config?: IForumConfig): Promise => { 89 | if (typeof id !== 'string' && typeof id !== 'number') 90 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 91 | return ( 92 | await this.#fetch<{ data: IForum[] }>( 93 | getURL('manga', `${id}`, 'forum').concat(getQueryString(config || {})) 94 | ) 95 | ).data 96 | } 97 | 98 | /** 99 | * Gets the pictures of a manga from its MyAnimeList ID 100 | * @param id MyAnimeList ID of the manga 101 | * @returns Pictures of the manga 102 | */ 103 | public getMangaPictures = async (id: string | number): Promise => { 104 | if (typeof id !== 'string' && typeof id !== 'number') 105 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 106 | return (await this.#fetch<{ data: IPicture[] }>(getURL('manga', `${id}`, 'pictures'))).data 107 | } 108 | 109 | /** 110 | * Gets the statistics of a manga from its MyAnimeList ID 111 | * @param id MyAnimeList ID of the manga 112 | * @returns Statistics of the manga 113 | */ 114 | public getMangaStatistics = async (id: string | number): Promise => { 115 | if (typeof id !== 'string' && typeof id !== 'number') 116 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 117 | return (await this.#fetch<{ data: IMangaStatistics }>(getURL('manga', `${id}`, 'statistics'))).data 118 | } 119 | 120 | /** 121 | * Gets more info of a manga from its MyAnimeList ID 122 | * @param id MyAnimeList ID of the manga 123 | * @returns More info of the manga 124 | */ 125 | public getMangaMoreInfo = async (id: string | number): Promise => { 126 | if (typeof id !== 'string' && typeof id !== 'number') 127 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 128 | return (await this.#fetch<{ data: IMoreInfo }>(getURL('manga', `${id}`, 'moreinfo'))).data 129 | } 130 | 131 | /** 132 | * Gets recommendations of a manga from its MyAnimeList ID 133 | * @param id MyAnimeList ID of the manga 134 | * @returns List of recommendations from the manga 135 | */ 136 | public getMangaRecommendations = async (id: string | number): Promise => { 137 | if (typeof id !== 'string' && typeof id !== 'number') 138 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 139 | return (await this.#fetch<{ data: IRecommendation[] }>(getURL('manga', `${id}`, 'recommendations'))).data 140 | } 141 | 142 | /** 143 | * Gets user updates of a manga from its MyAnimeList ID 144 | * @param id MyAnimeList ID of the manga 145 | * @param config Config to make the request 146 | * @returns List of user updates of the manga 147 | */ 148 | public getMangaUserUpdates = async ( 149 | id: string | number, 150 | config?: ICommonConfig 151 | ): Promise<{ data: IMangaUserUpdate[]; pagination: IPagination }> => { 152 | if (typeof id !== 'string' && typeof id !== 'number') 153 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 154 | return await this.#fetch<{ data: IMangaUserUpdate[]; pagination: IPagination }>( 155 | getURL('manga', `${id}`, 'userupdates').concat(getQueryString(config || {})) 156 | ) 157 | } 158 | 159 | /** 160 | * Gets the reviews of a manga from its MyAnimeList ID 161 | * @param id MyAnimeList ID of the manga 162 | * @param config Config to make the request 163 | * @returns 164 | */ 165 | public getMangaReviews = async ( 166 | id: string | number, 167 | config?: IReviewConfig 168 | ): Promise<{ data: IMangaReview[]; pagination: IPagination }> => { 169 | if (typeof id !== 'string' && typeof id !== 'number') 170 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 171 | return await this.#fetch<{ pagination: IPagination; data: IMangaReview[] }>( 172 | getURL('manga', `${id}`, 'reviews').concat(getQueryString(config || {})) 173 | ) 174 | } 175 | 176 | /** 177 | * Gets relation of a manga from its MyAnimeList ID 178 | * @param id MyAnimeList ID of the manga 179 | * @returns Relations of the manga 180 | */ 181 | public getMangaRelations = async (id: string | number): Promise => { 182 | if (typeof id !== 'string' && typeof id !== 'number') 183 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 184 | return (await this.#fetch<{ data: IMangaFull['relations'] }>(getURL('manga', `${id}`, 'relations'))).data 185 | } 186 | 187 | /** 188 | * Get external sites of a manga from its MyAnimeList ID 189 | * @param id MyAnimeList ID of the manga 190 | * @returns External sites of the manga 191 | */ 192 | public getMangaExternal = async (id: string | number): Promise => { 193 | if (typeof id !== 'string' && typeof id !== 'number') 194 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 195 | return (await this.#fetch<{ data: IMangaFull['external'] }>(getURL('manga', `${id}`, 'external'))).data 196 | } 197 | 198 | /** 199 | * Searches for manga in MyAnimeList 200 | * @param config Config to make the search 201 | * @returns Search results of the manga 202 | */ 203 | public getMangaSearch = async ( 204 | config?: IMangaSearchConfig 205 | ): Promise<{ data: IManga[]; pagination: IExtendedPagination }> => 206 | await this.#fetch<{ data: IManga[]; pagination: IExtendedPagination }>( 207 | getURL('manga').concat(getQueryString(config || {})) 208 | ) 209 | } 210 | -------------------------------------------------------------------------------- /src/lib/jikan/people.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { ICommonPicture, IExtendedPagination, IPerson, IPersonFull, IPersonSearchConfig } from '../../types' 3 | import { Fetch, getQueryString, getTypeErrorMessage, getURL } from '../../utils' 4 | 5 | export class People { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [people](https://docs.api.jikan.moe/#tag/people) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the data of a person from its MyAnimeList ID 17 | * @param id MyAnimeList ID of the person 18 | * @returns Data of the person 19 | */ 20 | public getPersonById = async (id: string | number): Promise => { 21 | if (typeof id !== 'string' && typeof id !== 'number') 22 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 23 | return (await this.#fetch<{ data: IPerson }>(getURL('people', `${id}`))).data 24 | } 25 | 26 | /** 27 | * Gets the full data of a person from its MyAnimeList ID 28 | * @param id MyAnimeList ID of the person 29 | * @returns Full data of the person 30 | */ 31 | public getPersonByIdFull = async (id: string | number): Promise => { 32 | if (typeof id !== 'string' && typeof id !== 'number') 33 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 34 | return (await this.#fetch<{ data: IPersonFull }>(getURL('people', `${id}`, 'full'))).data 35 | } 36 | 37 | /** 38 | * Gets list of the anime contributed by a person from its MyAnimeList ID 39 | * @param id MyAnimeList ID of the person 40 | * @returns List of anime contributed by the person 41 | */ 42 | public getPersonAnime = async (id: string | number): Promise => { 43 | if (typeof id !== 'string' && typeof id !== 'number') 44 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 45 | return (await this.#fetch<{ data: IPersonFull['anime'] }>(getURL('people', `${id}`, 'anime'))).data 46 | } 47 | 48 | /** 49 | * Gets list of the voices featured by a person from its MyAnimeList ID 50 | * @param id MyAnimeList ID of the person 51 | * @returns List of voices featured by the person 52 | */ 53 | public getPersonVoices = async (id: string | number): Promise => { 54 | if (typeof id !== 'string' && typeof id !== 'number') 55 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 56 | return (await this.#fetch<{ data: IPersonFull['voices'] }>(getURL('people', `${id}`, 'voices'))).data 57 | } 58 | 59 | /** 60 | * Gets list of the manga contributed by a person from its MyAnimeList ID 61 | * @param id MyAnimeList ID of the person 62 | * @returns List of manga contributed by the person 63 | */ 64 | public getPersonManga = async (id: string | number): Promise => { 65 | if (typeof id !== 'string' && typeof id !== 'number') 66 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 67 | return (await this.#fetch<{ data: IPersonFull['manga'] }>(getURL('people', `${id}`, 'manga'))).data 68 | } 69 | 70 | /** 71 | * Gets the pictures of a person from its MyAnimeList ID 72 | * @param id MyAnimeList ID of the person 73 | * @returns Pictures of the person 74 | */ 75 | public getPersonPictures = async (id: string | number): Promise => { 76 | if (typeof id !== 'string' && typeof id !== 'number') 77 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 78 | return (await this.#fetch<{ data: ICommonPicture[] }>(getURL('people', `${id}`, 'pictures'))).data 79 | } 80 | 81 | /** 82 | * Searches for person in MyAnimeList 83 | * @param config Config to make the search 84 | * @returns Results of the search 85 | */ 86 | public getPeopleSearch = async ( 87 | config?: IPersonSearchConfig 88 | ): Promise<{ pagination: IExtendedPagination; data: IPerson[] }> => 89 | await this.#fetch<{ pagination: IExtendedPagination; data: IPerson[] }>( 90 | getURL('people').concat(getQueryString(config || {})) 91 | ) 92 | } 93 | -------------------------------------------------------------------------------- /src/lib/jikan/producers.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { getURL, Fetch, getTypeErrorMessage, getQueryString } from '../../utils' 3 | import { IExtendedPagination, IProducer, IProducerFull, IProducerSearchConfig } from '../../types' 4 | 5 | export class Producers { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [producers](https://docs.api.jikan.moe/#tag/producers) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the data of a producer from its MyAnimeList ID 17 | * @param id MyAnimeList ID of the producer 18 | * @returns Data of the producer 19 | */ 20 | public getProducerById = async (id: string | number): Promise => { 21 | if (typeof id !== 'string' && typeof id !== 'number') 22 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 23 | return (await this.#fetch<{ data: IProducer }>(getURL('producers', `${id}`))).data 24 | } 25 | 26 | /** 27 | * Gets the full data of a producer from its MyAnimeList ID 28 | * @param id MyAnimeList ID of the producer 29 | * @returns Full data of the producer 30 | */ 31 | public getProducerFullById = async (id: string | number): Promise => { 32 | if (typeof id !== 'string' && typeof id !== 'number') 33 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 34 | return (await this.#fetch<{ data: IProducerFull }>(getURL('producers', `${id}`, 'full'))).data 35 | } 36 | 37 | /** 38 | * Gets the external sites of a producer from its MyAnimeList ID 39 | * @param id MyAnimeList ID of the producer 40 | * @returns External sites of the producer 41 | */ 42 | public getProducerExternal = async (id: string | number): Promise => { 43 | if (typeof id !== 'string' && typeof id !== 'number') 44 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 45 | return (await this.#fetch<{ data: IProducerFull['external'] }>(getURL('producers', `${id}`, 'external'))).data 46 | } 47 | 48 | /** 49 | * Searches for producers in MyAnimeList 50 | * @param config Config to make the request 51 | * @returns Result of the search 52 | */ 53 | public getProducers = async ( 54 | config?: IProducerSearchConfig 55 | ): Promise<{ pagination: IExtendedPagination; data: IProducer[] }> => 56 | await this.#fetch<{ pagination: IExtendedPagination; data: IProducer[] }>( 57 | getURL('producers').concat(getQueryString(config || {})) 58 | ) 59 | } 60 | -------------------------------------------------------------------------------- /src/lib/jikan/random.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { IAnime, ICharacter, IManga, IPerson, IUserProfile } from '../../types' 3 | import { Fetch, getURL } from '../../utils' 4 | 5 | export class Random { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [random](https://docs.api.jikan.moe/#tag/random) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the data of a random anime 17 | * @returns Data of the random anime 18 | */ 19 | public getRandomAnime = async (): Promise => 20 | (await this.#fetch<{ data: IAnime }>(getURL('random', 'anime'))).data 21 | 22 | /** 23 | * Gets the data of a random manga 24 | * @returns Data of the random manga 25 | */ 26 | public getRandomManga = async (): Promise => 27 | (await this.#fetch<{ data: IManga }>(getURL('random', 'manga'))).data 28 | 29 | /** 30 | * Gets the data of a random character 31 | * @returns Data of the random character 32 | */ 33 | public getRandomCharacters = async (): Promise => 34 | (await this.#fetch<{ data: ICharacter }>(getURL('random', 'characters'))).data 35 | 36 | /** 37 | * Gets the data of a random person 38 | * @returns Data of the random person 39 | */ 40 | public getRandomPeople = async (): Promise => 41 | (await this.#fetch<{ data: IPerson }>(getURL('random', 'people'))).data 42 | 43 | /** 44 | * Gets the profile of a random MyAnimeList user 45 | * @returns Profile of the random MyAnimeList user 46 | */ 47 | public getRandomUsers = async (): Promise => 48 | (await this.#fetch<{ data: IUserProfile }>(getURL('random', 'users'))).data 49 | } 50 | -------------------------------------------------------------------------------- /src/lib/jikan/recommendations.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { Fetch, getQueryString, getURL } from '../../utils' 3 | import { ICommonConfig, IPagination, IRandomRecommendation } from '../../types' 4 | 5 | export class Recommendations { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [recommendations](https://docs.api.jikan.moe/#tag/recommendations) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the list of recent anime recommendations in MyAnimeList 17 | * @param config Config to make the request 18 | * @returns List of recent anime recommendations in MyAnimeList 19 | */ 20 | public getRecentAnimeRecommendations = async ( 21 | config?: ICommonConfig 22 | ): Promise<{ data: IRandomRecommendation[]; pagination: IPagination }> => 23 | await this.#fetch<{ data: IRandomRecommendation[]; pagination: IPagination }>( 24 | getURL('recommendations', 'anime').concat(getQueryString(config || {})) 25 | ) 26 | 27 | /** 28 | * Gets the list of recent manga recommendations in MyAnimeList 29 | * @param config Config to make the request 30 | * @returns List of recent manga recommendations in MyAnimeList 31 | */ 32 | public getRecentMangaRecommendations = async ( 33 | config?: ICommonConfig 34 | ): Promise<{ data: IRandomRecommendation[]; pagination: IPagination }> => 35 | await this.#fetch<{ data: IRandomRecommendation[]; pagination: IPagination }>( 36 | getURL('recommendations', 'manga').concat(getQueryString(config || {})) 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/jikan/reviews.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { IExtendedPagination, IReview, IReviewConfig } from '../../types' 3 | import { Fetch, getQueryString, getURL } from '../../utils' 4 | 5 | export class Reviews { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [reviews](https://docs.api.jikan.moe/#tag/reviews) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the list of recent anime reviews in MyAnimeList 17 | * @param config Config to make the request 18 | * @returns List of recent anime reviews 19 | */ 20 | public getRecentAnimeReviews = async ( 21 | config?: IReviewConfig 22 | ): Promise<{ pagination: IExtendedPagination; data: IReview[] }> => 23 | await this.#fetch<{ pagination: IExtendedPagination; data: IReview[] }>( 24 | getURL('reviews', 'anime').concat(getQueryString(config || {})) 25 | ) 26 | 27 | /** 28 | * Gets the list of recent manga reviews in MyAnimeList 29 | * @param config Config to make the request 30 | * @returns List of recent manga reviews 31 | */ 32 | public getRecentMangaReviews = async ( 33 | config?: IReviewConfig 34 | ): Promise<{ pagination: IExtendedPagination; data: IReview[] }> => 35 | await this.#fetch<{ pagination: IExtendedPagination; data: IReview[] }>( 36 | getURL('reviews', 'manga').concat(getQueryString(config || {})) 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/jikan/schedules.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { IScheduleConfig, IExtendedPagination, IAnime } from '../../types' 3 | import { getURL, Fetch, getQueryString } from '../../utils' 4 | 5 | export class Schedules { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [schedules](https://docs.api.jikan.moe/#tag/schedules) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the list of anime schedules 17 | * @param config Config to make the request 18 | * @returns List of anime schedules 19 | */ 20 | public getSchedules = async ( 21 | config?: IScheduleConfig 22 | ): Promise<{ pagination: IExtendedPagination; data: IAnime[] }> => 23 | await this.#fetch<{ pagination: IExtendedPagination; data: IAnime[] }>( 24 | getURL('schedules').concat(getQueryString(config || {})) 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /src/lib/jikan/seasons.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { getTypeErrorMessage, getQueryString, getURL, Fetch } from '../../utils' 3 | import { ISeasonConfig, ISeasonList, ISeasonResponse } from '../../types' 4 | import { AnimeSeasons } from '../../constants' 5 | 6 | export class Seasons { 7 | #fetch: Fetch['get'] 8 | /** 9 | * Constructs an instance of the [seasons](https://docs.api.jikan.moe/#tag/seasons) client 10 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 11 | */ 12 | constructor(cacheOptions?: CacheOptions) { 13 | this.#fetch = new Fetch(cacheOptions).get 14 | } 15 | 16 | /** 17 | * Gets the list of current season's anime 18 | * @param config Config to make the request 19 | * @returns List of current season's anime 20 | */ 21 | public getSeasonNow = async (config?: ISeasonConfig): Promise => 22 | await this.#fetch( 23 | getURL('seasons', 'now').concat(getQueryString(config || {})) 24 | ) 25 | 26 | /** 27 | * Gets the list for given season's anime of the given year 28 | * @param year Year of the anime 29 | * @param season Season of the anime 30 | * @param config Config to make the request 31 | * @returns The list for given season's anime of the given year 32 | */ 33 | public getSeason = async ( 34 | year: number | string, 35 | season: AnimeSeasons, 36 | config?: ISeasonConfig 37 | ): Promise => { 38 | if (typeof year !== 'string' && typeof year !== 'number') 39 | throw new TypeError(getTypeErrorMessage('year', 'string or number', typeof year)) 40 | if (typeof season !== 'string') throw new TypeError(getTypeErrorMessage('season', 'string', typeof season)) 41 | return await this.#fetch( 42 | getURL('seasons', `${year}`, `${season}`).concat(getQueryString(config || {})) 43 | ) 44 | } 45 | 46 | /** 47 | * Gets the list of available seasons of all the years 48 | * @returns List of available seasons of all the years 49 | */ 50 | public getSeasonsList = async (): Promise => 51 | (await this.#fetch<{ data: ISeasonList[] }>(getURL('seasons'))).data 52 | 53 | /** 54 | * Gets the list of upcoming anime of the current season 55 | * @param config Config to make the request 56 | * @returns The list of upcoming anime of the current season 57 | */ 58 | public getSeasonUpcoming = async (config?: ISeasonConfig): Promise => 59 | await this.#fetch( 60 | getURL('seasons', 'upcoming').concat(getQueryString(config || {})) 61 | ) 62 | } 63 | -------------------------------------------------------------------------------- /src/lib/jikan/top.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { 3 | IAnime, 4 | IExtendedPagination, 5 | IManga, 6 | ITopAnimeConfig, 7 | ITopMangaConfig, 8 | ITopCommonConfig, 9 | IPerson, 10 | ICharacter, 11 | ITopReviewConfig, 12 | IMangaReview, 13 | IAnimeReview 14 | } from '../../types' 15 | import { Fetch, getQueryString, getURL } from '../../utils' 16 | 17 | export class Top { 18 | #fetch: Fetch['get'] 19 | /** 20 | * Constructs an instance of the [top](https://docs.api.jikan.moe/#tag/top) client 21 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 22 | */ 23 | constructor(cacheOptions?: CacheOptions) { 24 | this.#fetch = new Fetch(cacheOptions).get 25 | } 26 | 27 | /** 28 | * Gets the top list of anime in MyAnimeList 29 | * @param config Config to get the top list 30 | * @returns The top list of the anime in MyAnimeList 31 | */ 32 | public getTopAnime = async ( 33 | config?: ITopAnimeConfig 34 | ): Promise<{ pagination: IExtendedPagination; data: IAnime[] }> => 35 | await this.#fetch<{ pagination: IExtendedPagination; data: IAnime[] }>( 36 | getURL('top', 'anime').concat(getQueryString(config || {})) 37 | ) 38 | 39 | /** 40 | * Gets the top list of manga in MyAnimeList 41 | * @param config Config to get the top list 42 | * @returns The top list of the manga in MyAnimeList 43 | */ 44 | public getTopManga = async ( 45 | config?: ITopMangaConfig 46 | ): Promise<{ pagination: IExtendedPagination; data: IManga[] }> => 47 | await this.#fetch<{ pagination: IExtendedPagination; data: IManga[] }>( 48 | getURL('top', 'manga').concat(getQueryString(config || {})) 49 | ) 50 | 51 | /** 52 | * Gets the top list of people in MyAnimeList 53 | * @param config Config to get the top list 54 | * @returns The top list of people in MyAnimeList 55 | */ 56 | public getTopPeople = async ( 57 | config?: ITopCommonConfig 58 | ): Promise<{ pagination: IExtendedPagination; data: IPerson[] }> => 59 | await this.#fetch<{ pagination: IExtendedPagination; data: IPerson[] }>( 60 | getURL('top', 'people').concat(getQueryString(config || {})) 61 | ) 62 | 63 | /** 64 | * Gets the top list of characters in MyAnimeList 65 | * @param config Config to get the top list 66 | * @returns The top list of characters in MyAnimeList 67 | */ 68 | public getTopCharacters = async ( 69 | config?: ITopCommonConfig 70 | ): Promise<{ pagination: IExtendedPagination; data: ICharacter[] }> => 71 | await this.#fetch<{ pagination: IExtendedPagination; data: ICharacter[] }>( 72 | getURL('top', 'characters').concat(getQueryString(config || {})) 73 | ) 74 | 75 | /** 76 | * Gets the top list of reviews in MyAnimeList 77 | * @param config Config to get the top list 78 | * @returns The top list of reviews in MyAnimeList 79 | */ 80 | public getTopReviews = async ( 81 | config?: ITopReviewConfig 82 | ): Promise<{ pagination: IExtendedPagination; data: (IAnimeReview | IMangaReview)[] }> => 83 | await this.#fetch<{ pagination: IExtendedPagination; data: (IAnimeReview | IMangaReview)[] }>( 84 | getURL('top', 'reviews').concat(getQueryString(config || {})) 85 | ) 86 | } 87 | -------------------------------------------------------------------------------- /src/lib/jikan/users.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { 3 | ICommonConfig, 4 | IPagination, 5 | IRandomRecommendation, 6 | IUserAbout, 7 | IUserBaseRes, 8 | IUserById, 9 | IUserClub, 10 | IUserFavorites, 11 | IUserFriend, 12 | IUserFull, 13 | IUserHistory, 14 | IUserHistoryConfig, 15 | IUserProfile, 16 | IUserReview, 17 | IUserSearchConfig, 18 | IUserUpdatesResponse 19 | } from '../../types' 20 | import { Fetch, getQueryString, getTypeErrorMessage, getURL } from '../../utils' 21 | 22 | export class Users { 23 | #fetch: Fetch['get'] 24 | /** 25 | * Constructs an instance of the [users](https://docs.api.jikan.moe/#tag/users) client 26 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 27 | */ 28 | constructor(cacheOptions?: CacheOptions) { 29 | this.#fetch = new Fetch(cacheOptions).get 30 | } 31 | 32 | /** 33 | * Searches for user in MyAnimeList 34 | * @param config Config to make the search 35 | * @returns Results of the user search 36 | */ 37 | public getUsersSearch = async ( 38 | config?: IUserSearchConfig 39 | ): Promise<{ data: IUserBaseRes[]; pagination: IPagination }> => 40 | await this.#fetch<{ data: IUserBaseRes[]; pagination: IPagination }>( 41 | getURL('users').concat(getQueryString(config || {})) 42 | ) 43 | 44 | /** 45 | * Gets the URL & username of a user from its MyAnimeList ID 46 | * @param id MyAnimeList ID of the user 47 | * @returns The URL & username of the user 48 | */ 49 | public getUserById = async (id: string | number): Promise => { 50 | if (typeof id !== 'string' && typeof id !== 'number') 51 | throw new TypeError(getTypeErrorMessage('id', 'string or number', typeof id)) 52 | return (await this.#fetch<{ data: IUserById }>(getURL('users', 'userbyid', `${id}`))).data 53 | } 54 | 55 | /** 56 | * Gets the full profile of a user from its MyAnimeList username 57 | * @param username Username of the user 58 | * @returns The full profile of the user 59 | */ 60 | public getUserFullProfile = async (username: string): Promise => { 61 | if (typeof username !== 'string') 62 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 63 | return (await this.#fetch<{ data: IUserFull }>(getURL('users', username, 'full'))).data 64 | } 65 | 66 | /** 67 | * Gets the profile of a user from its MyAnimeList username 68 | * @param username Username of the user 69 | * @returns The profile of the user 70 | */ 71 | public getUserProfile = async (username: string): Promise => { 72 | if (typeof username !== 'string') 73 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 74 | return (await this.#fetch<{ data: IUserProfile }>(getURL('users', username))).data 75 | } 76 | 77 | /** 78 | * Gets the statistics of a user from its MyAnimeList username 79 | * @param username Username of the user 80 | * @returns The statistics of the user 81 | */ 82 | public getUserStatistics = async (username: string): Promise => { 83 | if (typeof username !== 'string') 84 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 85 | return (await this.#fetch<{ data: IUserFull['statistics'] }>(getURL('users', username, 'statistics'))).data 86 | } 87 | 88 | /** 89 | * Gets the list of favorites of a user from its MyAnimeList username 90 | * @param username Username of the user 91 | * @returns List of favorites of the user 92 | */ 93 | public getUserFavorites = async (username: string): Promise => { 94 | if (typeof username !== 'string') 95 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 96 | return (await this.#fetch<{ data: IUserFavorites }>(getURL('users', username, 'favorites'))).data 97 | } 98 | 99 | /** 100 | * Gets the updates of a user from its MyAnimeList username 101 | * @param username Username of the user 102 | * @returns The updates of the user 103 | */ 104 | public getUserUpdates = async (username: string): Promise => { 105 | if (typeof username !== 'string') 106 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 107 | return (await this.#fetch<{ data: IUserUpdatesResponse }>(getURL('users', username, 'userupdates'))).data 108 | } 109 | 110 | /** 111 | * Gets the about of a user from its MyAnimeList username 112 | * @param username Username of the user 113 | * @returns About of the user 114 | */ 115 | public getUserAbout = async (username: string): Promise => { 116 | if (typeof username !== 'string') 117 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 118 | return (await this.#fetch<{ data: IUserAbout }>(getURL('users', username, 'about'))).data 119 | } 120 | 121 | /** 122 | * Gets the list of histories of a user from its MyAnimeList username 123 | * @param username Username of the user 124 | * @param config Config to make the request 125 | * @returns The list of histories of the user 126 | */ 127 | public getUserHistory = async (username: string, config?: IUserHistoryConfig): Promise => { 128 | if (typeof username !== 'string') 129 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 130 | return ( 131 | await this.#fetch<{ data: IUserHistory[] }>( 132 | getURL('users', username, 'history').concat(getQueryString(config || {})) 133 | ) 134 | ).data 135 | } 136 | 137 | /** 138 | * Gets the list of friends of a user from its MyAnimeList username 139 | * @param username Username of the user 140 | * @param config Config to make the request 141 | * @returns The list of friends of the user 142 | */ 143 | public getUserFriends = async ( 144 | username: string, 145 | config?: ICommonConfig 146 | ): Promise<{ data: IUserFriend[]; pagination: IPagination }> => { 147 | if (typeof username !== 'string') 148 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 149 | return await this.#fetch<{ data: IUserFriend[]; pagination: IPagination }>( 150 | getURL('users', username, 'friends').concat(getQueryString(config || {})) 151 | ) 152 | } 153 | 154 | /** 155 | * Gets the list of reviews posted by a user from its MyAnimeList username 156 | * @param username Username of the user 157 | * @param config Config to make the request 158 | * @returns The list of reviews posted by the user 159 | */ 160 | public getUserReviews = async ( 161 | username: string, 162 | config?: ICommonConfig 163 | ): Promise<{ data: IUserReview[]; pagination: IPagination }> => { 164 | if (typeof username !== 'string') 165 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 166 | return await this.#fetch<{ data: IUserReview[]; pagination: IPagination }>( 167 | getURL('users', username, 'reviews').concat(getQueryString(config || {})) 168 | ) 169 | } 170 | 171 | /** 172 | * Gets the list of recommendations posted by a user from its MyAnimeList username 173 | * @param username Username of the user 174 | * @param config Config to make the request 175 | * @returns The list of recommendations posted by the user 176 | */ 177 | public getUserRecommendations = async ( 178 | username: string, 179 | config?: ICommonConfig 180 | ): Promise<{ data: IRandomRecommendation[]; pagination: IPagination }> => { 181 | if (typeof username !== 'string') 182 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 183 | return await this.#fetch<{ data: IRandomRecommendation[]; pagination: IPagination }>( 184 | getURL('users', username, 'recommendations').concat(getQueryString(config || {})) 185 | ) 186 | } 187 | 188 | /** 189 | * Gets the list of clubs of a user from its MyAnimeList username 190 | * @param username Username of the user 191 | * @param config Config to make the request 192 | * @returns The list of clubs of the user 193 | */ 194 | public getUserClubs = async ( 195 | username: string, 196 | config?: ICommonConfig 197 | ): Promise<{ data: IUserClub[]; pagination: IPagination }> => { 198 | if (typeof username !== 'string') 199 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 200 | return await this.#fetch<{ data: IUserClub[]; pagination: IPagination }>( 201 | getURL('users', username, 'clubs').concat(getQueryString(config || {})) 202 | ) 203 | } 204 | 205 | /** 206 | * Gets the external sites of a user from its MyAnimeList username 207 | * @param username Username of the user 208 | * @returns The external sites of the user 209 | */ 210 | public getUserExternal = async (username: string): Promise => { 211 | if (typeof username !== 'string') 212 | throw new TypeError(getTypeErrorMessage('username', 'string', typeof username)) 213 | return (await this.#fetch<{ data: IUserFull['external'] }>(getURL('users', username, 'external'))).data 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /src/lib/jikan/watch.ts: -------------------------------------------------------------------------------- 1 | import { CacheOptions } from 'axios-cache-interceptor' 2 | import { IWatchEpisode, IWatchPromo } from '../../types' 3 | import { Fetch, getURL } from '../../utils' 4 | 5 | export class Watch { 6 | #fetch: Fetch['get'] 7 | /** 8 | * Constructs an instance of the [watch](https://docs.api.jikan.moe/#tag/watch) client 9 | * @param cacheOptions [Cache options](https://axios-cache-interceptor.js.org/config) for the client to make requests 10 | */ 11 | constructor(cacheOptions?: CacheOptions) { 12 | this.#fetch = new Fetch(cacheOptions).get 13 | } 14 | 15 | /** 16 | * Gets the list of metadata of watching recent anime episodes 17 | * @returns The list of metadata of watching recent anime episodes 18 | */ 19 | public getWatchRecentEpisodes = async (): Promise => 20 | (await this.#fetch<{ data: IWatchEpisode[] }>(getURL('watch', 'episodes'))).data 21 | 22 | /** 23 | * Gets the list of metadata of watching popular anime episodes 24 | * @returns The list of metadata of watching popular anime episodes 25 | */ 26 | public getWatchPopularEpisodes = async (): Promise => 27 | (await this.#fetch<{ data: IWatchEpisode[] }>(getURL('watch', 'episodes', 'popular'))).data 28 | 29 | /** 30 | * Gets the list of metadata of watching recent anime promos 31 | * @returnsThe list of metadata of watching recent anime promos 32 | */ 33 | public getWatchRecentPromos = async (): Promise => 34 | (await this.#fetch<{ data: IWatchPromo[] }>(getURL('watch', 'promos'))).data 35 | 36 | /** 37 | * Gets the list of metadata of watching popular anime promos 38 | * @returns The list of metadata of watching popular anime promos 39 | */ 40 | public getWatchPopularPromos = async (): Promise => 41 | (await this.#fetch<{ data: IWatchPromo[] }>(getURL('watch', 'promos', 'popular'))).data 42 | } 43 | -------------------------------------------------------------------------------- /src/types/anime.ts: -------------------------------------------------------------------------------- 1 | import { 2 | IExtendedImageResponse, 3 | IResource, 4 | ITimeResponse, 5 | IExtendedResource, 6 | IResponse, 7 | ICharacterFromSource, 8 | IScore, 9 | IReview, 10 | ISearchConfig, 11 | IRelation, 12 | IUserUpdate, 13 | ICommonPicture 14 | } from '.' 15 | import { AnimeSeasons, AnimeStatus, AnimeTypes, Ratings } from '../' 16 | 17 | export interface IAnimeFull extends IAnime { 18 | /** Relations of the anime */ 19 | relations: IRelation[] 20 | /** Theme for the anime */ 21 | theme: { 22 | /** Openings of the anime */ 23 | openings: string[] 24 | /** Endings of the anime */ 25 | endings: string[] 26 | } 27 | /** External sites of the anime */ 28 | external: IResource[] 29 | /** Streaming platforms of the anime with their site URL */ 30 | streaming: IResource[] 31 | } 32 | 33 | export interface IAnimeReview extends IReview { 34 | /** Number of episodes watched by the reviewer */ 35 | episodes_watched: number | null 36 | } 37 | 38 | export interface IAnime extends IResponse { 39 | /** Trailer of the anime (from YouTube) */ 40 | trailer: IYouTube 41 | /** Type of the anime */ 42 | type: AnimeTypes 43 | /** Source of the anime */ 44 | source: string 45 | /** Total episodes of the anime */ 46 | episodes: number 47 | /** Status of the anime */ 48 | status: string 49 | /** Whether the anime is airing or not */ 50 | airing: boolean 51 | /** Data of dates the anime aired */ 52 | aired: ITimeResponse 53 | /** Duration of the anime */ 54 | duration: string 55 | /** Rating of the anime */ 56 | rating: string 57 | /** Season which the anime was aired */ 58 | season: AnimeSeasons 59 | /** Year which anime was aired */ 60 | year: number 61 | /** Broadcast data of the anime */ 62 | broadcast: { 63 | /** The day which the anime is broadcasted */ 64 | day: string 65 | /** The time which the anime is broadcasted */ 66 | time: string 67 | /** The timezone of the time given */ 68 | timezone: string 69 | /** Human readable string of the broadcast data */ 70 | string: string 71 | } 72 | /** Producers of the anime */ 73 | producers: IExtendedResource[] 74 | /** Licensors of the anime */ 75 | licensors: IExtendedResource[] 76 | /** Stuidos of the anime */ 77 | studios: IExtendedResource[] 78 | } 79 | 80 | export interface IAnimeSearchConfig extends ISearchConfig { 81 | /** Filter by anime type */ 82 | type?: AnimeTypes 83 | /** Filter by rating */ 84 | rating?: Ratings 85 | /** Filter by anime status */ 86 | status?: AnimeStatus 87 | /** Get entries by order of a field */ 88 | order_by?: 89 | | 'mal_id' 90 | | 'title' 91 | | 'start_date' 92 | | 'end_date' 93 | | 'episodes' 94 | | 'score' 95 | | 'scored_by' 96 | | 'rank' 97 | | 'popularity' 98 | | 'members' 99 | | 'favorites' 100 | } 101 | 102 | export interface IAnimeStaff { 103 | /** Data of the staff */ 104 | person: { 105 | /** MAL ID of the staff */ 106 | mal_id: number 107 | /** MAL URL to the staff */ 108 | url: string 109 | /** Images of the staff */ 110 | images: ICommonPicture 111 | /** Name of the staff */ 112 | name: string 113 | } 114 | /** Positions of the staff in the source */ 115 | positions: string[] 116 | } 117 | 118 | export interface IAnimeCharacter extends ICharacterFromSource { 119 | /** Favorites count of the character */ 120 | favorites: number 121 | /** Voice actors of the character in the anime */ 122 | voice_actors: IVoiceActor[] 123 | } 124 | 125 | export interface IAnimeUserUpdate extends IUserUpdate { 126 | /** Number of episodes seen */ 127 | episodes_seen: number | null 128 | /** Total number of episodes to watch */ 129 | episodes_total: number | null 130 | } 131 | 132 | export interface IYouTube { 133 | /** YouTube ID of the anime trailer video */ 134 | youtube_id: string | null 135 | /** URL to the anime trailer video in YouTube */ 136 | url: string | null 137 | /** YouTube embed URL to the anime trailer video */ 138 | embed_url: string | null 139 | /** Image URLs of the video */ 140 | images: IExtendedImageResponse 141 | } 142 | 143 | export interface IAnimeStatistics { 144 | /** Number of users who has been watching the anime */ 145 | watching: number 146 | /** Number of users who have completed watching the anime */ 147 | completed: number 148 | /** Number of users who have put the anime on hold */ 149 | on_hold: number 150 | /** Number of users who have dropped the anime */ 151 | dropped: number 152 | /** Number of users who have plans to watch the anime */ 153 | plan_to_watch: number 154 | /** Total number of users who have set their status on the anime */ 155 | total: number 156 | /** Scores of the anime given by the users */ 157 | scores: IScore[] 158 | } 159 | 160 | export interface IEpisodeFromList extends IBaseEpisodeResponse { 161 | /** Score of the episode */ 162 | score: number 163 | /** MAL forum URL of the episode */ 164 | forum_url: string 165 | } 166 | 167 | export interface IAnimeVideo { 168 | /** Promos of the anime */ 169 | promo: { 170 | /** Title of the promo */ 171 | title: string 172 | /** Trailer of the promo */ 173 | trailer: IYouTube 174 | }[] 175 | /** Episodes of the anime */ 176 | episodes: IAnimeVideosEpisode[] 177 | /** Music videos of the anime */ 178 | music_videos: { 179 | /** Title of the music video */ 180 | title: string 181 | /** Video of the music video */ 182 | video: IYouTube 183 | /** Data of the music video */ 184 | meta: { 185 | /** Name of the music video */ 186 | name: string 187 | /** Author of the music video */ 188 | author: string 189 | } 190 | }[] 191 | } 192 | 193 | export interface IVoiceActor { 194 | /** Information of the voice actor */ 195 | person: { 196 | /** MAL ID of the voice actor */ 197 | mal_id: number 198 | /** MAL URL of the voice actor */ 199 | url: string 200 | /** Images of the voice actor */ 201 | images: ICommonPicture 202 | /** Name of the voice actor */ 203 | name: string 204 | } 205 | /** Language of the voice actor */ 206 | language: string 207 | } 208 | 209 | export interface IAnimeVideosEpisode { 210 | /** MAL ID of the anime's episode */ 211 | mal_id: number 212 | /** Title of the episode */ 213 | title: string 214 | /** Episode of the anime in human readable string */ 215 | episode: string 216 | /** MAL URL of the episode */ 217 | url: string 218 | /** Images of the episode */ 219 | images: ICommonPicture 220 | } 221 | 222 | export interface IEpisodeResponse extends IBaseEpisodeResponse { 223 | /** Duration of the episode in seconds */ 224 | duration: number 225 | /** Synopsis of the episode */ 226 | synopsis: string | null 227 | } 228 | 229 | export interface IBaseEpisodeResponse { 230 | /** MAL ID of the episode */ 231 | mal_id: number 232 | /** MAL URL of the episode */ 233 | url: string 234 | /** Title of the episode */ 235 | title: string 236 | /** Title of the episode in Japanses */ 237 | title_japanese: string 238 | /** Title of the anime in Romanji */ 239 | title_romanji: string 240 | /** The date which the episode aired */ 241 | aired: string 242 | /** got no idea */ 243 | filler: boolean 244 | /** got no idea */ 245 | recap: false 246 | } 247 | -------------------------------------------------------------------------------- /src/types/characters.ts: -------------------------------------------------------------------------------- 1 | import { IPicture, ISimpleImageResponse, IVoiceActor, ICommonConfig, ICommonPicture } from '.' 2 | import { Sorting } from '../constants' 3 | 4 | export interface ICharacterFull extends ICharacter { 5 | /** List of anime appeared by the character */ 6 | anime: CharacterSource<'anime'>[] 7 | /** List of manga appeared by the character */ 8 | manga: CharacterSource<'manga'>[] 9 | /** Voice actors of the character */ 10 | voices: IVoiceActor[] 11 | } 12 | 13 | export interface ICharacter { 14 | /** MyAnimeList ID of the character */ 15 | mal_id: number 16 | /** MyAnimeList URL of the character */ 17 | url: string 18 | /** Images of the character */ 19 | images: ICommonPicture & { 20 | /** Images of the character in the format webp */ 21 | webp: ISimpleImageResponse 22 | } 23 | /** Name of the character */ 24 | name: string 25 | /** Name of the character in Kanji */ 26 | name_kanji: string 27 | /** Nicknames of the character */ 28 | nicknames: string[] 29 | /** Favorites count of the character */ 30 | favorites: number 31 | /** About (description) of the character */ 32 | about: string | null 33 | } 34 | 35 | export interface ICharacterSearchConfig extends ICommonConfig { 36 | /** Search term */ 37 | q?: string 38 | /** Number of results that should be limited per page */ 39 | limit?: number 40 | /** Get entries by order of a field */ 41 | order_by?: 'mal_id' | 'name' | 'favorites' 42 | /** Search query sort direction */ 43 | sort?: Sorting 44 | /** Return entries starting with the given letter */ 45 | letter?: string 46 | } 47 | 48 | export type CharacterSource = { 49 | [key in T]: { 50 | /** MAL ID of the source */ 51 | mal_id: number 52 | /** MAL URL of the source */ 53 | url: string 54 | /** Images of the source */ 55 | images: IPicture 56 | /** Title of the source */ 57 | title: string 58 | } 59 | } & { 60 | /** Role of the character in the source */ 61 | role: string 62 | } 63 | -------------------------------------------------------------------------------- /src/types/clubs.ts: -------------------------------------------------------------------------------- 1 | import { IExtendedResource, ICommonConfig, ICommonPicture } from '.' 2 | import { ClubAccess, ClubCategories, Sorting } from '../constants' 3 | 4 | export interface IClub { 5 | /** MyAnimeList ID of the club */ 6 | mal_id: number 7 | /**MyAnimeList URL of the club */ 8 | url: string 9 | /** Images of the club */ 10 | images: ICommonPicture 11 | /** Name of the club */ 12 | name: string 13 | /** Members count of the club */ 14 | members: number 15 | /** Catrgory of the club */ 16 | category: string 17 | /** Date which the club was created */ 18 | created: string 19 | /** Access type of the club */ 20 | access: ClubAccess 21 | } 22 | 23 | export interface IClubMember extends IClubStaff { 24 | /** Images of the member */ 25 | images: ICommonPicture & { 26 | webp: { 27 | /** Image URL of the member in the format webp */ 28 | image_url: string 29 | } 30 | } 31 | } 32 | 33 | export interface IClubStaff { 34 | /** Username of the user */ 35 | username: string 36 | /** MAL URL of the user */ 37 | url: string 38 | } 39 | 40 | export interface IClubRelations { 41 | /** List of anime relations for the club */ 42 | anime: IExtendedResource[] 43 | /** List of manga relations for the club */ 44 | manga: IExtendedResource[] 45 | /** List of character relations for the club */ 46 | characters: IExtendedResource[] 47 | } 48 | 49 | export interface IClubSearchConfig extends ICommonConfig { 50 | /** Number of results that should be limited per page */ 51 | limit?: number 52 | /** Search term */ 53 | q?: string 54 | /** Access type of the club */ 55 | type?: ClubAccess 56 | /** Get entries by order of a field */ 57 | order_by?: 'mal_id' | 'name' | 'members_count' | 'created' 58 | /** Search query sort direction */ 59 | sort?: Sorting 60 | /** Return entries starting with the given letter */ 61 | letter?: string 62 | /** Filter the entries by a category */ 63 | cattegories?: ClubCategories 64 | } 65 | -------------------------------------------------------------------------------- /src/types/genres.ts: -------------------------------------------------------------------------------- 1 | import { GenresFilter } from '../constants' 2 | 3 | export interface IGenreConfig { 4 | /** Filters the entries of the genres */ 5 | filter?: GenresFilter 6 | } 7 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | import { Sorting, Forums } from '../constants' 2 | 3 | export interface IJikanError { 4 | status: 400 | 404 | 405 | 429 | 500 5 | type: string 6 | message?: string 7 | error: string | null 8 | report_url?: string 9 | messages?: { [key in string]: string[] } 10 | } 11 | 12 | export type TMethods = 13 | | 'anime' 14 | | 'characters' 15 | | 'clubs' 16 | | 'genres' 17 | | 'magazines' 18 | | 'manga' 19 | | 'people' 20 | | 'producers' 21 | | 'random' 22 | | 'recommendations' 23 | | 'reviews' 24 | | 'schedules' 25 | | 'users' 26 | | 'seasons' 27 | | 'top' 28 | | 'watch' 29 | 30 | export interface IExtendedImageResponse extends IImageResponse { 31 | /** Image url in maximum size */ 32 | maximum_image_url: string | null 33 | } 34 | 35 | export interface IImageResponse extends ISimpleImageResponse { 36 | /** Image url in large size */ 37 | large_image_url: string | null 38 | } 39 | 40 | export interface ISimpleImageResponse { 41 | /** Image url in normal size */ 42 | image_url: string | null 43 | /** Image url in small size */ 44 | small_image_url: string | null 45 | } 46 | 47 | export interface IExtendedResource extends IResource { 48 | /** MAL ID of the resource */ 49 | mal_id: number 50 | /** Type of the resource */ 51 | type: string 52 | } 53 | 54 | export interface IUser { 55 | /** Username of the user */ 56 | username: string 57 | /** MAL URL of the user */ 58 | url: string 59 | /** Images of the user */ 60 | images: ICommonPicture & { 61 | /** Image of the user in the format webp */ 62 | webp: { 63 | /** Image URL of the user in the format webp */ 64 | image_url: string | null 65 | } 66 | } 67 | } 68 | 69 | export interface ITitle { 70 | /** Type of the title */ 71 | type: string 72 | /** Title of the source for the type given */ 73 | title: string 74 | } 75 | 76 | export interface IResource { 77 | /** MAL URL to the resource */ 78 | url: string 79 | /** Name of the resource */ 80 | name: string 81 | } 82 | 83 | export interface ISearchConfig extends ICommonConfig { 84 | /** Filter out Adult entries */ 85 | sfw?: boolean 86 | /** When its value is true, it will include the unapproved entries */ 87 | unapproved?: boolean 88 | /** Number of results that should be limited per page */ 89 | limit?: number 90 | /** Search term */ 91 | q?: string 92 | /** Filters out the results that doesn't match the score (exact) */ 93 | score?: number 94 | /** Sets the minimum score of the results */ 95 | min_score?: number 96 | /** Sets the maximum score of the results */ 97 | max_score?: number 98 | /** Filter by genre(s) IDs */ 99 | genres?: number[] 100 | /** Exclude genre(s) by IDs */ 101 | genres_exclude?: number[] 102 | /** Search query sort direction */ 103 | sort?: Sorting 104 | /** Return entries starting with the given letter */ 105 | letter?: string 106 | /** Filter by starting date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ 107 | start_date?: string 108 | /** Filter by ending date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ 109 | end_date?: string 110 | } 111 | 112 | export interface IResponse { 113 | /** MAL ID of the source */ 114 | mal_id: number 115 | /** MAL URL of the source */ 116 | url: string 117 | /** Image URLs of the source */ 118 | images: IPicture 119 | /** Whether the source has aprroved entry or not */ 120 | approved: boolean 121 | /** Data of titles (in different languages) for the source */ 122 | titles: ITitle[] 123 | /** Title of the source */ 124 | title: string 125 | /** Title of the source in English */ 126 | title_english: string 127 | /** Title of the source in Japanese */ 128 | title_japanese: string 129 | /** Synonyms of the title */ 130 | title_synonyms: string[] 131 | /** Status of the source */ 132 | status: string 133 | /** Score of the source (out of 10)*/ 134 | score: number 135 | /** Number of people that scored the source */ 136 | scored_by: number 137 | /** Rank of the source */ 138 | rank: number 139 | /** Popularity rank of the source */ 140 | populartiy: number 141 | /** Members count of the source */ 142 | members: number 143 | /** Favorites count of the source */ 144 | favortites: number 145 | /** Synopsis of the source */ 146 | synopsis: string | null 147 | /** Background of the source */ 148 | background: string | null 149 | /** Genres of the source */ 150 | genres: IExtendedResource[] 151 | /** Explicit genres of the source */ 152 | explicit_genres: IExtendedResource[] 153 | /** Themes of the source */ 154 | themes: IExtendedResource[] 155 | /** Demographics of the source */ 156 | demographics: IExtendedResource[] 157 | } 158 | 159 | export interface IRelation { 160 | /** Relation of the source */ 161 | relation: string 162 | /** Entries of the relation */ 163 | entry: IExtendedResource[] 164 | } 165 | 166 | export interface ITimeResponse { 167 | /** Starting date of the source*/ 168 | from: string | null 169 | /** Ending date of the source */ 170 | to: string | null 171 | /** Objects of days, month & year for the starting & ending dates of the source */ 172 | prop: { 173 | /** Objects of day, month & year the source started */ 174 | from: IDate 175 | /** Objects of day, month & year the source started */ 176 | to: IDate 177 | } 178 | /** Human readable string of the starting & finishing dates */ 179 | string: string | null 180 | } 181 | 182 | export interface IDate { 183 | /** The day it happened */ 184 | day: number | null 185 | /** The month it happened */ 186 | month: number | null 187 | /** The year it happened */ 188 | year: number | null 189 | } 190 | 191 | export interface ICharacterFromSource { 192 | /** Data of the character */ 193 | character: { 194 | /** MAL ID of the character */ 195 | mal_id: number 196 | /** MAL URL to the character */ 197 | url: string 198 | /** Images of the character in the formats jpg & webp */ 199 | images: ICommonPicture & { 200 | /** Images of the character in the format webp */ 201 | webp: ISimpleImageResponse 202 | } 203 | /** Name of the character */ 204 | name: string 205 | } 206 | /** Role of the character in the source */ 207 | role: string 208 | } 209 | 210 | export interface ICommonPicture { 211 | /** Image of the target in the format jpg */ 212 | jpg: { 213 | /** Image URL of the target in the format jpg */ 214 | image_url: string | null 215 | } 216 | } 217 | 218 | export interface IForumConfig { 219 | filter?: Forums 220 | } 221 | 222 | export interface IForum { 223 | /** MAL ID of the forum */ 224 | mal_id: number 225 | /** MAL URL to the forum */ 226 | url: string 227 | /** Title of the forum */ 228 | title: string 229 | /** The date which the forum was posted */ 230 | date: string 231 | /** Username of the forum creator */ 232 | author_username: string 233 | /** Forum creator user's URL */ 234 | author_url: string 235 | /** Number of comments for the forum */ 236 | comments: number 237 | /** Last comment of the forum */ 238 | last_comment: { 239 | /** URL to the latest comment of the forum */ 240 | url: string 241 | /** Name of the user */ 242 | author_username: string 243 | /** URL of the user */ 244 | author_url: string 245 | /** The date which the user commented */ 246 | date: string 247 | } 248 | } 249 | 250 | export interface IReviewConfig extends ICommonConfig { 251 | /** Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. */ 252 | preliminary?: boolean 253 | /** Any reviews that are tagged as a spoiler. */ 254 | spoiler?: boolean 255 | } 256 | 257 | export interface IUserUpdate { 258 | /** Data of the user */ 259 | user: IUser 260 | /** Score given by the user */ 261 | score: number | null 262 | /** Status for the user in the source*/ 263 | status: string | null 264 | /** Date which the update was done */ 265 | date: string 266 | } 267 | 268 | export interface IRecommendation { 269 | /** Data of the recommended source */ 270 | entry: { 271 | /** MAL ID of the source */ 272 | mal_id: number 273 | /** MAL URL of the source */ 274 | url: string 275 | /** Images of the source in the formats webp & jpg */ 276 | images: IPicture 277 | /** Title of the source */ 278 | title: string 279 | } 280 | /** URL of the recommendation */ 281 | url: string 282 | /** Votes of the recommendated entry */ 283 | votes: number 284 | } 285 | 286 | export interface IReview { 287 | /** MAL ID of the review */ 288 | mal_id: number 289 | /** URL of the review */ 290 | url: string 291 | /** Type of the review */ 292 | type: 'anime' | 'manga' 293 | /** Reactions of the review */ 294 | reactions: { 295 | /** Total number of users that reacted the review */ 296 | overall: number 297 | /** Number of users who reacted the review as nice */ 298 | nice: number 299 | /** Number of users who loved the review */ 300 | love_it: number 301 | /** Number of users who found the review funny */ 302 | funny: number 303 | /** Number of users who found the review confusing */ 304 | confusing: number 305 | /** Number of users who found the review informative */ 306 | informative: number 307 | /** Number of users who found the review as well written */ 308 | well_written: number 309 | /** Number of users who found the review creative */ 310 | creative: number 311 | } 312 | /** Date which the review was posted */ 313 | date: string 314 | /** Message of the review */ 315 | review: string 316 | /** Score given by the reviewer */ 317 | score: number 318 | /** Tags of the review */ 319 | tags: string[] 320 | /** Whether it is a spoiler review or not */ 321 | is_spoiler: boolean 322 | /** Whether it is a preliminary review or not */ 323 | is_preliminary: boolean 324 | /** Data of the reviewer */ 325 | user: IUser 326 | } 327 | 328 | export interface ICommonConfig { 329 | /** Page of the results to go */ 330 | page?: number 331 | } 332 | 333 | export interface IPicture { 334 | /** Images of the source in jpg format */ 335 | jpg: IImageResponse 336 | /** Images of the source in webp format */ 337 | webp: IImageResponse 338 | } 339 | 340 | export interface IScore { 341 | /** Ratable score of the source */ 342 | score: number 343 | /** Votes of the score given */ 344 | votes: number 345 | /** Percentage to the total number of votes from all the total ratable scores */ 346 | percentage: number 347 | } 348 | 349 | export interface IMoreInfo { 350 | /** Just some additional info of the source */ 351 | moreinfo: string | null 352 | } 353 | 354 | export interface ICommonResource extends IResource { 355 | /** MyAnimeList ID of the topic */ 356 | mal_id: number 357 | /** Total count of the sources for the topic */ 358 | count: number 359 | } 360 | 361 | export interface INewsResponse { 362 | /** MAL ID of the news article */ 363 | mal_id: number 364 | /** MAL URL of the news article */ 365 | url: string 366 | /** Title of the news article */ 367 | title: string 368 | /** Date of the article uploaded */ 369 | date: string 370 | /** Username of the news article's author */ 371 | author_username: string 372 | /** URL of the news article's author */ 373 | author_url: string 374 | /** Images of the news article */ 375 | images: ICommonPicture 376 | /** Forum URL of the news article */ 377 | forum_url: string 378 | /** Number of comments in the news article */ 379 | comments: number 380 | /** Just a short content of the news article */ 381 | excerpt: string 382 | } 383 | 384 | export * from './pagination' 385 | export * from './anime' 386 | export * from './characters' 387 | export * from './clubs' 388 | export * from './genres' 389 | export * from './magazines' 390 | export * from './manga' 391 | export * from './people' 392 | export * from './schedules' 393 | export * from './producers' 394 | export * from './recommendations' 395 | export * from './seasons' 396 | export * from './users' 397 | export * from './watch' 398 | export * from './top' 399 | -------------------------------------------------------------------------------- /src/types/magazines.ts: -------------------------------------------------------------------------------- 1 | import { ICommonConfig } from '.' 2 | import { Sorting } from '../constants' 3 | 4 | export interface IMagazineConfig extends ICommonConfig { 5 | /** Number of results that should be limited per page */ 6 | limit?: number 7 | /** Search term */ 8 | q?: string 9 | /** Get entries by order of a field */ 10 | order_by?: 'mal_id' | 'name' | 'count' 11 | /** Search query sort direction */ 12 | sort?: Sorting 13 | /** Return entries starting with the given letter */ 14 | letter?: string 15 | } 16 | -------------------------------------------------------------------------------- /src/types/manga.ts: -------------------------------------------------------------------------------- 1 | import { 2 | IExtendedResource, 3 | IRelation, 4 | IResponse, 5 | ITimeResponse, 6 | IResource, 7 | IScore, 8 | IReview, 9 | IUserUpdate, 10 | ISearchConfig 11 | } from '.' 12 | import { MangaStatus, MangaTypes } from '../constants' 13 | 14 | export interface IMangaStatistics { 15 | /** Count of users who have been reading the manga */ 16 | reading: number 17 | /** Count of users who have completed reading the manga */ 18 | completed: number 19 | /** Count of users who have put the manga on hold */ 20 | on_hold: number 21 | /** Count of users who have dropped the manga */ 22 | dropped: number 23 | /** Count of users who have plans to read the manga */ 24 | plan_to_read: number 25 | /** Total number of users who have set their status on the manga */ 26 | total: number 27 | /** Scores of the manga given by the users */ 28 | scores: IScore[] 29 | } 30 | 31 | export interface IMangaReview extends IReview { 32 | /** Number of chapters read by the reviewer */ 33 | chapters_read: number | null 34 | } 35 | 36 | export interface IMangaUserUpdate extends IUserUpdate { 37 | /** Number of volumes read by the user */ 38 | volumes_read: number | null 39 | /** Total volumes of the manga to read */ 40 | volumes_total: number | null 41 | /** Number of chapters read by the user */ 42 | chapters_read: number | null 43 | /** Total chapters of the manga to read */ 44 | chapters_total: number | null 45 | } 46 | 47 | export interface IMangaFull extends IManga { 48 | /** Relations of the manga */ 49 | relations: IRelation[] 50 | /** External sites of the manga */ 51 | external: IResource[] 52 | } 53 | 54 | export interface IManga extends IResponse { 55 | /** Type of the manga */ 56 | type: keyof typeof MangaTypes 57 | /** Chapters count of the manga */ 58 | chapters: number | null 59 | /** Volumes count of the manga */ 60 | volumes: number | null 61 | /** Whether the manga is publishing or not */ 62 | publishing: boolean 63 | /** Data of dates the manga published */ 64 | published: ITimeResponse 65 | /** Authors of the manga */ 66 | authors: IExtendedResource[] 67 | /** Serializations of the manga */ 68 | serializations: IExtendedResource[] 69 | } 70 | 71 | export interface IMangaSearchConfig extends ISearchConfig { 72 | /** Type of the manga */ 73 | type?: MangaTypes 74 | /** Status of the manga */ 75 | status?: MangaStatus 76 | /** Get entries by order of a field */ 77 | order_by?: 78 | | 'mal_id' 79 | | 'title' 80 | | 'start_date' 81 | | 'end_date' 82 | | 'chapters' 83 | | 'volumes' 84 | | 'score' 85 | | 'scored_by' 86 | | 'rank' 87 | | 'popularity' 88 | | 'members' 89 | | 'favorites' 90 | /** Filter by magazine(s) IDs */ 91 | magazines?: number[] 92 | } 93 | -------------------------------------------------------------------------------- /src/types/pagination.ts: -------------------------------------------------------------------------------- 1 | export interface IPagination { 2 | /** Last visible page of the data */ 3 | last_visible_page: number 4 | /** This value will be true if a next page exists for the data & vice versa */ 5 | has_next_page: boolean 6 | } 7 | 8 | export interface IExtendedPagination extends IPagination { 9 | /** Current page of the data */ 10 | current_page: number 11 | /** Data of the pagination */ 12 | items: IItems 13 | } 14 | 15 | export interface IItems { 16 | /** Number of results shown in the data */ 17 | count: number 18 | /** Total number of all the results */ 19 | total: number 20 | /** Number of data per page */ 21 | per_page: number 22 | } 23 | -------------------------------------------------------------------------------- /src/types/people.ts: -------------------------------------------------------------------------------- 1 | import { ICharacterFromSource, ICommonConfig, ICommonPicture } from '.' 2 | import { CharacterSource } from './characters' 3 | import { Sorting } from '../constants' 4 | 5 | export interface IPersonFull extends IPerson { 6 | /** List of anime contributed by the person */ 7 | anime: PersonSource<'anime'>[] 8 | /** List of manga contributed by the person */ 9 | manga: PersonSource<'manga'>[] 10 | /** List of voices featured by the person */ 11 | voices: IPersonVoice[] 12 | } 13 | 14 | export interface IPerson { 15 | /** MAL ID of the person */ 16 | mal_id: number 17 | /** MAL URL of the person */ 18 | url: string 19 | /** Website URL of the person */ 20 | website_url: string | null 21 | /** Images of the person */ 22 | images: ICommonPicture 23 | /** Name of the person */ 24 | name: string 25 | /** Given name of the person */ 26 | given_name: string 27 | /** Alternate names of the person */ 28 | alternate_names: string[] 29 | /** Birthday of the character in string */ 30 | birthday: string 31 | /** Favorites count of the person */ 32 | favorites: number 33 | /** About (description) of the person */ 34 | about: string 35 | } 36 | 37 | export interface IPersonVoice extends CharacterSource<'anime'> { 38 | /** Data of the character */ 39 | character: ICharacterFromSource 40 | } 41 | 42 | export interface IPersonSearchConfig extends ICommonConfig { 43 | /** Search term */ 44 | q?: string 45 | /** Number of results that should be limited per page */ 46 | limit?: number 47 | /** Get entries by order of a field */ 48 | order_by?: 'mal_id' | 'name' | 'favorites' | 'birthday' 49 | /** Search query sort direction */ 50 | sort?: Sorting 51 | /** Return entries starting with the given letter */ 52 | letter?: string 53 | } 54 | 55 | export type PersonSource = Omit, 'role'> & { 56 | /** Position of the person in the source */ 57 | position: string 58 | } 59 | -------------------------------------------------------------------------------- /src/types/producers.ts: -------------------------------------------------------------------------------- 1 | import { ICommonConfig, ICommonPicture, IResource, ITitle } from '.' 2 | import { Sorting } from '../constants' 3 | 4 | export interface IProducerFull extends IProducer { 5 | /** External sites of the producer */ 6 | external: IResource[] 7 | } 8 | 9 | export interface IProducer { 10 | /** MAL ID of the producer */ 11 | mal_id: number 12 | /** MAL URL of the producer */ 13 | url: string 14 | /** Titles of the producer */ 15 | titles: ITitle[] 16 | /** Images of the producer */ 17 | images: ICommonPicture 18 | /** Favortites count of the producer in MAL */ 19 | favortites: number 20 | /** Count of works done by the producer */ 21 | count: number 22 | /** Date in string which the producer was established */ 23 | established: string 24 | /** About (info) of the producer */ 25 | about: string 26 | } 27 | 28 | export interface IProducerSearchConfig extends ICommonConfig { 29 | /** Search term */ 30 | q?: string 31 | /** Number of results that should be limited per page */ 32 | limit?: number 33 | /** Return entries starting with the given letter */ 34 | letter?: string 35 | /** Search direction */ 36 | sort?: Sorting 37 | /** Return entries by order of a field */ 38 | order_by?: 'mal_id' | 'count' | 'favorites' | 'established' 39 | } 40 | -------------------------------------------------------------------------------- /src/types/recommendations.ts: -------------------------------------------------------------------------------- 1 | import { IClubStaff, IRecommendation } from '.' 2 | 3 | export interface IRandomRecommendation { 4 | /** MAL IDs of the compared sources for the recommendation separated by a "-" */ 5 | mal_id: string 6 | /** Entries of the recommendations */ 7 | entry: IRecommendation['entry'][] 8 | /** Content of the recommendation post */ 9 | content: string 10 | /** Date which the recommendation post was created */ 11 | date: string 12 | /** Data of user who created the recommendation */ 13 | user: IClubStaff 14 | } 15 | -------------------------------------------------------------------------------- /src/types/schedules.ts: -------------------------------------------------------------------------------- 1 | import { ICommonConfig } from '.' 2 | import { Days } from '../constants' 3 | 4 | export interface IScheduleConfig extends ICommonConfig { 5 | /** Filter the entries by day */ 6 | filter?: Days 7 | /** When the value is true, it will return only Kid entries */ 8 | kids?: boolean 9 | /** Filter out Adult entries */ 10 | sfw?: boolean 11 | /** When its value is true, it will include the unapproved entries */ 12 | unapproved?: boolean 13 | /** Limit of the entries per page */ 14 | limit?: number 15 | } 16 | -------------------------------------------------------------------------------- /src/types/seasons.ts: -------------------------------------------------------------------------------- 1 | import { IAnime, ICommonConfig, IExtendedPagination } from '.' 2 | import { AnimeSeasons, AnimeTypes } from '../constants' 3 | 4 | export interface ISeasonResponse { 5 | /** Data of the anime */ 6 | data: IAnime[] 7 | /** Pagination of the results */ 8 | pagination: IExtendedPagination 9 | } 10 | 11 | export interface ISeasonConfig extends ICommonConfig { 12 | /** Filter by anime type */ 13 | filter?: AnimeTypes 14 | /** Filter out Adult entries */ 15 | sfw?: boolean 16 | /** When its value is true, it will include the unapproved entries */ 17 | unapproved?: boolean 18 | /** Number of results that should be limited per page */ 19 | limit?: number 20 | } 21 | 22 | export interface ISeasonList { 23 | /** Year of the list */ 24 | year: number 25 | /** Available seasons of the list */ 26 | seasons: AnimeSeasons[] 27 | } 28 | -------------------------------------------------------------------------------- /src/types/top.ts: -------------------------------------------------------------------------------- 1 | import { ICommonConfig, IReviewConfig } from '.' 2 | import { AnimeFilters, AnimeTypes, MangaFilters, MangaTypes, Ratings } from '../constants' 3 | 4 | export interface ITopAnimeConfig extends ITopCommonConfig { 5 | /** Filter the entries by an anime type */ 6 | type?: AnimeTypes 7 | /** Filter the top list */ 8 | filter?: AnimeFilters 9 | /** Filter entries by the ratings */ 10 | rating?: Ratings 11 | /** Filter out adult entries */ 12 | sfw?: boolean 13 | } 14 | 15 | export interface ITopMangaConfig extends ITopCommonConfig { 16 | /** Filter the entries by a manga type */ 17 | type?: MangaTypes 18 | /** Filter the top list */ 19 | filter?: MangaFilters 20 | } 21 | 22 | export interface ITopCommonConfig extends ICommonConfig { 23 | /** Number of results that should be limited per page */ 24 | limit?: number 25 | } 26 | 27 | export interface ITopReviewConfig extends IReviewConfig { 28 | /** Filter the reviews by type */ 29 | type: 'anime' | 'manga' 30 | } 31 | -------------------------------------------------------------------------------- /src/types/users.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ICommonPicture, 3 | IPicture, 4 | IResource, 5 | IUser, 6 | IRecommendation, 7 | IAnimeUserUpdate, 8 | IMangaUserUpdate, 9 | IExtendedResource, 10 | IReview, 11 | ICommonConfig 12 | } from '.' 13 | import { AnimeTypes, Genders, MangaTypes } from '../constants' 14 | 15 | export interface IUserFavorites { 16 | /** List of favorites of the user for anime */ 17 | anime: (IUserSource & { 18 | /** Type of the anime */ 19 | type: AnimeTypes 20 | })[] 21 | /** List of favorites of the user for anime */ 22 | manga: (IUserSource & { 23 | /** Type of the manga */ 24 | type: MangaTypes 25 | })[] 26 | /** List of favorites of the user for characters */ 27 | characters: ISourceForUser[] 28 | /** List of favorites of the user for people */ 29 | people: ISourceForUser[] 30 | } 31 | 32 | export interface IUserFull extends IUserProfile { 33 | /** Statistics of user for anime & manga */ 34 | statistics: { 35 | /** Statistics of anime for the user */ 36 | anime: IUserStatistics & { 37 | /** Number of days watched by the user for anime */ 38 | days_watched: number 39 | /** Count of anime the user is currently watching */ 40 | watching: number 41 | /** Count of anime the user is planning to watch */ 42 | plan_to_watch: number 43 | /** Count of anime rewatched by the user */ 44 | rewatched: number 45 | /** Count of total anime episodes watched by the user */ 46 | episodes_watched: number 47 | } 48 | /** Statistics of manga for the user */ 49 | manga: IUserStatistics & { 50 | /** Number of days read by the user for manga */ 51 | days_read: number 52 | /** Count of manga reading by the user */ 53 | reading: number 54 | /** Count of manga the user is planning to read */ 55 | plan_to_read: number 56 | /** Count of manga reread by the user */ 57 | reread: number 58 | /** Count of manga chapters read by the user */ 59 | chapters_read: number 60 | /** Count of manga volumes read by the user */ 61 | volumes_read: number 62 | } 63 | } 64 | /** External sites of the user */ 65 | external: IResource[] 66 | } 67 | 68 | export interface IUserProfile extends IUserBaseRes { 69 | /** Gender of the user */ 70 | gender: Genders | null 71 | /** Birthday of the user */ 72 | birthday: string 73 | /** Location of the user */ 74 | location: string 75 | /** Date & time in string which the user joined MAL */ 76 | joined: string 77 | } 78 | 79 | export interface IUserBaseRes extends IUser { 80 | /** Date & time in string which the user was last online in MAL */ 81 | last_online: string 82 | } 83 | 84 | export interface IUserStatistics { 85 | /** Mean score of the user for a source */ 86 | mean_score: number 87 | /** Count of completed sources by the user */ 88 | completed: number 89 | /** Count of sources put by the user on hold */ 90 | on_hold: number 91 | /** Count of dropped sources by the user */ 92 | dropped: number 93 | /** Total count of the sources which the user put a status */ 94 | total_entries: number 95 | } 96 | 97 | export interface IUserById extends Omit {} 98 | 99 | export interface IUserUpdatesResponse { 100 | /** Anime updates of the user */ 101 | anime: IAnimeUserUpdates[] 102 | /** Manga updates of the user */ 103 | manga: IMangaUserUpdates[] 104 | } 105 | 106 | export interface IAnimeUserUpdates extends Omit { 107 | /** Entry (data) of the anime */ 108 | entry: IRecommendation['entry'] 109 | } 110 | 111 | export interface IMangaUserUpdates extends Omit { 112 | /** Entry (data) of the manga */ 113 | entry: IRecommendation['entry'] 114 | } 115 | 116 | export interface IUserAbout { 117 | /** About (info) of the user */ 118 | about: string 119 | } 120 | 121 | export interface IUserFriend { 122 | /** Data of the friend */ 123 | user: IUser 124 | /** Date & the time which the friend was online */ 125 | last_online: string 126 | /** Date & time in string which the friend were friends with the user */ 127 | friends_since: string 128 | } 129 | 130 | export interface IUserHistory { 131 | /** Entry (data) of the source */ 132 | entry: IExtendedResource 133 | /** Increment of the source from the user */ 134 | increment: number 135 | /** Date & time which the user accessed the source */ 136 | date: string 137 | } 138 | 139 | export interface IUserSource { 140 | /** Title of the source */ 141 | title: string 142 | /** MAL ID of the source */ 143 | mal_id: number 144 | /** MAL URL of the source */ 145 | url: string 146 | /** Images of the source */ 147 | images: IPicture 148 | /** Starting year of the source */ 149 | start_year: number 150 | } 151 | 152 | export interface IUserReview extends IReview { 153 | /** Count of episodes watched by the user 154 | * @description This value will be undefined if the type of review is not anime 155 | */ 156 | episodes_watched?: number | null 157 | /** Count of chapters read by the user 158 | * @description This value will be undefined if the type of review is not manga 159 | */ 160 | chapters_read?: number | null 161 | /** Entry of the source */ 162 | entry: Omit 163 | } 164 | 165 | export interface ISourceForUser extends IResource { 166 | /** MAL ID of the source */ 167 | mal_id: number 168 | /** Images of the source */ 169 | images: ICommonPicture 170 | } 171 | 172 | export interface IUserClub extends IResource { 173 | /** MAL ID of the club */ 174 | mal_id: number 175 | } 176 | 177 | export interface IUserHistoryConfig { 178 | /** Filter the entries by type of the review */ 179 | type?: 'anime' | 'manga' 180 | } 181 | 182 | export interface IUserSearchConfig extends ICommonConfig { 183 | /** Number of results that should be limited per page */ 184 | limit?: number 185 | /** Search term */ 186 | q?: string 187 | /** Filter entries by gender */ 188 | gender?: Genders 189 | /** Filter entries by loacation */ 190 | location?: string 191 | /** Filter entries by maximum age */ 192 | maxAge?: number 193 | /** Filter entries by minimum age */ 194 | minAge?: number 195 | } 196 | -------------------------------------------------------------------------------- /src/types/watch.ts: -------------------------------------------------------------------------------- 1 | import { IRecommendation, IYouTube } from '.' 2 | 3 | export interface IWatchEpisode extends ICommonWatchResponse { 4 | /** Episodes of the anime */ 5 | episodes: IWatchEpisodeResponse[] 6 | } 7 | 8 | export interface IWatchPromo extends ICommonWatchResponse { 9 | /** Title of the promo */ 10 | title: string 11 | /** Data of the promo video in YouTube */ 12 | trailer: IYouTube 13 | } 14 | 15 | export interface IWatchEpisodeResponse { 16 | /** MAL ID of the episode */ 17 | mal_id: number 18 | /** MAL URL of the episode */ 19 | url: string 20 | /** Title of the episode. e.g `Episode 12` */ 21 | title: string 22 | /** The value will be if premiumship is required to watch the episode */ 23 | premium: boolean 24 | } 25 | 26 | export interface ICommonWatchResponse { 27 | /** Entry (data) of the anime */ 28 | entry: IRecommendation['entry'] 29 | /** Whether the source is locked in the region or not */ 30 | region_locked: boolean 31 | } 32 | -------------------------------------------------------------------------------- /src/utils/Error.ts: -------------------------------------------------------------------------------- 1 | import { IJikanError } from '../' 2 | 3 | export class MarikaError extends Error implements IJikanError { 4 | constructor( 5 | public status: 400 | 404 | 405 | 429 | 500, 6 | public type: string, 7 | public error: string | null, 8 | public jikanMessage?: IJikanError['message'] | IJikanError['messages'], 9 | public report_url?: string 10 | ) { 11 | super('') 12 | this.#assignErrorMessage() 13 | } 14 | 15 | #assignErrorMessage = () => { 16 | const message = 17 | typeof this.jikanMessage === 'string' 18 | ? this.jikanMessage 19 | : this.jikanMessage !== undefined 20 | ? this.jikanMessage[Object.keys(this.jikanMessage)[0]][0] 21 | : '' 22 | this.message = `An error occurred while making the request (Status: ${this.status} - ${this.type}). Message: ${message}` 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/utils/Fetch.ts: -------------------------------------------------------------------------------- 1 | import Axios, { AxiosInstance, AxiosResponse } from 'axios' 2 | import { setupCache, CacheOptions, AxiosCacheInstance } from 'axios-cache-interceptor' 3 | import { MarikaError } from './Error' 4 | import { IJikanError } from '../types' 5 | 6 | export class Fetch { 7 | #axios: AxiosCacheInstance | AxiosInstance 8 | constructor(cacheOptions?: CacheOptions) { 9 | this.#axios = cacheOptions 10 | ? (Axios as unknown as AxiosCacheInstance).defaults.cache 11 | ? (Axios as unknown as AxiosCacheInstance) 12 | : setupCache(Axios, cacheOptions) 13 | : Axios 14 | } 15 | public get = async (url: string): Promise => { 16 | const throwError = (error: Error & { response: AxiosResponse }) => { 17 | throw new MarikaError( 18 | error.response.status as 400, 19 | error.response.data.type, 20 | error.response.data.error, 21 | error.response.data.message || error.response.data.messages 22 | ) 23 | } 24 | return await this.#axios 25 | .get(url) 26 | .then((res) => { 27 | if (res.status !== 200 || (res.data as unknown as IJikanError).error !== undefined) throw new Error('') 28 | return res.data 29 | }) 30 | .catch((err: Error & { response: AxiosResponse }) => throwError(err)) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/utils/Utils.ts: -------------------------------------------------------------------------------- 1 | import { API_URL } from '../constants' 2 | import { TMethods } from '../' 3 | 4 | export const getQueryString = (data: { 5 | [key in T]?: string | number[] | number | boolean 6 | }): string => { 7 | const result = {} as Record 8 | for (const key of Object.keys(data)) { 9 | const value = data[key as T] 10 | if (value) { 11 | if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') 12 | result[key] = 13 | typeof value === 'number' ? value.toString() : typeof value === 'boolean' ? `${value}` : value 14 | else result[key] = value.join(',') 15 | } 16 | } 17 | if (!Object.keys(result).length) return '' 18 | const query = new URLSearchParams(result) 19 | return `?${query.toString()}` 20 | } 21 | 22 | export const getURL = (method: TMethods, ...routes: string[]): string => 23 | API_URL.concat(`/${method}`, ...routes.map((route) => `/${route}`)) 24 | 25 | export const getTypeErrorMessage = (parameter: string, expectedType: string, got: string) => 26 | `Expected type ${expectedType} for the parameter '${parameter}', but received type ${got}.` 27 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Fetch' 2 | export * from './Utils' 3 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6", 4 | "module": "CommonJS", 5 | "lib": ["ESNext", "DOM"], 6 | 7 | "outDir": "dist/", 8 | "declaration": true, 9 | 10 | "strict": true, 11 | "noImplicitAny": false, 12 | 13 | "types": ["mocha", "node"], 14 | "esModuleInterop": true 15 | }, 16 | "include": ["src/**/*"] 17 | } 18 | -------------------------------------------------------------------------------- /typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": ["./src/index.ts"], 3 | "excludePrivate": true, 4 | "excludeProtected": true, 5 | "excludeExternals": true, 6 | "includeVersion": false, 7 | "entryPointStrategy": "expand" 8 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@aashutoshrathi/word-wrap@^1.2.3": 6 | version "1.2.6" 7 | resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" 8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== 9 | 10 | "@cspotcode/source-map-support@^0.8.0": 11 | version "0.8.1" 12 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 13 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 14 | dependencies: 15 | "@jridgewell/trace-mapping" "0.3.9" 16 | 17 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 18 | version "4.4.0" 19 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 20 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 21 | dependencies: 22 | eslint-visitor-keys "^3.3.0" 23 | 24 | "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": 25 | version "4.8.1" 26 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" 27 | integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== 28 | 29 | "@eslint/eslintrc@^2.1.2": 30 | version "2.1.2" 31 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" 32 | integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== 33 | dependencies: 34 | ajv "^6.12.4" 35 | debug "^4.3.2" 36 | espree "^9.6.0" 37 | globals "^13.19.0" 38 | ignore "^5.2.0" 39 | import-fresh "^3.2.1" 40 | js-yaml "^4.1.0" 41 | minimatch "^3.1.2" 42 | strip-json-comments "^3.1.1" 43 | 44 | "@eslint/js@8.49.0": 45 | version "8.49.0" 46 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" 47 | integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== 48 | 49 | "@humanwhocodes/config-array@^0.11.11": 50 | version "0.11.11" 51 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" 52 | integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== 53 | dependencies: 54 | "@humanwhocodes/object-schema" "^1.2.1" 55 | debug "^4.1.1" 56 | minimatch "^3.0.5" 57 | 58 | "@humanwhocodes/module-importer@^1.0.1": 59 | version "1.0.1" 60 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 61 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 62 | 63 | "@humanwhocodes/object-schema@^1.2.1": 64 | version "1.2.1" 65 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 66 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 67 | 68 | "@jridgewell/resolve-uri@^3.0.3": 69 | version "3.1.1" 70 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 71 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 72 | 73 | "@jridgewell/sourcemap-codec@^1.4.10": 74 | version "1.4.15" 75 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 76 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 77 | 78 | "@jridgewell/trace-mapping@0.3.9": 79 | version "0.3.9" 80 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 81 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 82 | dependencies: 83 | "@jridgewell/resolve-uri" "^3.0.3" 84 | "@jridgewell/sourcemap-codec" "^1.4.10" 85 | 86 | "@nodelib/fs.scandir@2.1.5": 87 | version "2.1.5" 88 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 89 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 90 | dependencies: 91 | "@nodelib/fs.stat" "2.0.5" 92 | run-parallel "^1.1.9" 93 | 94 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 95 | version "2.0.5" 96 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 97 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 98 | 99 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 100 | version "1.2.8" 101 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 102 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 103 | dependencies: 104 | "@nodelib/fs.scandir" "2.1.5" 105 | fastq "^1.6.0" 106 | 107 | "@tsconfig/node10@^1.0.7": 108 | version "1.0.8" 109 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" 110 | integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== 111 | 112 | "@tsconfig/node12@^1.0.7": 113 | version "1.0.9" 114 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" 115 | integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== 116 | 117 | "@tsconfig/node14@^1.0.0": 118 | version "1.0.1" 119 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" 120 | integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== 121 | 122 | "@tsconfig/node16@^1.0.2": 123 | version "1.0.2" 124 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" 125 | integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== 126 | 127 | "@types/json-schema@^7.0.12": 128 | version "7.0.13" 129 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" 130 | integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== 131 | 132 | "@types/mocha@^10.0.1": 133 | version "10.0.1" 134 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" 135 | integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== 136 | 137 | "@types/node@^20.6.2": 138 | version "20.6.2" 139 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.2.tgz#a065925409f59657022e9063275cd0b9bd7e1b12" 140 | integrity sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw== 141 | 142 | "@types/semver@^7.5.0": 143 | version "7.5.2" 144 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" 145 | integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== 146 | 147 | "@typescript-eslint/eslint-plugin@^6.7.2": 148 | version "6.7.2" 149 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz#f18cc75c9cceac8080a9dc2e7d166008c5207b9f" 150 | integrity sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q== 151 | dependencies: 152 | "@eslint-community/regexpp" "^4.5.1" 153 | "@typescript-eslint/scope-manager" "6.7.2" 154 | "@typescript-eslint/type-utils" "6.7.2" 155 | "@typescript-eslint/utils" "6.7.2" 156 | "@typescript-eslint/visitor-keys" "6.7.2" 157 | debug "^4.3.4" 158 | graphemer "^1.4.0" 159 | ignore "^5.2.4" 160 | natural-compare "^1.4.0" 161 | semver "^7.5.4" 162 | ts-api-utils "^1.0.1" 163 | 164 | "@typescript-eslint/parser@^6.7.2": 165 | version "6.7.2" 166 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.7.2.tgz#e0ae93771441b9518e67d0660c79e3a105497af4" 167 | integrity sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw== 168 | dependencies: 169 | "@typescript-eslint/scope-manager" "6.7.2" 170 | "@typescript-eslint/types" "6.7.2" 171 | "@typescript-eslint/typescript-estree" "6.7.2" 172 | "@typescript-eslint/visitor-keys" "6.7.2" 173 | debug "^4.3.4" 174 | 175 | "@typescript-eslint/scope-manager@6.7.2": 176 | version "6.7.2" 177 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz#cf59a2095d2f894770c94be489648ad1c78dc689" 178 | integrity sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw== 179 | dependencies: 180 | "@typescript-eslint/types" "6.7.2" 181 | "@typescript-eslint/visitor-keys" "6.7.2" 182 | 183 | "@typescript-eslint/type-utils@6.7.2": 184 | version "6.7.2" 185 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz#ed921c9db87d72fa2939fee242d700561454f367" 186 | integrity sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ== 187 | dependencies: 188 | "@typescript-eslint/typescript-estree" "6.7.2" 189 | "@typescript-eslint/utils" "6.7.2" 190 | debug "^4.3.4" 191 | ts-api-utils "^1.0.1" 192 | 193 | "@typescript-eslint/types@6.7.2": 194 | version "6.7.2" 195 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.2.tgz#75a615a6dbeca09cafd102fe7f465da1d8a3c066" 196 | integrity sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg== 197 | 198 | "@typescript-eslint/typescript-estree@6.7.2": 199 | version "6.7.2" 200 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz#ce5883c23b581a5caf878af641e49dd0349238c7" 201 | integrity sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ== 202 | dependencies: 203 | "@typescript-eslint/types" "6.7.2" 204 | "@typescript-eslint/visitor-keys" "6.7.2" 205 | debug "^4.3.4" 206 | globby "^11.1.0" 207 | is-glob "^4.0.3" 208 | semver "^7.5.4" 209 | ts-api-utils "^1.0.1" 210 | 211 | "@typescript-eslint/utils@6.7.2": 212 | version "6.7.2" 213 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.2.tgz#b9ef0da6f04932167a9222cb4ac59cb187165ebf" 214 | integrity sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ== 215 | dependencies: 216 | "@eslint-community/eslint-utils" "^4.4.0" 217 | "@types/json-schema" "^7.0.12" 218 | "@types/semver" "^7.5.0" 219 | "@typescript-eslint/scope-manager" "6.7.2" 220 | "@typescript-eslint/types" "6.7.2" 221 | "@typescript-eslint/typescript-estree" "6.7.2" 222 | semver "^7.5.4" 223 | 224 | "@typescript-eslint/visitor-keys@6.7.2": 225 | version "6.7.2" 226 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz#4cb2bd786f1f459731b0ad1584c9f73e1c7a4d5c" 227 | integrity sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ== 228 | dependencies: 229 | "@typescript-eslint/types" "6.7.2" 230 | eslint-visitor-keys "^3.4.1" 231 | 232 | acorn-jsx@^5.3.2: 233 | version "5.3.2" 234 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 235 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 236 | 237 | acorn-walk@^8.1.1: 238 | version "8.2.0" 239 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 240 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 241 | 242 | acorn@^8.4.1: 243 | version "8.7.0" 244 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" 245 | integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== 246 | 247 | acorn@^8.9.0: 248 | version "8.10.0" 249 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" 250 | integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 251 | 252 | ajv@^6.12.4: 253 | version "6.12.6" 254 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 255 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 256 | dependencies: 257 | fast-deep-equal "^3.1.1" 258 | fast-json-stable-stringify "^2.0.0" 259 | json-schema-traverse "^0.4.1" 260 | uri-js "^4.2.2" 261 | 262 | ansi-colors@4.1.1: 263 | version "4.1.1" 264 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 265 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 266 | 267 | ansi-regex@^5.0.1: 268 | version "5.0.1" 269 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 270 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 271 | 272 | ansi-sequence-parser@^1.1.0: 273 | version "1.1.1" 274 | resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" 275 | integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== 276 | 277 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 278 | version "4.3.0" 279 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 280 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 281 | dependencies: 282 | color-convert "^2.0.1" 283 | 284 | anymatch@~3.1.2: 285 | version "3.1.2" 286 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 287 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 288 | dependencies: 289 | normalize-path "^3.0.0" 290 | picomatch "^2.0.4" 291 | 292 | arg@^4.1.0: 293 | version "4.1.3" 294 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 295 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 296 | 297 | argparse@^2.0.1: 298 | version "2.0.1" 299 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 300 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 301 | 302 | array-union@^2.1.0: 303 | version "2.1.0" 304 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 305 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 306 | 307 | asynckit@^0.4.0: 308 | version "0.4.0" 309 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 310 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 311 | 312 | axios-cache-interceptor@^1.3.0: 313 | version "1.3.0" 314 | resolved "https://registry.yarnpkg.com/axios-cache-interceptor/-/axios-cache-interceptor-1.3.0.tgz#9f754d32aee0c3f7aca05cc41f4e10d6bf65f8cc" 315 | integrity sha512-hBI9DXo3OnIsCCQYa4ip/tFa6QYry/WL0WZtPkEsdg4QJ9JGMezApzAT3KL1S/fJ8DjxA1vjAnZ8aAwb/VZDtQ== 316 | dependencies: 317 | cache-parser "^1.2.4" 318 | fast-defer "^1.1.7" 319 | object-code "^1.3.0" 320 | 321 | axios@^1.5.0: 322 | version "1.5.0" 323 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" 324 | integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== 325 | dependencies: 326 | follow-redirects "^1.15.0" 327 | form-data "^4.0.0" 328 | proxy-from-env "^1.1.0" 329 | 330 | balanced-match@^1.0.0: 331 | version "1.0.2" 332 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 333 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 334 | 335 | binary-extensions@^2.0.0: 336 | version "2.2.0" 337 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 338 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 339 | 340 | brace-expansion@^1.1.7: 341 | version "1.1.11" 342 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 343 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 344 | dependencies: 345 | balanced-match "^1.0.0" 346 | concat-map "0.0.1" 347 | 348 | brace-expansion@^2.0.1: 349 | version "2.0.1" 350 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 351 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 352 | dependencies: 353 | balanced-match "^1.0.0" 354 | 355 | braces@^3.0.1, braces@~3.0.2: 356 | version "3.0.2" 357 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 358 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 359 | dependencies: 360 | fill-range "^7.0.1" 361 | 362 | browser-stdout@1.3.1: 363 | version "1.3.1" 364 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 365 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 366 | 367 | cache-parser@^1.2.4: 368 | version "1.2.4" 369 | resolved "https://registry.yarnpkg.com/cache-parser/-/cache-parser-1.2.4.tgz#60975135ef2330e6a1d60895279d7237a2a9b398" 370 | integrity sha512-O0KwuHuJnbHUrghHi2kGp0SxnWSIBXTYt7M8WVhW0kbPRUNUKoE/Of6e1rRD6AAxmfxFunKnt90yEK09D+sc5g== 371 | 372 | callsites@^3.0.0: 373 | version "3.1.0" 374 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 375 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 376 | 377 | camelcase@^6.0.0: 378 | version "6.3.0" 379 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 380 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 381 | 382 | chalk@^4.0.0, chalk@^4.1.0: 383 | version "4.1.2" 384 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 385 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 386 | dependencies: 387 | ansi-styles "^4.1.0" 388 | supports-color "^7.1.0" 389 | 390 | chokidar@3.5.3: 391 | version "3.5.3" 392 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 393 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 394 | dependencies: 395 | anymatch "~3.1.2" 396 | braces "~3.0.2" 397 | glob-parent "~5.1.2" 398 | is-binary-path "~2.1.0" 399 | is-glob "~4.0.1" 400 | normalize-path "~3.0.0" 401 | readdirp "~3.6.0" 402 | optionalDependencies: 403 | fsevents "~2.3.2" 404 | 405 | cliui@^7.0.2: 406 | version "7.0.4" 407 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 408 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 409 | dependencies: 410 | string-width "^4.2.0" 411 | strip-ansi "^6.0.0" 412 | wrap-ansi "^7.0.0" 413 | 414 | color-convert@^2.0.1: 415 | version "2.0.1" 416 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 417 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 418 | dependencies: 419 | color-name "~1.1.4" 420 | 421 | color-name@~1.1.4: 422 | version "1.1.4" 423 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 424 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 425 | 426 | combined-stream@^1.0.8: 427 | version "1.0.8" 428 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 429 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 430 | dependencies: 431 | delayed-stream "~1.0.0" 432 | 433 | concat-map@0.0.1: 434 | version "0.0.1" 435 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 436 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 437 | 438 | create-require@^1.1.0: 439 | version "1.1.1" 440 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 441 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 442 | 443 | cross-spawn@^7.0.2: 444 | version "7.0.3" 445 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 446 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 447 | dependencies: 448 | path-key "^3.1.0" 449 | shebang-command "^2.0.0" 450 | which "^2.0.1" 451 | 452 | debug@4.3.4, debug@^4.3.4: 453 | version "4.3.4" 454 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 455 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 456 | dependencies: 457 | ms "2.1.2" 458 | 459 | debug@^4.1.1, debug@^4.3.2: 460 | version "4.3.3" 461 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 462 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 463 | dependencies: 464 | ms "2.1.2" 465 | 466 | decamelize@^4.0.0: 467 | version "4.0.0" 468 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 469 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 470 | 471 | deep-is@^0.1.3: 472 | version "0.1.4" 473 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 474 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 475 | 476 | delayed-stream@~1.0.0: 477 | version "1.0.0" 478 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 479 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 480 | 481 | diff@5.0.0: 482 | version "5.0.0" 483 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 484 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 485 | 486 | diff@^4.0.1: 487 | version "4.0.2" 488 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 489 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 490 | 491 | dir-glob@^3.0.1: 492 | version "3.0.1" 493 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 494 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 495 | dependencies: 496 | path-type "^4.0.0" 497 | 498 | doctrine@^3.0.0: 499 | version "3.0.0" 500 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 501 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 502 | dependencies: 503 | esutils "^2.0.2" 504 | 505 | emoji-regex@^8.0.0: 506 | version "8.0.0" 507 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 508 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 509 | 510 | escalade@^3.1.1: 511 | version "3.1.1" 512 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 513 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 514 | 515 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: 516 | version "4.0.0" 517 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 518 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 519 | 520 | eslint-scope@^7.2.2: 521 | version "7.2.2" 522 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 523 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 524 | dependencies: 525 | esrecurse "^4.3.0" 526 | estraverse "^5.2.0" 527 | 528 | eslint-visitor-keys@^3.3.0: 529 | version "3.3.0" 530 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 531 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 532 | 533 | eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 534 | version "3.4.3" 535 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 536 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 537 | 538 | eslint@^8.49.0: 539 | version "8.49.0" 540 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" 541 | integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== 542 | dependencies: 543 | "@eslint-community/eslint-utils" "^4.2.0" 544 | "@eslint-community/regexpp" "^4.6.1" 545 | "@eslint/eslintrc" "^2.1.2" 546 | "@eslint/js" "8.49.0" 547 | "@humanwhocodes/config-array" "^0.11.11" 548 | "@humanwhocodes/module-importer" "^1.0.1" 549 | "@nodelib/fs.walk" "^1.2.8" 550 | ajv "^6.12.4" 551 | chalk "^4.0.0" 552 | cross-spawn "^7.0.2" 553 | debug "^4.3.2" 554 | doctrine "^3.0.0" 555 | escape-string-regexp "^4.0.0" 556 | eslint-scope "^7.2.2" 557 | eslint-visitor-keys "^3.4.3" 558 | espree "^9.6.1" 559 | esquery "^1.4.2" 560 | esutils "^2.0.2" 561 | fast-deep-equal "^3.1.3" 562 | file-entry-cache "^6.0.1" 563 | find-up "^5.0.0" 564 | glob-parent "^6.0.2" 565 | globals "^13.19.0" 566 | graphemer "^1.4.0" 567 | ignore "^5.2.0" 568 | imurmurhash "^0.1.4" 569 | is-glob "^4.0.0" 570 | is-path-inside "^3.0.3" 571 | js-yaml "^4.1.0" 572 | json-stable-stringify-without-jsonify "^1.0.1" 573 | levn "^0.4.1" 574 | lodash.merge "^4.6.2" 575 | minimatch "^3.1.2" 576 | natural-compare "^1.4.0" 577 | optionator "^0.9.3" 578 | strip-ansi "^6.0.1" 579 | text-table "^0.2.0" 580 | 581 | espree@^9.6.0, espree@^9.6.1: 582 | version "9.6.1" 583 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 584 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 585 | dependencies: 586 | acorn "^8.9.0" 587 | acorn-jsx "^5.3.2" 588 | eslint-visitor-keys "^3.4.1" 589 | 590 | esquery@^1.4.2: 591 | version "1.5.0" 592 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 593 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 594 | dependencies: 595 | estraverse "^5.1.0" 596 | 597 | esrecurse@^4.3.0: 598 | version "4.3.0" 599 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 600 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 601 | dependencies: 602 | estraverse "^5.2.0" 603 | 604 | estraverse@^5.1.0, estraverse@^5.2.0: 605 | version "5.3.0" 606 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 607 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 608 | 609 | esutils@^2.0.2: 610 | version "2.0.3" 611 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 612 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 613 | 614 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 615 | version "3.1.3" 616 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 617 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 618 | 619 | fast-defer@^1.1.7: 620 | version "1.1.7" 621 | resolved "https://registry.yarnpkg.com/fast-defer/-/fast-defer-1.1.7.tgz#943bc3c7a876d437360318ab1e1f269a29f31ba4" 622 | integrity sha512-tJ01ulDWT2WhqxMKS20nXX6wyX2iInBYpbN3GO7yjKwXMY4qvkdBRxak9IFwBLlFDESox+SwSvqMCZDfe1tqeg== 623 | 624 | fast-glob@^3.2.9: 625 | version "3.2.11" 626 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 627 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 628 | dependencies: 629 | "@nodelib/fs.stat" "^2.0.2" 630 | "@nodelib/fs.walk" "^1.2.3" 631 | glob-parent "^5.1.2" 632 | merge2 "^1.3.0" 633 | micromatch "^4.0.4" 634 | 635 | fast-json-stable-stringify@^2.0.0: 636 | version "2.1.0" 637 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 638 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 639 | 640 | fast-levenshtein@^2.0.6: 641 | version "2.0.6" 642 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 643 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 644 | 645 | fastq@^1.6.0: 646 | version "1.13.0" 647 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 648 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 649 | dependencies: 650 | reusify "^1.0.4" 651 | 652 | file-entry-cache@^6.0.1: 653 | version "6.0.1" 654 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 655 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 656 | dependencies: 657 | flat-cache "^3.0.4" 658 | 659 | fill-range@^7.0.1: 660 | version "7.0.1" 661 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 662 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 663 | dependencies: 664 | to-regex-range "^5.0.1" 665 | 666 | find-up@5.0.0, find-up@^5.0.0: 667 | version "5.0.0" 668 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 669 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 670 | dependencies: 671 | locate-path "^6.0.0" 672 | path-exists "^4.0.0" 673 | 674 | flat-cache@^3.0.4: 675 | version "3.0.4" 676 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 677 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 678 | dependencies: 679 | flatted "^3.1.0" 680 | rimraf "^3.0.2" 681 | 682 | flat@^5.0.2: 683 | version "5.0.2" 684 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 685 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 686 | 687 | flatted@^3.1.0: 688 | version "3.2.5" 689 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" 690 | integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== 691 | 692 | follow-redirects@^1.15.0: 693 | version "1.15.2" 694 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 695 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 696 | 697 | form-data@^4.0.0: 698 | version "4.0.0" 699 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 700 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 701 | dependencies: 702 | asynckit "^0.4.0" 703 | combined-stream "^1.0.8" 704 | mime-types "^2.1.12" 705 | 706 | fs.realpath@^1.0.0: 707 | version "1.0.0" 708 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 709 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 710 | 711 | fsevents@~2.3.2: 712 | version "2.3.2" 713 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 714 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 715 | 716 | get-caller-file@^2.0.5: 717 | version "2.0.5" 718 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 719 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 720 | 721 | glob-parent@^5.1.2, glob-parent@~5.1.2: 722 | version "5.1.2" 723 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 724 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 725 | dependencies: 726 | is-glob "^4.0.1" 727 | 728 | glob-parent@^6.0.2: 729 | version "6.0.2" 730 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 731 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 732 | dependencies: 733 | is-glob "^4.0.3" 734 | 735 | glob@7.2.0, glob@^7.1.3: 736 | version "7.2.0" 737 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 738 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 739 | dependencies: 740 | fs.realpath "^1.0.0" 741 | inflight "^1.0.4" 742 | inherits "2" 743 | minimatch "^3.0.4" 744 | once "^1.3.0" 745 | path-is-absolute "^1.0.0" 746 | 747 | globals@^13.19.0: 748 | version "13.21.0" 749 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" 750 | integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== 751 | dependencies: 752 | type-fest "^0.20.2" 753 | 754 | globby@^11.1.0: 755 | version "11.1.0" 756 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 757 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 758 | dependencies: 759 | array-union "^2.1.0" 760 | dir-glob "^3.0.1" 761 | fast-glob "^3.2.9" 762 | ignore "^5.2.0" 763 | merge2 "^1.4.1" 764 | slash "^3.0.0" 765 | 766 | graphemer@^1.4.0: 767 | version "1.4.0" 768 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 769 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 770 | 771 | has-flag@^4.0.0: 772 | version "4.0.0" 773 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 774 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 775 | 776 | he@1.2.0: 777 | version "1.2.0" 778 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 779 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 780 | 781 | ignore@^5.2.0: 782 | version "5.2.0" 783 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 784 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 785 | 786 | ignore@^5.2.4: 787 | version "5.2.4" 788 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 789 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 790 | 791 | import-fresh@^3.2.1: 792 | version "3.3.0" 793 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 794 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 795 | dependencies: 796 | parent-module "^1.0.0" 797 | resolve-from "^4.0.0" 798 | 799 | imurmurhash@^0.1.4: 800 | version "0.1.4" 801 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 802 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 803 | 804 | inflight@^1.0.4: 805 | version "1.0.6" 806 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 807 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 808 | dependencies: 809 | once "^1.3.0" 810 | wrappy "1" 811 | 812 | inherits@2: 813 | version "2.0.4" 814 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 815 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 816 | 817 | is-binary-path@~2.1.0: 818 | version "2.1.0" 819 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 820 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 821 | dependencies: 822 | binary-extensions "^2.0.0" 823 | 824 | is-extglob@^2.1.1: 825 | version "2.1.1" 826 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 827 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 828 | 829 | is-fullwidth-code-point@^3.0.0: 830 | version "3.0.0" 831 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 832 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 833 | 834 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 835 | version "4.0.3" 836 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 837 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 838 | dependencies: 839 | is-extglob "^2.1.1" 840 | 841 | is-number@^7.0.0: 842 | version "7.0.0" 843 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 844 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 845 | 846 | is-path-inside@^3.0.3: 847 | version "3.0.3" 848 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 849 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 850 | 851 | is-plain-obj@^2.1.0: 852 | version "2.1.0" 853 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 854 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 855 | 856 | is-unicode-supported@^0.1.0: 857 | version "0.1.0" 858 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 859 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 860 | 861 | isexe@^2.0.0: 862 | version "2.0.0" 863 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 864 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 865 | 866 | js-yaml@4.1.0, js-yaml@^4.1.0: 867 | version "4.1.0" 868 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 869 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 870 | dependencies: 871 | argparse "^2.0.1" 872 | 873 | json-schema-traverse@^0.4.1: 874 | version "0.4.1" 875 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 876 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 877 | 878 | json-stable-stringify-without-jsonify@^1.0.1: 879 | version "1.0.1" 880 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 881 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 882 | 883 | jsonc-parser@^3.2.0: 884 | version "3.2.0" 885 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" 886 | integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== 887 | 888 | levn@^0.4.1: 889 | version "0.4.1" 890 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 891 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 892 | dependencies: 893 | prelude-ls "^1.2.1" 894 | type-check "~0.4.0" 895 | 896 | locate-path@^6.0.0: 897 | version "6.0.0" 898 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 899 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 900 | dependencies: 901 | p-locate "^5.0.0" 902 | 903 | lodash.merge@^4.6.2: 904 | version "4.6.2" 905 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 906 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 907 | 908 | log-symbols@4.1.0: 909 | version "4.1.0" 910 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 911 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 912 | dependencies: 913 | chalk "^4.1.0" 914 | is-unicode-supported "^0.1.0" 915 | 916 | lru-cache@^6.0.0: 917 | version "6.0.0" 918 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 919 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 920 | dependencies: 921 | yallist "^4.0.0" 922 | 923 | lunr@^2.3.9: 924 | version "2.3.9" 925 | resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" 926 | integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 927 | 928 | make-error@^1.1.1: 929 | version "1.3.6" 930 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 931 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 932 | 933 | marked@^4.3.0: 934 | version "4.3.0" 935 | resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" 936 | integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== 937 | 938 | merge2@^1.3.0, merge2@^1.4.1: 939 | version "1.4.1" 940 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 941 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 942 | 943 | micromatch@^4.0.4: 944 | version "4.0.4" 945 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 946 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 947 | dependencies: 948 | braces "^3.0.1" 949 | picomatch "^2.2.3" 950 | 951 | mime-db@1.52.0: 952 | version "1.52.0" 953 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 954 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 955 | 956 | mime-types@^2.1.12: 957 | version "2.1.35" 958 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 959 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 960 | dependencies: 961 | mime-db "1.52.0" 962 | 963 | minimatch@5.0.1: 964 | version "5.0.1" 965 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 966 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 967 | dependencies: 968 | brace-expansion "^2.0.1" 969 | 970 | minimatch@^3.0.4: 971 | version "3.1.1" 972 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.1.tgz#879ad447200773912898b46cd516a7abbb5e50b0" 973 | integrity sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A== 974 | dependencies: 975 | brace-expansion "^1.1.7" 976 | 977 | minimatch@^3.0.5, minimatch@^3.1.2: 978 | version "3.1.2" 979 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 980 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 981 | dependencies: 982 | brace-expansion "^1.1.7" 983 | 984 | minimatch@^9.0.3: 985 | version "9.0.3" 986 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 987 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 988 | dependencies: 989 | brace-expansion "^2.0.1" 990 | 991 | mocha@^10.2.0: 992 | version "10.2.0" 993 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" 994 | integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== 995 | dependencies: 996 | ansi-colors "4.1.1" 997 | browser-stdout "1.3.1" 998 | chokidar "3.5.3" 999 | debug "4.3.4" 1000 | diff "5.0.0" 1001 | escape-string-regexp "4.0.0" 1002 | find-up "5.0.0" 1003 | glob "7.2.0" 1004 | he "1.2.0" 1005 | js-yaml "4.1.0" 1006 | log-symbols "4.1.0" 1007 | minimatch "5.0.1" 1008 | ms "2.1.3" 1009 | nanoid "3.3.3" 1010 | serialize-javascript "6.0.0" 1011 | strip-json-comments "3.1.1" 1012 | supports-color "8.1.1" 1013 | workerpool "6.2.1" 1014 | yargs "16.2.0" 1015 | yargs-parser "20.2.4" 1016 | yargs-unparser "2.0.0" 1017 | 1018 | ms@2.1.2: 1019 | version "2.1.2" 1020 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1021 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1022 | 1023 | ms@2.1.3: 1024 | version "2.1.3" 1025 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1026 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1027 | 1028 | nanoid@3.3.3: 1029 | version "3.3.3" 1030 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 1031 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 1032 | 1033 | natural-compare@^1.4.0: 1034 | version "1.4.0" 1035 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1036 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1037 | 1038 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1039 | version "3.0.0" 1040 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1041 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1042 | 1043 | object-code@^1.3.0: 1044 | version "1.3.0" 1045 | resolved "https://registry.yarnpkg.com/object-code/-/object-code-1.3.0.tgz#59b52213c5a7a450071dab201e36ae2492b983d8" 1046 | integrity sha512-PLplgvzuFhSPBuTX/mtaXEnU3c6g7qKflVVQbV9VWEnV/34iKeAX1jeDNCKq1OgGlsnkA/NjldCzTbHxa7Wj4A== 1047 | 1048 | once@^1.3.0: 1049 | version "1.4.0" 1050 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1051 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1052 | dependencies: 1053 | wrappy "1" 1054 | 1055 | optionator@^0.9.3: 1056 | version "0.9.3" 1057 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" 1058 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== 1059 | dependencies: 1060 | "@aashutoshrathi/word-wrap" "^1.2.3" 1061 | deep-is "^0.1.3" 1062 | fast-levenshtein "^2.0.6" 1063 | levn "^0.4.1" 1064 | prelude-ls "^1.2.1" 1065 | type-check "^0.4.0" 1066 | 1067 | p-limit@^3.0.2: 1068 | version "3.1.0" 1069 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1070 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1071 | dependencies: 1072 | yocto-queue "^0.1.0" 1073 | 1074 | p-locate@^5.0.0: 1075 | version "5.0.0" 1076 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1077 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1078 | dependencies: 1079 | p-limit "^3.0.2" 1080 | 1081 | parent-module@^1.0.0: 1082 | version "1.0.1" 1083 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1084 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1085 | dependencies: 1086 | callsites "^3.0.0" 1087 | 1088 | path-exists@^4.0.0: 1089 | version "4.0.0" 1090 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1091 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1092 | 1093 | path-is-absolute@^1.0.0: 1094 | version "1.0.1" 1095 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1096 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1097 | 1098 | path-key@^3.1.0: 1099 | version "3.1.1" 1100 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1101 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1102 | 1103 | path-type@^4.0.0: 1104 | version "4.0.0" 1105 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1106 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1107 | 1108 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: 1109 | version "2.3.1" 1110 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1111 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1112 | 1113 | prelude-ls@^1.2.1: 1114 | version "1.2.1" 1115 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1116 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1117 | 1118 | prettier@^3.0.3: 1119 | version "3.0.3" 1120 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" 1121 | integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== 1122 | 1123 | proxy-from-env@^1.1.0: 1124 | version "1.1.0" 1125 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1126 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1127 | 1128 | punycode@^2.1.0: 1129 | version "2.1.1" 1130 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1131 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1132 | 1133 | queue-microtask@^1.2.2: 1134 | version "1.2.3" 1135 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1136 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1137 | 1138 | randombytes@^2.1.0: 1139 | version "2.1.0" 1140 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1141 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1142 | dependencies: 1143 | safe-buffer "^5.1.0" 1144 | 1145 | readdirp@~3.6.0: 1146 | version "3.6.0" 1147 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1148 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1149 | dependencies: 1150 | picomatch "^2.2.1" 1151 | 1152 | require-directory@^2.1.1: 1153 | version "2.1.1" 1154 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1155 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1156 | 1157 | resolve-from@^4.0.0: 1158 | version "4.0.0" 1159 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1160 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1161 | 1162 | reusify@^1.0.4: 1163 | version "1.0.4" 1164 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1165 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1166 | 1167 | rimraf@^3.0.2: 1168 | version "3.0.2" 1169 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1170 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1171 | dependencies: 1172 | glob "^7.1.3" 1173 | 1174 | run-parallel@^1.1.9: 1175 | version "1.2.0" 1176 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1177 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1178 | dependencies: 1179 | queue-microtask "^1.2.2" 1180 | 1181 | safe-buffer@^5.1.0: 1182 | version "5.2.1" 1183 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1184 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1185 | 1186 | semver@^7.5.4: 1187 | version "7.5.4" 1188 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1189 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1190 | dependencies: 1191 | lru-cache "^6.0.0" 1192 | 1193 | serialize-javascript@6.0.0: 1194 | version "6.0.0" 1195 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1196 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1197 | dependencies: 1198 | randombytes "^2.1.0" 1199 | 1200 | shebang-command@^2.0.0: 1201 | version "2.0.0" 1202 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1203 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1204 | dependencies: 1205 | shebang-regex "^3.0.0" 1206 | 1207 | shebang-regex@^3.0.0: 1208 | version "3.0.0" 1209 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1210 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1211 | 1212 | shiki@^0.14.1: 1213 | version "0.14.4" 1214 | resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.4.tgz#2454969b466a5f75067d0f2fa0d7426d32881b20" 1215 | integrity sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ== 1216 | dependencies: 1217 | ansi-sequence-parser "^1.1.0" 1218 | jsonc-parser "^3.2.0" 1219 | vscode-oniguruma "^1.7.0" 1220 | vscode-textmate "^8.0.0" 1221 | 1222 | slash@^3.0.0: 1223 | version "3.0.0" 1224 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1225 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1226 | 1227 | string-width@^4.1.0, string-width@^4.2.0: 1228 | version "4.2.3" 1229 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1230 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1231 | dependencies: 1232 | emoji-regex "^8.0.0" 1233 | is-fullwidth-code-point "^3.0.0" 1234 | strip-ansi "^6.0.1" 1235 | 1236 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1237 | version "6.0.1" 1238 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1239 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1240 | dependencies: 1241 | ansi-regex "^5.0.1" 1242 | 1243 | strip-json-comments@3.1.1, strip-json-comments@^3.1.1: 1244 | version "3.1.1" 1245 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1246 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1247 | 1248 | supports-color@8.1.1: 1249 | version "8.1.1" 1250 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1251 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1252 | dependencies: 1253 | has-flag "^4.0.0" 1254 | 1255 | supports-color@^7.1.0: 1256 | version "7.2.0" 1257 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1258 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1259 | dependencies: 1260 | has-flag "^4.0.0" 1261 | 1262 | text-table@^0.2.0: 1263 | version "0.2.0" 1264 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1265 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1266 | 1267 | to-regex-range@^5.0.1: 1268 | version "5.0.1" 1269 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1270 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1271 | dependencies: 1272 | is-number "^7.0.0" 1273 | 1274 | ts-api-utils@^1.0.1: 1275 | version "1.0.3" 1276 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" 1277 | integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== 1278 | 1279 | ts-node@^10.9.1: 1280 | version "10.9.1" 1281 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1282 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1283 | dependencies: 1284 | "@cspotcode/source-map-support" "^0.8.0" 1285 | "@tsconfig/node10" "^1.0.7" 1286 | "@tsconfig/node12" "^1.0.7" 1287 | "@tsconfig/node14" "^1.0.0" 1288 | "@tsconfig/node16" "^1.0.2" 1289 | acorn "^8.4.1" 1290 | acorn-walk "^8.1.1" 1291 | arg "^4.1.0" 1292 | create-require "^1.1.0" 1293 | diff "^4.0.1" 1294 | make-error "^1.1.1" 1295 | v8-compile-cache-lib "^3.0.1" 1296 | yn "3.1.1" 1297 | 1298 | type-check@^0.4.0, type-check@~0.4.0: 1299 | version "0.4.0" 1300 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1301 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1302 | dependencies: 1303 | prelude-ls "^1.2.1" 1304 | 1305 | type-fest@^0.20.2: 1306 | version "0.20.2" 1307 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1308 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1309 | 1310 | typedoc@^0.25.1: 1311 | version "0.25.1" 1312 | resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.1.tgz#50de2d8fb93623fbfb59e2fa6407ff40e3d3f438" 1313 | integrity sha512-c2ye3YUtGIadxN2O6YwPEXgrZcvhlZ6HlhWZ8jQRNzwLPn2ylhdGqdR8HbyDRyALP8J6lmSANILCkkIdNPFxqA== 1314 | dependencies: 1315 | lunr "^2.3.9" 1316 | marked "^4.3.0" 1317 | minimatch "^9.0.3" 1318 | shiki "^0.14.1" 1319 | 1320 | typescript@^5.2.2: 1321 | version "5.2.2" 1322 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" 1323 | integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== 1324 | 1325 | uri-js@^4.2.2: 1326 | version "4.4.1" 1327 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1328 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1329 | dependencies: 1330 | punycode "^2.1.0" 1331 | 1332 | v8-compile-cache-lib@^3.0.1: 1333 | version "3.0.1" 1334 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1335 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1336 | 1337 | vscode-oniguruma@^1.7.0: 1338 | version "1.7.0" 1339 | resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" 1340 | integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== 1341 | 1342 | vscode-textmate@^8.0.0: 1343 | version "8.0.0" 1344 | resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" 1345 | integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== 1346 | 1347 | which@^2.0.1: 1348 | version "2.0.2" 1349 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1350 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1351 | dependencies: 1352 | isexe "^2.0.0" 1353 | 1354 | workerpool@6.2.1: 1355 | version "6.2.1" 1356 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1357 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1358 | 1359 | wrap-ansi@^7.0.0: 1360 | version "7.0.0" 1361 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1362 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1363 | dependencies: 1364 | ansi-styles "^4.0.0" 1365 | string-width "^4.1.0" 1366 | strip-ansi "^6.0.0" 1367 | 1368 | wrappy@1: 1369 | version "1.0.2" 1370 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1371 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1372 | 1373 | y18n@^5.0.5: 1374 | version "5.0.8" 1375 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1376 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1377 | 1378 | yallist@^4.0.0: 1379 | version "4.0.0" 1380 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1381 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1382 | 1383 | yargs-parser@20.2.4: 1384 | version "20.2.4" 1385 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1386 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1387 | 1388 | yargs-parser@^20.2.2: 1389 | version "20.2.9" 1390 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1391 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1392 | 1393 | yargs-unparser@2.0.0: 1394 | version "2.0.0" 1395 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1396 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1397 | dependencies: 1398 | camelcase "^6.0.0" 1399 | decamelize "^4.0.0" 1400 | flat "^5.0.2" 1401 | is-plain-obj "^2.1.0" 1402 | 1403 | yargs@16.2.0: 1404 | version "16.2.0" 1405 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1406 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1407 | dependencies: 1408 | cliui "^7.0.2" 1409 | escalade "^3.1.1" 1410 | get-caller-file "^2.0.5" 1411 | require-directory "^2.1.1" 1412 | string-width "^4.2.0" 1413 | y18n "^5.0.5" 1414 | yargs-parser "^20.2.2" 1415 | 1416 | yn@3.1.1: 1417 | version "3.1.1" 1418 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1419 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1420 | 1421 | yocto-queue@^0.1.0: 1422 | version "0.1.0" 1423 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1424 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1425 | --------------------------------------------------------------------------------