From bd03f37a39f4e3f41efef3432a6f0cc9b623c45f Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 7 Jan 2026 17:56:52 +0000 Subject: [PATCH] Refactor: Switch to NPM version of twitter-scraper and remove local clone --- package.json | 5 +- twitter-scraper/.commitlintrc | 5 - twitter-scraper/.eslintrc.js | 24 - twitter-scraper/.gitattributes | 78 - twitter-scraper/.github/workflows/build.yml | 29 - twitter-scraper/.github/workflows/docs.yml | 25 - twitter-scraper/.github/workflows/publish.yml | 30 - twitter-scraper/.github/workflows/test.yml | 33 - twitter-scraper/.gitignore | 122 - twitter-scraper/.husky/.gitignore | 1 - twitter-scraper/.husky/commit-msg | 4 - twitter-scraper/.husky/pre-commit | 4 - twitter-scraper/.npmignore | 7 - twitter-scraper/.prettierignore | 3 - twitter-scraper/.prettierrc | 5 - twitter-scraper/.yarnrc.yml | 1 - twitter-scraper/LICENSE | 21 - twitter-scraper/README.md | 295 - .../examples/cors-proxy/package.json | 18 - .../examples/cors-proxy/src/index.mts | 79 - .../examples/cors-proxy/tsconfig.json | 7 - twitter-scraper/examples/cors-proxy/yarn.lock | 763 --- twitter-scraper/examples/cycletls/README.md | 48 - .../examples/cycletls/package.json | 13 - .../examples/cycletls/src/index.ts | 56 - .../examples/cycletls/tsconfig.json | 7 - twitter-scraper/examples/cycletls/yarn.lock | 589 -- .../examples/etc-compat/package.json | 11 - .../examples/etc-compat/src/index.mts | 16 - .../examples/etc-compat/tsconfig.json | 8 - twitter-scraper/examples/etc-compat/yarn.lock | 409 -- .../examples/node-integration/package.json | 13 - .../examples/node-integration/src/index.cjs | 42 - .../examples/node-integration/src/index.mjs | 36 - .../examples/node-integration/yarn.lock | 369 -- .../examples/react-integration/.env.example | 4 - .../examples/react-integration/.eslintrc.cjs | 18 - .../examples/react-integration/.gitignore | 24 - .../examples/react-integration/README.md | 21 - .../examples/react-integration/index.html | 13 - .../examples/react-integration/package.json | 29 - .../react-integration/public/vite.svg | 1 - .../examples/react-integration/src/App.css | 42 - .../examples/react-integration/src/App.tsx | 85 - .../examples/react-integration/src/index.css | 68 - .../examples/react-integration/src/main.tsx | 10 - .../react-integration/src/vite-env.d.ts | 11 - .../examples/react-integration/tsconfig.json | 25 - .../react-integration/tsconfig.node.json | 11 - .../examples/react-integration/vite.config.ts | 7 - .../examples/react-integration/yarn.lock | 1610 ----- twitter-scraper/jest.config.js | 27 - twitter-scraper/package.json | 110 - twitter-scraper/rollup.config.mjs | 92 - twitter-scraper/src/_cycletls.ts | 7 - twitter-scraper/src/_module.ts | 58 - twitter-scraper/src/api-data.ts | 179 - twitter-scraper/src/api-types.ts | 3 - twitter-scraper/src/api.ts | 222 - twitter-scraper/src/auth-user.test.ts | 397 -- twitter-scraper/src/auth-user.ts | 706 --- twitter-scraper/src/auth.test.ts | 45 - twitter-scraper/src/auth.ts | 343 -- twitter-scraper/src/cycletls-fetch.ts | 141 - twitter-scraper/src/direct-messages-async.ts | 58 - twitter-scraper/src/direct-messages.test.ts | 125 - twitter-scraper/src/direct-messages.ts | 301 - twitter-scraper/src/errors.ts | 66 - twitter-scraper/src/platform/index.ts | 21 - twitter-scraper/src/platform/node/index.ts | 11 - .../src/platform/node/randomize-ciphers.ts | 29 - .../src/platform/platform-interface.ts | 16 - twitter-scraper/src/profile.test.ts | 138 - twitter-scraper/src/profile.ts | 291 - twitter-scraper/src/rate-limit.test.ts | 41 - twitter-scraper/src/rate-limit.ts | 85 - twitter-scraper/src/relationships.test.ts | 59 - twitter-scraper/src/relationships.ts | 157 - twitter-scraper/src/requests.ts | 80 - twitter-scraper/src/scraper.test.ts | 38 - twitter-scraper/src/scraper.ts | 626 -- twitter-scraper/src/search.test.ts | 79 - twitter-scraper/src/search.ts | 138 - twitter-scraper/src/test-utils.ts | 73 - twitter-scraper/src/timeline-async.ts | 95 - twitter-scraper/src/timeline-list.ts | 73 - twitter-scraper/src/timeline-relationship.ts | 95 - twitter-scraper/src/timeline-search.ts | 129 - twitter-scraper/src/timeline-tweet-util.ts | 165 - twitter-scraper/src/timeline-v1.ts | 499 -- twitter-scraper/src/timeline-v2.test.ts | 97 - twitter-scraper/src/timeline-v2.ts | 458 -- twitter-scraper/src/trends.test.ts | 8 - twitter-scraper/src/trends.ts | 52 - twitter-scraper/src/tweets.test.ts | 408 -- twitter-scraper/src/tweets.ts | 449 -- twitter-scraper/src/type-util.ts | 13 - twitter-scraper/src/xctxid.ts | 176 - twitter-scraper/src/xpff.ts | 103 - twitter-scraper/test-setup.js | 1 - twitter-scraper/tsconfig.json | 22 - twitter-scraper/typedoc.json | 6 - twitter-scraper/yarn.lock | 5223 ----------------- 103 files changed, 2 insertions(+), 17987 deletions(-) delete mode 100644 twitter-scraper/.commitlintrc delete mode 100644 twitter-scraper/.eslintrc.js delete mode 100644 twitter-scraper/.gitattributes delete mode 100644 twitter-scraper/.github/workflows/build.yml delete mode 100644 twitter-scraper/.github/workflows/docs.yml delete mode 100644 twitter-scraper/.github/workflows/publish.yml delete mode 100644 twitter-scraper/.github/workflows/test.yml delete mode 100644 twitter-scraper/.gitignore delete mode 100644 twitter-scraper/.husky/.gitignore delete mode 100644 twitter-scraper/.husky/commit-msg delete mode 100644 twitter-scraper/.husky/pre-commit delete mode 100644 twitter-scraper/.npmignore delete mode 100644 twitter-scraper/.prettierignore delete mode 100644 twitter-scraper/.prettierrc delete mode 100644 twitter-scraper/.yarnrc.yml delete mode 100644 twitter-scraper/LICENSE delete mode 100644 twitter-scraper/README.md delete mode 100644 twitter-scraper/examples/cors-proxy/package.json delete mode 100644 twitter-scraper/examples/cors-proxy/src/index.mts delete mode 100644 twitter-scraper/examples/cors-proxy/tsconfig.json delete mode 100644 twitter-scraper/examples/cors-proxy/yarn.lock delete mode 100644 twitter-scraper/examples/cycletls/README.md delete mode 100644 twitter-scraper/examples/cycletls/package.json delete mode 100644 twitter-scraper/examples/cycletls/src/index.ts delete mode 100644 twitter-scraper/examples/cycletls/tsconfig.json delete mode 100644 twitter-scraper/examples/cycletls/yarn.lock delete mode 100644 twitter-scraper/examples/etc-compat/package.json delete mode 100644 twitter-scraper/examples/etc-compat/src/index.mts delete mode 100644 twitter-scraper/examples/etc-compat/tsconfig.json delete mode 100644 twitter-scraper/examples/etc-compat/yarn.lock delete mode 100644 twitter-scraper/examples/node-integration/package.json delete mode 100644 twitter-scraper/examples/node-integration/src/index.cjs delete mode 100644 twitter-scraper/examples/node-integration/src/index.mjs delete mode 100644 twitter-scraper/examples/node-integration/yarn.lock delete mode 100644 twitter-scraper/examples/react-integration/.env.example delete mode 100644 twitter-scraper/examples/react-integration/.eslintrc.cjs delete mode 100644 twitter-scraper/examples/react-integration/.gitignore delete mode 100644 twitter-scraper/examples/react-integration/README.md delete mode 100644 twitter-scraper/examples/react-integration/index.html delete mode 100644 twitter-scraper/examples/react-integration/package.json delete mode 100644 twitter-scraper/examples/react-integration/public/vite.svg delete mode 100644 twitter-scraper/examples/react-integration/src/App.css delete mode 100644 twitter-scraper/examples/react-integration/src/App.tsx delete mode 100644 twitter-scraper/examples/react-integration/src/index.css delete mode 100644 twitter-scraper/examples/react-integration/src/main.tsx delete mode 100644 twitter-scraper/examples/react-integration/src/vite-env.d.ts delete mode 100644 twitter-scraper/examples/react-integration/tsconfig.json delete mode 100644 twitter-scraper/examples/react-integration/tsconfig.node.json delete mode 100644 twitter-scraper/examples/react-integration/vite.config.ts delete mode 100644 twitter-scraper/examples/react-integration/yarn.lock delete mode 100644 twitter-scraper/jest.config.js delete mode 100644 twitter-scraper/package.json delete mode 100644 twitter-scraper/rollup.config.mjs delete mode 100644 twitter-scraper/src/_cycletls.ts delete mode 100644 twitter-scraper/src/_module.ts delete mode 100644 twitter-scraper/src/api-data.ts delete mode 100644 twitter-scraper/src/api-types.ts delete mode 100644 twitter-scraper/src/api.ts delete mode 100644 twitter-scraper/src/auth-user.test.ts delete mode 100644 twitter-scraper/src/auth-user.ts delete mode 100644 twitter-scraper/src/auth.test.ts delete mode 100644 twitter-scraper/src/auth.ts delete mode 100644 twitter-scraper/src/cycletls-fetch.ts delete mode 100644 twitter-scraper/src/direct-messages-async.ts delete mode 100644 twitter-scraper/src/direct-messages.test.ts delete mode 100644 twitter-scraper/src/direct-messages.ts delete mode 100644 twitter-scraper/src/errors.ts delete mode 100644 twitter-scraper/src/platform/index.ts delete mode 100644 twitter-scraper/src/platform/node/index.ts delete mode 100644 twitter-scraper/src/platform/node/randomize-ciphers.ts delete mode 100644 twitter-scraper/src/platform/platform-interface.ts delete mode 100644 twitter-scraper/src/profile.test.ts delete mode 100644 twitter-scraper/src/profile.ts delete mode 100644 twitter-scraper/src/rate-limit.test.ts delete mode 100644 twitter-scraper/src/rate-limit.ts delete mode 100644 twitter-scraper/src/relationships.test.ts delete mode 100644 twitter-scraper/src/relationships.ts delete mode 100644 twitter-scraper/src/requests.ts delete mode 100644 twitter-scraper/src/scraper.test.ts delete mode 100644 twitter-scraper/src/scraper.ts delete mode 100644 twitter-scraper/src/search.test.ts delete mode 100644 twitter-scraper/src/search.ts delete mode 100644 twitter-scraper/src/test-utils.ts delete mode 100644 twitter-scraper/src/timeline-async.ts delete mode 100644 twitter-scraper/src/timeline-list.ts delete mode 100644 twitter-scraper/src/timeline-relationship.ts delete mode 100644 twitter-scraper/src/timeline-search.ts delete mode 100644 twitter-scraper/src/timeline-tweet-util.ts delete mode 100644 twitter-scraper/src/timeline-v1.ts delete mode 100644 twitter-scraper/src/timeline-v2.test.ts delete mode 100644 twitter-scraper/src/timeline-v2.ts delete mode 100644 twitter-scraper/src/trends.test.ts delete mode 100644 twitter-scraper/src/trends.ts delete mode 100644 twitter-scraper/src/tweets.test.ts delete mode 100644 twitter-scraper/src/tweets.ts delete mode 100644 twitter-scraper/src/type-util.ts delete mode 100644 twitter-scraper/src/xctxid.ts delete mode 100644 twitter-scraper/src/xpff.ts delete mode 100644 twitter-scraper/test-setup.js delete mode 100644 twitter-scraper/tsconfig.json delete mode 100644 twitter-scraper/typedoc.json delete mode 100644 twitter-scraper/yarn.lock diff --git a/package.json b/package.json index ce6f70d..7a18d97 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "import": "tsx src/index.ts --import-history", "lint": "biome check --write .", "format": "biome format --write .", - "typecheck": "tsc --noEmit", - "postinstall": "cd twitter-scraper && npm install && npm run build" + "typecheck": "tsc --noEmit" }, "keywords": [ "bluesky", @@ -28,7 +27,7 @@ "dependencies": { "@atproto/api": "^0.18.9", "@google/generative-ai": "^0.24.1", - "@the-convocation/twitter-scraper": "file:./twitter-scraper", + "@the-convocation/twitter-scraper": "^0.21.1", "axios": "^1.13.2", "bcryptjs": "^3.0.3", "better-sqlite3": "^12.5.0", diff --git a/twitter-scraper/.commitlintrc b/twitter-scraper/.commitlintrc deleted file mode 100644 index b34b410..0000000 --- a/twitter-scraper/.commitlintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "@commitlint/config-conventional" - ] -} \ No newline at end of file diff --git a/twitter-scraper/.eslintrc.js b/twitter-scraper/.eslintrc.js deleted file mode 100644 index 1213860..0000000 --- a/twitter-scraper/.eslintrc.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - tsconfigRootDir: __dirname, - sourceType: 'module', - }, - plugins: ['@typescript-eslint/eslint-plugin'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - root: true, - env: { - node: true, - jest: true, - }, - ignorePatterns: ['**/*.js'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, -}; diff --git a/twitter-scraper/.gitattributes b/twitter-scraper/.gitattributes deleted file mode 100644 index 1d2d013..0000000 --- a/twitter-scraper/.gitattributes +++ /dev/null @@ -1,78 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# -# The above will handle all files NOT found below -# - -# Code -*.js text eol=lf -*.ts text eol=lf - -# Documents -*.bibtex text diff=bibtex -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain -*.md text diff=markdown -*.mdx text diff=markdown -*.tex text diff=tex -*.adoc text -*.textile text -*.mustache text -*.csv text -*.tab text -*.tsv text -*.txt text -*.sql text - -# Graphics -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.tif binary -*.tiff binary -*.ico binary -*.svg text -*.eps binary - -# Scripts -*.bash text eol=lf -*.fish text eol=lf -*.sh text eol=lf -*.zsh text eol=lf -*.bat text eol=crlf -*.cmd text eol=crlf -*.ps1 text eol=crlf - -# Serialisation -*.json text -*.toml text -*.xml text -*.yaml text -*.yml text - -# Archives -*.7z binary -*.gz binary -*.tar binary -*.tgz binary -*.zip binary - -# Text files where line endings should be preserved -*.patch -text - -# -# Exclude files from exporting -# - -.gitattributes export-ignore -.gitignore export-ignore \ No newline at end of file diff --git a/twitter-scraper/.github/workflows/build.yml b/twitter-scraper/.github/workflows/build.yml deleted file mode 100644 index a19dc3b..0000000 --- a/twitter-scraper/.github/workflows/build.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Node.js Build - -on: - workflow_dispatch: - push: - branches: [main] - pull_request: - branches: [main] - schedule: - - cron: '22 18 * * 3' - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - node: [18.x, 20.x] - steps: - - uses: actions/checkout@v3 - - name: Install Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - name: Yarn - run: npm install -g yarn - - name: Install - run: yarn install - - name: Build - run: yarn build diff --git a/twitter-scraper/.github/workflows/docs.yml b/twitter-scraper/.github/workflows/docs.yml deleted file mode 100644 index 0327085..0000000 --- a/twitter-scraper/.github/workflows/docs.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Documentation - -on: - push: - branches: [main] - -jobs: - docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Node.js - uses: actions/setup-node@v3 - with: - node-version: 18.x - - name: Yarn - run: npm install -g yarn - - name: Install - run: yarn install - - name: Deploy docs - run: | - git config --global user.name 'venatbot' - git config --global user.email 'venatbot@protonmail.com' - git remote set-url origin 'https://venatbot:${{ secrets.GH_TOKEN }}@github.com/the-convocation/twitter-scraper.git' - yarn docs:deploy diff --git a/twitter-scraper/.github/workflows/publish.yml b/twitter-scraper/.github/workflows/publish.yml deleted file mode 100644 index 604e844..0000000 --- a/twitter-scraper/.github/workflows/publish.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Publish - -on: - release: - types: - - created - -permissions: - id-token: write # Required for OIDC - contents: read - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 22.x - - name: Update NPM - run: npm install -g npm - - name: Yarn - run: npm install -g yarn - - name: Install - run: yarn install - - name: Build - run: yarn build - - name: Publish - run: npm publish --access public diff --git a/twitter-scraper/.github/workflows/test.yml b/twitter-scraper/.github/workflows/test.yml deleted file mode 100644 index 18304e2..0000000 --- a/twitter-scraper/.github/workflows/test.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Node.js Test - -on: - workflow_dispatch: - push: - branches: [main] - pull_request: - branches: [main] - schedule: - - cron: '37 22 * * 2' - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - node: [18.x, 20.x] - steps: - - uses: actions/checkout@v3 - - name: Install Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - name: Yarn - run: npm install -g yarn - - name: Install - run: yarn install - - name: Test - env: - TWITTER_USERNAME: ${{ secrets.TWITTER_USERNAME }} - TWITTER_PASSWORD: ${{ secrets.TWITTER_PASSWORD }} - TWITTER_EMAIL: ${{ secrets.TWITTER_EMAIL }} - run: yarn test diff --git a/twitter-scraper/.gitignore b/twitter-scraper/.gitignore deleted file mode 100644 index 10878d9..0000000 --- a/twitter-scraper/.gitignore +++ /dev/null @@ -1,122 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# Yarn cache -.yarn - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# VSCode -.vscode/ - -# JetBrains -.idea/ - -# Documentation -docs/ - -# NPM lockfile -package-lock.json - -.env*.local -*.har diff --git a/twitter-scraper/.husky/.gitignore b/twitter-scraper/.husky/.gitignore deleted file mode 100644 index c9cdc63..0000000 --- a/twitter-scraper/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ \ No newline at end of file diff --git a/twitter-scraper/.husky/commit-msg b/twitter-scraper/.husky/commit-msg deleted file mode 100644 index 3c9d64e..0000000 --- a/twitter-scraper/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -npx commitlint --edit \ No newline at end of file diff --git a/twitter-scraper/.husky/pre-commit b/twitter-scraper/.husky/pre-commit deleted file mode 100644 index c37466e..0000000 --- a/twitter-scraper/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged \ No newline at end of file diff --git a/twitter-scraper/.npmignore b/twitter-scraper/.npmignore deleted file mode 100644 index 45f6d7a..0000000 --- a/twitter-scraper/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -docs/ -src/ -.*/ -jest.config.js -tsconfig.json -typedoc.json -yarn.lock \ No newline at end of file diff --git a/twitter-scraper/.prettierignore b/twitter-scraper/.prettierignore deleted file mode 100644 index e37829f..0000000 --- a/twitter-scraper/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -dist/ -*.json \ No newline at end of file diff --git a/twitter-scraper/.prettierrc b/twitter-scraper/.prettierrc deleted file mode 100644 index 86f680f..0000000 --- a/twitter-scraper/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "semi": true -} \ No newline at end of file diff --git a/twitter-scraper/.yarnrc.yml b/twitter-scraper/.yarnrc.yml deleted file mode 100644 index 3186f3f..0000000 --- a/twitter-scraper/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/twitter-scraper/LICENSE b/twitter-scraper/LICENSE deleted file mode 100644 index e183e8b..0000000 --- a/twitter-scraper/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 karashiiro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/twitter-scraper/README.md b/twitter-scraper/README.md deleted file mode 100644 index 3077832..0000000 --- a/twitter-scraper/README.md +++ /dev/null @@ -1,295 +0,0 @@ -# twitter-scraper - -[![Documentation badge](https://img.shields.io/badge/docs-here-informational)](https://the-convocation.github.io/twitter-scraper/) - -A port of the now-archived [n0madic/twitter-scraper](https://github.com/n0madic/twitter-scraper) to Node.js. - -> Twitter's API is annoying to work with, and has lots of limitations — luckily -> their frontend (JavaScript) has it's own API, which I reverse-engineered. No -> API rate limits. No tokens needed. No restrictions. Extremely fast. -> -> You can use this library to get the text of any user's Tweets trivially. - -Many things have changed since X (the company formerly known as Twitter) was acquired in 2022: - -- Several operations require logging in with a real user account via - `scraper.login()`. **While we are not aware of confirmed cases caused - by this library, any account you log into with this library is subject - to being banned at any time. You have been warned.** -- Twitter's frontend API does in fact have rate limits - ([#11](https://github.com/the-convocation/twitter-scraper/issues/11)). - The rate limits are dynamic and sometimes change, so we don't know - exactly what they are at all times. Refer to [rate limiting](#rate-limiting) - for more information. -- Twitter's authentication requirements and frontend API endpoints - change frequently, breaking this library. Fixes for these issues - typically take at least a few days to go out. - -## Installation - -This package requires Node.js v16.0.0 or greater. - -NPM: - -```sh -npm install @the-convocation/twitter-scraper -``` - -Yarn: - -```sh -yarn add @the-convocation/twitter-scraper -``` - -TypeScript types have been bundled with the distribution. - -## Usage - -Most use cases are exactly the same as in -[n0madic/twitter-scraper](https://github.com/n0madic/twitter-scraper). Channel -iterators have been translated into -[AsyncGenerator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncGenerator) -instances, and can be consumed with the corresponding -`for await (const x of y) { ... }` syntax. - -### Browser usage - -This package directly invokes the Twitter API, which does not have permissive -CORS headers. With the default settings, requests will fail unless you disable -CORS checks, which is not advised. Instead, applications must provide a CORS -proxy and configure it in the `Scraper` options. - -Proxies (and other request mutations) can be configured with the request -interceptor transform: - -```ts -const scraper = new Scraper({ - transform: { - request(input: RequestInfo | URL, init?: RequestInit) { - // The arguments here are the same as the parameters to fetch(), and - // are kept as-is for flexibility of both the library and applications. - if (input instanceof URL) { - const proxy = - 'https://corsproxy.io/?' + encodeURIComponent(input.toString()); - return [proxy, init]; - } else if (typeof input === 'string') { - const proxy = 'https://corsproxy.io/?' + encodeURIComponent(input); - return [proxy, init]; - } else { - // Omitting handling for example - throw new Error('Unexpected request input type'); - } - }, - }, -}); -``` - -[corsproxy.io](https://corsproxy.io) is a public CORS proxy that works correctly -with this package. - -The public CORS proxy [corsproxy.org](https://corsproxy.org) _does not work_ at -the time of writing (at least not using their recommended integration on the -front page). - -#### Next.js 13.x example: - -```tsx -'use client'; - -import { Scraper, Tweet } from '@the-convocation/twitter-scraper'; -import { useEffect, useMemo, useState } from 'react'; - -export default function Home() { - const scraper = useMemo( - () => - new Scraper({ - transform: { - request(input: RequestInfo | URL, init?: RequestInit) { - if (input instanceof URL) { - const proxy = - 'https://corsproxy.io/?' + encodeURIComponent(input.toString()); - return [proxy, init]; - } else if (typeof input === 'string') { - const proxy = - 'https://corsproxy.io/?' + encodeURIComponent(input); - return [proxy, init]; - } else { - throw new Error('Unexpected request input type'); - } - }, - }, - }), - [], - ); - const [tweet, setTweet] = useState(null); - - useEffect(() => { - async function getTweet() { - const latestTweet = await scraper.getLatestTweet('twitter'); - if (latestTweet) { - setTweet(latestTweet); - } - } - - getTweet(); - }, [scraper]); - - return ( -
- {tweet?.text} -
- ); -} -``` - -### Edge runtimes - -This package currently uses -[`cross-fetch`](https://www.npmjs.com/package/cross-fetch) as a portable -`fetch`. Edge runtimes such as CloudFlare Workers sometimes have `fetch` -functions that behave differently from the web standard, so you may need to -override the `fetch` function the scraper uses. If so, a custom `fetch` can be -provided in the options: - -```ts -const scraper = new Scraper({ - fetch: fetch, -}); -``` - -Note that this does not change the arguments passed to the function, or the -expected return type. If the custom `fetch` function produces runtime errors -related to incorrect types, be sure to wrap it in a shim (not currently -supported directly by interceptors): - -```ts -const scraper = new Scraper({ - fetch: (input, init) => { - // Transform input and init into your function's expected types... - return fetch(input, init).then((res) => { - // Transform res into a web-compliant response... - return res; - }); - }, -}); -``` - -### Bypassing Cloudflare bot detection - -In some cases, Twitter's authentication endpoints may be protected by Cloudflare's advanced bot detection, resulting in `403 Forbidden` errors during login. This typically happens because standard Node.js TLS fingerprints are detected as non-browser clients. - -To bypass this protection, you can use the optional CycleTLS `fetch` integration to mimic Chrome browser TLS fingerprints: - -**Installation:** - -```sh -npm install cycletls -# or -yarn add cycletls -``` - -**Usage:** - -```ts -import { Scraper } from '@the-convocation/twitter-scraper'; -import { - cycleTLSFetch, - cycleTLSExit, -} from '@the-convocation/twitter-scraper/cycletls'; - -const scraper = new Scraper({ - fetch: cycleTLSFetch, -}); - -// Use the scraper normally -await scraper.login(username, password, email); - -// Important: cleanup CycleTLS resources when done -cycleTLSExit(); -``` - -**Note:** The `/cycletls` entrypoint is Node.js only and will not work in browser environments. It's provided as a separate optional entrypoint to avoid bundling binaries in environments where they cannot run. - -See the [cycletls example](./examples/cycletls/) for a complete working example. - -### Rate limiting - -The Twitter API heavily rate-limits clients, requiring that the scraper has its own -rate-limit handling to behave predictably when rate-limiting occurs. By default, the -scraper uses a rate-limiting strategy that waits for the current rate-limiting period -to expire before resuming requests. - -**This has been known to take a very long time, in some cases (up to 13 minutes).** - -You may want to change how rate-limiting events are handled, potentially by pooling -scrapers logged-in to different accounts (refer to [#116](https://github.com/the-convocation/twitter-scraper/pull/116) for how to do this yourself). The rate-limit handling strategy can be configured by passing a custom -implementation to the `rateLimitStrategy` option in the scraper constructor: - -```ts -import { Scraper, RateLimitStrategy } from '@the-convocation/twitter-scraper'; - -class CustomRateLimitStrategy implements RateLimitStrategy { - async onRateLimit(event: RateLimitEvent): Promise { - // your own logic... - } -} - -const scraper = new Scraper({ - rateLimitStrategy: new CustomRateLimitStrategy(), -}); -``` - -More information on this interface can be found on the [`RateLimitStrategy`](https://the-convocation.github.io/twitter-scraper/interfaces/RateLimitStrategy.html) -page in the documentation. The library provides two pre-written implementations to choose from: - -- `WaitingRateLimitStrategy`: The default, which waits for the limit to expire. -- `ErrorRateLimitStrategy`: A strategy that throws if any rate-limit event occurs. - -## Contributing - -### Setup - -This project currently requires Node 18.x for development and uses Yarn for -package management. -[Corepack](https://nodejs.org/dist/latest-v18.x/docs/api/corepack.html) is -configured for this project, so you don't need to install a particular package -manager version manually. - -> The project supports Node 16.x at runtime, but requires Node 18.x to run its -> build tools. - -Just run `corepack enable` to turn on the shims, then run `yarn` to install the -dependencies. - -#### Basic scripts - -- `yarn build`: Builds the project into the `dist` folder -- `yarn test`: Runs the package tests (see [Testing](#testing) first) - -Run `yarn help` for general `yarn` usage information. - -### Testing - -This package includes unit tests for all major functionality. Given the speed at -which Twitter's private API changes, failing tests are to be expected. - -```sh -yarn test -``` - -Before running tests, you should configure environment variables for -authentication. - -``` -TWITTER_USERNAME= # Account username -TWITTER_PASSWORD= # Account password -TWITTER_EMAIL= # Account email -TWITTER_COOKIES= # JSON-serialized array of cookies of an authenticated session -PROXY_URL= # HTTP(s) proxy for requests (optional) -``` - -### Commit message format - -We use [Conventional Commits](https://www.conventionalcommits.org), and enforce -this with precommit checks. Please refer to the Git history for real examples of -the commit message format. diff --git a/twitter-scraper/examples/cors-proxy/package.json b/twitter-scraper/examples/cors-proxy/package.json deleted file mode 100644 index 95dac97..0000000 --- a/twitter-scraper/examples/cors-proxy/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "private": true, - "packageManager": "yarn@1.22.19", - "scripts": { - "start": "tsx src/index.mts" - }, - "dependencies": { - "@types/cookie": "^0.6.0", - "@types/express": "^4.17.21", - "@types/express-http-proxy": "^1.6.6", - "@types/set-cookie-parser": "^2.4.9", - "cookie": "^0.6.0", - "express": "^4.19.2", - "express-http-proxy": "^2.0.0", - "set-cookie-parser": "^2.6.0", - "tsx": "^4.15.5" - } -} diff --git a/twitter-scraper/examples/cors-proxy/src/index.mts b/twitter-scraper/examples/cors-proxy/src/index.mts deleted file mode 100644 index 75f9811..0000000 --- a/twitter-scraper/examples/cors-proxy/src/index.mts +++ /dev/null @@ -1,79 +0,0 @@ -import proxy from 'express-http-proxy'; -import express from 'express'; -import setCookie from 'set-cookie-parser'; -import libCookie from 'cookie'; - -const handlers: proxy.ProxyOptions = { - proxyReqOptDecorator(proxyReqOpts) { - const originalHeaders = structuredClone(proxyReqOpts.headers); - for (const header in originalHeaders) { - if (['origin', 'referer', 'host'].includes(header)) { - delete proxyReqOpts.headers[header]; - } - } - - console.log(proxyReqOpts); - - return proxyReqOpts; - }, - userResHeaderDecorator(headers, userReq) { - headers['access-control-allow-origin'] = 'http://localhost:5173'; - headers['access-control-allow-credentials'] = 'true'; - - headers['access-control-allow-headers'] = Object.keys(headers) - .concat([ - 'authorization', - 'content-type', - 'x-twitter-client-language', - 'x-twitter-auth-type', - 'x-guest-token', - 'x-twitter-active-user', - 'x-rate-limit-remaining', - 'x-rate-limit-reset', - 'x-csrf-token', - ]) - .join(', '); - - if (headers['location']) { - console.log(`Removing Location header: ${headers['location']}`); - delete headers['location']; - } - - if (headers['set-cookie']) { - const origin = new URL(userReq.headers['origin']); - headers['set-cookie'] = headers['set-cookie'].flatMap((header) => { - const cookie = setCookie.parse(header); - return cookie.map((c) => - libCookie.serialize(c.name, c.value, { - domain: `.${origin.hostname}`, - path: '/', - expires: c.expires, - }), - ); - }); - } - - console.log(headers); - - return headers; - }, - userResDecorator(_proxyRes, proxyResData, userReq, userRes) { - if ( - userReq.method === 'OPTIONS' || - (userReq.statusCode >= 300 && userRes.statusCode < 400) - ) { - // Disable redirects, always return OK on OPTIONS - userRes.statusCode = 200; - } - - return proxyResData; - }, -}; - -const api = express(); -api.use('/', proxy('https://api.x.com', handlers)); -api.listen(5174); - -const web = express(); -web.use('/', proxy('https://x.com', handlers)); -web.listen(5175); diff --git a/twitter-scraper/examples/cors-proxy/tsconfig.json b/twitter-scraper/examples/cors-proxy/tsconfig.json deleted file mode 100644 index 92f8df7..0000000 --- a/twitter-scraper/examples/cors-proxy/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler" - } -} diff --git a/twitter-scraper/examples/cors-proxy/yarn.lock b/twitter-scraper/examples/cors-proxy/yarn.lock deleted file mode 100644 index 2dc38cd..0000000 --- a/twitter-scraper/examples/cors-proxy/yarn.lock +++ /dev/null @@ -1,763 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cookie@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" - integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== - -"@types/express-http-proxy@^1.6.6": - version "1.6.6" - resolved "https://registry.yarnpkg.com/@types/express-http-proxy/-/express-http-proxy-1.6.6.tgz#386c6f4c61a2d26ab8817ba1c2b2aac80e5638c9" - integrity sha512-J8ZqHG76rq1UB716IZ3RCmUhg406pbWxsM3oFCFccl5xlWUPzoR4if6Og/cE4juK8emH0H9quZa5ltn6ZdmQJg== - dependencies: - "@types/express" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.3" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz#e469a13e4186c9e1c0418fb17be8bc8ff1b19a7a" - integrity sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.21": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node@*": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== - dependencies: - undici-types "~5.26.4" - -"@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/set-cookie-parser@^2.4.9": - version "2.4.9" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.9.tgz#f8761e5aab0a855c3992e5d3a0016f5b1226b8ac" - integrity sha512-bCorlULvl0xTdjj4BPUHX4cqs9I+go2TfW/7Do1nnFYWS0CPP429Qr1AY42kiFhCwLpvAkWFr1XIBHd8j6/MCQ== - dependencies: - "@types/node" "*" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0, cookie@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.0.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es6-promise@^4.1.1: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -esbuild@~0.21.4: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -express-http-proxy@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/express-http-proxy/-/express-http-proxy-2.0.0.tgz#c47f4d8b53e8d9c2b9a2f1d158eedf6eb84828a5" - integrity sha512-TXxcPFTWVUMSEmyM6iX2sT/JtmqhqngTq29P+eXTVFdtxZrTmM8THUYK59rUXiln0FfPGvxEpGRnVrgvHksXDw== - dependencies: - debug "^3.0.1" - es6-promise "^4.1.1" - raw-body "^2.3.0" - -express@^4.19.2: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-tsconfig@^4.7.5: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== - dependencies: - resolve-pkg-maps "^1.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2, raw-body@^2.3.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-cookie-parser@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tsx@^4.15.5: - version "4.15.5" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.15.5.tgz#9c1ddb10ed0035c595c9b3e00ae40a3647a94c82" - integrity sha512-iKi8jQ2VBmZ2kU/FkGkL2OSHBHsazsUzsdC/W/RwhKIEsIoZ1alCclZHP5jGfNHEaEWUJFM1GquzCf+4db3b0w== - dependencies: - esbuild "~0.21.4" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== diff --git a/twitter-scraper/examples/cycletls/README.md b/twitter-scraper/examples/cycletls/README.md deleted file mode 100644 index 2573226..0000000 --- a/twitter-scraper/examples/cycletls/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# CycleTLS Cloudflare Bypass Example - -This example demonstrates how to use the `@the-convocation/twitter-scraper/cycletls` entrypoint to bypass Cloudflare bot detection when authenticating with Twitter. - -## Problem - -Twitter's authentication endpoints may be protected by Cloudflare's bot detection, which analyzes TLS fingerprints to detect non-browser clients. Standard Node.js TLS handshakes can trigger `403 Forbidden` errors during login. - -## Solution - -This example uses [CycleTLS](https://github.com/Danny-Dasilva/CycleTLS) to mimic Chrome browser TLS fingerprints, allowing requests to pass through Cloudflare's protection. - -## Installation - -```sh -yarn install -``` - -## Configuration - -Create a `.env` file in this directory with your Twitter credentials: - -``` -TWITTER_USERNAME=your_username -TWITTER_PASSWORD=your_password -TWITTER_EMAIL=your_email -``` - -## Usage - -```sh -yarn start -``` - -## How it works - -The example imports the `cycleTLSFetch` function from the `/cycletls` subpath: - -```ts -import { Scraper } from '@the-convocation/twitter-scraper'; -import { cycleTLSFetch, cycleTLSExit } from '@the-convocation/twitter-scraper/cycletls'; - -const scraper = new Scraper({ - fetch: cycleTLSFetch, -}); -``` - -This replaces the default fetch implementation with one that uses Chrome-like TLS fingerprints, bypassing Cloudflare's detection. diff --git a/twitter-scraper/examples/cycletls/package.json b/twitter-scraper/examples/cycletls/package.json deleted file mode 100644 index 783e066..0000000 --- a/twitter-scraper/examples/cycletls/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "private": true, - "packageManager": "yarn@1.22.19", - "scripts": { - "start": "tsx src/index.ts" - }, - "dependencies": { - "@the-convocation/twitter-scraper": "file:../../", - "cycletls": "^2.0.4", - "dotenv": "^16.3.1", - "tsx": "^4.15.5" - } -} \ No newline at end of file diff --git a/twitter-scraper/examples/cycletls/src/index.ts b/twitter-scraper/examples/cycletls/src/index.ts deleted file mode 100644 index f305caa..0000000 --- a/twitter-scraper/examples/cycletls/src/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import assert from 'node:assert'; -import { Scraper } from '@the-convocation/twitter-scraper'; -import { - cycleTLSFetch, - cycleTLSExit, -} from '@the-convocation/twitter-scraper/cycletls'; -import dotenv from 'dotenv'; - -dotenv.config({ path: '.env.local' }); - -/** - * Example: Using CycleTLS to bypass Cloudflare bot detection - * - * CycleTLS uses golang to mimic Chrome browser TLS fingerprints, which helps - * bypass Cloudflare's advanced bot detection. This is particularly useful - * when you encounter 403 errors during authentication. - * - * Usage: - * 1. Install cycletls: yarn add cycletls - * 2. Pass cycleTLSFetch as the fetch option when creating a Scraper - * 3. Make sure to call cycleTLSExit() when done to cleanup resources - */ - -// Load credentials from the environment -const username = process.env['TWITTER_USERNAME']; -const password = process.env['TWITTER_PASSWORD']; -const email = process.env['TWITTER_EMAIL']; - -assert(username && password && email, 'Missing required environment variables'); - -// Create scraper with CycleTLS fetch -const scraper = new Scraper({ - fetch: cycleTLSFetch, -}); - -const main = async () => { - try { - console.log('Logging in with CycleTLS-powered requests...'); - await scraper.login(username, password, email); - - console.log('Login successful! Fetching a tweet...'); - const tweet = await scraper.getTweet('1585338303800578049'); - - console.log('Tweet details:'); - console.log(`- Text: ${tweet?.text}`); - console.log(`- Likes: ${tweet?.likes}`); - console.log(`- Retweets: ${tweet?.retweets}`); - } catch (error) { - console.error('Error:', error); - } finally { - // Important: cleanup CycleTLS resources - cycleTLSExit(); - } -}; - -main(); diff --git a/twitter-scraper/examples/cycletls/tsconfig.json b/twitter-scraper/examples/cycletls/tsconfig.json deleted file mode 100644 index c587187..0000000 --- a/twitter-scraper/examples/cycletls/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist" - }, - "include": ["src"] -} \ No newline at end of file diff --git a/twitter-scraper/examples/cycletls/yarn.lock b/twitter-scraper/examples/cycletls/yarn.lock deleted file mode 100644 index 87b3a4a..0000000 --- a/twitter-scraper/examples/cycletls/yarn.lock +++ /dev/null @@ -1,589 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/aix-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz#ee6b7163a13528e099ecf562b972f2bcebe0aa97" - integrity sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw== - -"@esbuild/android-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz#115fc76631e82dd06811bfaf2db0d4979c16e2cb" - integrity sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg== - -"@esbuild/android-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz#8d5811912da77f615398611e5bbc1333fe321aa9" - integrity sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w== - -"@esbuild/android-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz#e3e96516b2d50d74105bb92594c473e30ddc16b1" - integrity sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg== - -"@esbuild/darwin-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz#6af6bb1d05887dac515de1b162b59dc71212ed76" - integrity sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA== - -"@esbuild/darwin-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz#99ae82347fbd336fc2d28ffd4f05694e6e5b723d" - integrity sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg== - -"@esbuild/freebsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz#0c6d5558a6322b0bdb17f7025c19bd7d2359437d" - integrity sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg== - -"@esbuild/freebsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz#8c35873fab8c0857a75300a3dcce4324ca0b9844" - integrity sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA== - -"@esbuild/linux-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz#3edc2f87b889a15b4cedaf65f498c2bed7b16b90" - integrity sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ== - -"@esbuild/linux-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz#86501cfdfb3d110176d80c41b27ed4611471cde7" - integrity sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg== - -"@esbuild/linux-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz#e6589877876142537c6864680cd5d26a622b9d97" - integrity sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ== - -"@esbuild/linux-loong64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz#11119e18781f136d8083ea10eb6be73db7532de8" - integrity sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg== - -"@esbuild/linux-mips64el@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz#3052f5436b0c0c67a25658d5fc87f045e7def9e6" - integrity sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA== - -"@esbuild/linux-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz#2f098920ee5be2ce799f35e367b28709925a8744" - integrity sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA== - -"@esbuild/linux-riscv64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz#fa51d7fd0a22a62b51b4b94b405a3198cf7405dd" - integrity sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA== - -"@esbuild/linux-s390x@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz#a27642e36fc282748fdb38954bd3ef4f85791e8a" - integrity sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew== - -"@esbuild/linux-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz#9d9b09c0033d17529570ced6d813f98315dfe4e9" - integrity sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA== - -"@esbuild/netbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz#25c09a659c97e8af19e3f2afd1c9190435802151" - integrity sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A== - -"@esbuild/netbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz#7fa5f6ffc19be3a0f6f5fd32c90df3dc2506937a" - integrity sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig== - -"@esbuild/openbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz#8faa6aa1afca0c6d024398321d6cb1c18e72a1c3" - integrity sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw== - -"@esbuild/openbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz#a42979b016f29559a8453d32440d3c8cd420af5e" - integrity sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw== - -"@esbuild/openharmony-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz#fd87bfeadd7eeb3aa384bbba907459ffa3197cb1" - integrity sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag== - -"@esbuild/sunos-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz#3a18f590e36cb78ae7397976b760b2b8c74407f4" - integrity sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ== - -"@esbuild/win32-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz#e71741a251e3fd971408827a529d2325551f530c" - integrity sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw== - -"@esbuild/win32-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz#c6f010b5d3b943d8901a0c87ea55f93b8b54bf94" - integrity sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw== - -"@esbuild/win32-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz#e4b3e255a1b4aea84f6e1d2ae0b73f826c3785bd" - integrity sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw== - -"@noble/hashes@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== - -"@sinclair/typebox@^0.32.20": - version "0.32.35" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.35.tgz#41c04473509478df9895800018a3d3ae7d40fb3c" - integrity sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA== - -"@the-convocation/twitter-scraper@file:../..": - version "0.19.0" - dependencies: - "@sinclair/typebox" "^0.32.20" - cross-fetch "^4.0.0-alpha.5" - debug "^4.4.1" - headers-polyfill "^3.1.2" - json-stable-stringify "^1.0.2" - otpauth "^9.2.2" - set-cookie-parser "^2.6.0" - tough-cookie "^4.1.2" - tslib "^2.5.2" - -"@types/node@^20.14.0": - version "20.19.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.18.tgz#e21af71b0234f59498888629bc5ce53ec9fd0b9d" - integrity sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg== - dependencies: - undici-types "~6.21.0" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async-generator-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-generator-function/-/async-generator-function-1.0.0.tgz#9bcc76d7fd147171e7ead5d2a2cfc3579c99f28e" - integrity sha512-+NAXNqgCrB95ya4Sr66i1CL2hqLVckAk7xwRYWdcm39/ELQ6YNn1aw5r0bdQtqNZgQpEWzc5yc/igXc7aL5SLA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -cross-fetch@^4.0.0-alpha.5: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" - integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== - dependencies: - node-fetch "^2.7.0" - -cycletls@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/cycletls/-/cycletls-2.0.4.tgz#8ae978f05a43ba9aba2d3c19d89630cc736868ab" - integrity sha512-kyQewFdaKa+IiUd4sR0PmNP0+xXPTx+7eC8LPTmR0/F5Txv40Z7OSI46cQqWM8cgiCwOf6GsB3s9QK9TLizYog== - dependencies: - "@types/node" "^20.14.0" - form-data "^4.0.0" - ws "^8.17.0" - -debug@^4.4.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -dotenv@^16.3.1: - version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -esbuild@~0.25.0: - version "0.25.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.10.tgz#37f5aa5cd14500f141be121c01b096ca83ac34a9" - integrity sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.10" - "@esbuild/android-arm" "0.25.10" - "@esbuild/android-arm64" "0.25.10" - "@esbuild/android-x64" "0.25.10" - "@esbuild/darwin-arm64" "0.25.10" - "@esbuild/darwin-x64" "0.25.10" - "@esbuild/freebsd-arm64" "0.25.10" - "@esbuild/freebsd-x64" "0.25.10" - "@esbuild/linux-arm" "0.25.10" - "@esbuild/linux-arm64" "0.25.10" - "@esbuild/linux-ia32" "0.25.10" - "@esbuild/linux-loong64" "0.25.10" - "@esbuild/linux-mips64el" "0.25.10" - "@esbuild/linux-ppc64" "0.25.10" - "@esbuild/linux-riscv64" "0.25.10" - "@esbuild/linux-s390x" "0.25.10" - "@esbuild/linux-x64" "0.25.10" - "@esbuild/netbsd-arm64" "0.25.10" - "@esbuild/netbsd-x64" "0.25.10" - "@esbuild/openbsd-arm64" "0.25.10" - "@esbuild/openbsd-x64" "0.25.10" - "@esbuild/openharmony-arm64" "0.25.10" - "@esbuild/sunos-x64" "0.25.10" - "@esbuild/win32-arm64" "0.25.10" - "@esbuild/win32-ia32" "0.25.10" - "@esbuild/win32-x64" "0.25.10" - -form-data@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -generator-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.0.tgz#f7d330dccf367a666195948580655946d1a3860a" - integrity sha512-xPypGGincdfyl/AiSGa7GjXLkvld9V7GjZlowup9SHIJnQnHLFiLODCd/DqKOp0PBagbHJ68r1KJI9Mut7m4sA== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.1.tgz#7f03d6cc8df96ae803c35cf23590510f28357173" - integrity sha512-fk1ZVEeOX9hVZ6QzoBNEC55+Ucqg4sTVwrVuigZhuRPESVFpMyXnd3sbXvPOwp7Y9riVyANiqhEuRF0G1aVSeQ== - dependencies: - async-function "^1.0.0" - async-generator-function "^1.0.0" - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - generator-function "^2.0.0" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-tsconfig@^4.7.5: - version "4.10.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" - integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== - dependencies: - resolve-pkg-maps "^1.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -headers-polyfill@^3.1.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -json-stable-stringify@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" - integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -otpauth@^9.2.2: - version "9.4.1" - resolved "https://registry.yarnpkg.com/otpauth/-/otpauth-9.4.1.tgz#6c5d8cf82b441b2f9f2a2a64ba5e00b992f5f31f" - integrity sha512-+iVvys36CFsyXEqfNftQm1II7SW23W1wx9RwNk0Cd97lbvorqAhBDksb/0bYry087QMxjiuBS0wokdoZ0iUeAw== - dependencies: - "@noble/hashes" "1.8.0" - -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - -punycode@^2.1.1, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -set-cookie-parser@^2.6.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" - integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tslib@^2.5.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tsx@^4.15.5: - version "4.20.6" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.20.6.tgz#8fb803fd9c1f70e8ccc93b5d7c5e03c3979ccb2e" - integrity sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg== - dependencies: - esbuild "~0.25.0" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -undici-types@~6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" - integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -ws@^8.17.0: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== diff --git a/twitter-scraper/examples/etc-compat/package.json b/twitter-scraper/examples/etc-compat/package.json deleted file mode 100644 index 536085f..0000000 --- a/twitter-scraper/examples/etc-compat/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "private": true, - "packageManager": "yarn@1.22.19", - "scripts": { - "start": "tsx src/index.mts" - }, - "dependencies": { - "@the-convocation/twitter-scraper": "file:../../", - "tsx": "^4.15.5" - } -} diff --git a/twitter-scraper/examples/etc-compat/src/index.mts b/twitter-scraper/examples/etc-compat/src/index.mts deleted file mode 100644 index a94ede5..0000000 --- a/twitter-scraper/examples/etc-compat/src/index.mts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { - Profile, - Tweet, - Mention, - Photo, - PlaceRaw, - Video, -} from '@the-convocation/twitter-scraper'; - -const a: Profile = null as unknown as Profile; -const b: Tweet = null as unknown as Tweet; -const c: Mention = null as unknown as Mention; -const d: Photo = null as unknown as Photo; -const e: PlaceRaw = null as unknown as PlaceRaw; -const f: Video = null as unknown as Video; diff --git a/twitter-scraper/examples/etc-compat/tsconfig.json b/twitter-scraper/examples/etc-compat/tsconfig.json deleted file mode 100644 index ee8cfcf..0000000 --- a/twitter-scraper/examples/etc-compat/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler" - } - } - \ No newline at end of file diff --git a/twitter-scraper/examples/etc-compat/yarn.lock b/twitter-scraper/examples/etc-compat/yarn.lock deleted file mode 100644 index 0fe973f..0000000 --- a/twitter-scraper/examples/etc-compat/yarn.lock +++ /dev/null @@ -1,409 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@noble/hashes@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@sinclair/typebox@^0.32.20": - version "0.32.35" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.35.tgz#41c04473509478df9895800018a3d3ae7d40fb3c" - integrity sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA== - -"@the-convocation/twitter-scraper@file:../..": - version "0.14.1" - dependencies: - "@sinclair/typebox" "^0.32.20" - cross-fetch "^4.0.0-alpha.5" - headers-polyfill "^3.1.2" - json-stable-stringify "^1.0.2" - otpauth "^9.2.2" - set-cookie-parser "^2.6.0" - tough-cookie "^4.1.2" - tslib "^2.5.2" - -call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -cross-fetch@^4.0.0-alpha.5: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -esbuild@~0.21.5: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-tsconfig@^4.7.5: - version "4.7.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" - integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== - dependencies: - resolve-pkg-maps "^1.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -headers-polyfill@^3.1.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -json-stable-stringify@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -otpauth@^9.2.2: - version "9.3.1" - resolved "https://registry.yarnpkg.com/otpauth/-/otpauth-9.3.1.tgz#4756aff0f0b6e04966fa2b14d865e8f6f4cf4279" - integrity sha512-E6d2tMxPofHNk4sRFp+kqW7vQ+WJGO9VLI2N/W00DnI+ThskU12Qa10kyNSGklrzhN5c+wRUsN4GijVgCU2N9w== - dependencies: - "@noble/hashes" "1.4.0" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -set-cookie-parser@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tslib@^2.5.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -tsx@^4.15.5: - version "4.16.2" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.16.2.tgz#8722be119ae226ef0b4c6210d5ee90f3ba823f19" - integrity sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ== - dependencies: - esbuild "~0.21.5" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" diff --git a/twitter-scraper/examples/node-integration/package.json b/twitter-scraper/examples/node-integration/package.json deleted file mode 100644 index f62dcf1..0000000 --- a/twitter-scraper/examples/node-integration/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "private": true, - "packageManager": "yarn@1.22.19", - "scripts": { - "start:esm": "node src/index.mjs", - "start:cjs": "node src/index.cjs" - }, - "dependencies": { - "@the-convocation/twitter-scraper": "file:../../", - "dotenv": "^17.2.3" - }, - "devDependencies": {} -} diff --git a/twitter-scraper/examples/node-integration/src/index.cjs b/twitter-scraper/examples/node-integration/src/index.cjs deleted file mode 100644 index 68f2900..0000000 --- a/twitter-scraper/examples/node-integration/src/index.cjs +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const assert = require('node:assert'); -const dotenv = require('dotenv'); -const { Scraper } = require('@the-convocation/twitter-scraper'); - -dotenv.config({ path: '../../.env.local' }); - -// Debug logging to show that the Node.js build is being loaded -console.log( - `Loaded @the-convocation/twitter-scraper from ${require.resolve( - '@the-convocation/twitter-scraper', - )}`, -); - -/* - * Simplest scraper initialization. Refer to the README or `src/test-utils.ts` for more - * comprehensive examples. - */ - -// Load credentials from the environment -const username = process.env['TWITTER_USERNAME']; -const password = process.env['TWITTER_PASSWORD']; -const email = process.env['TWITTER_EMAIL']; - -assert(username && password && email); - -const scraper = new Scraper({ - experimental: { - xClientTransactionId: true, - xpff: true, - }, -}); - -const main = async () => { - await scraper.login(username, password, email); - - const tweet = await scraper.getTweet('1585338303800578049'); - - console.log(tweet); -}; - -main(); diff --git a/twitter-scraper/examples/node-integration/src/index.mjs b/twitter-scraper/examples/node-integration/src/index.mjs deleted file mode 100644 index 96c0204..0000000 --- a/twitter-scraper/examples/node-integration/src/index.mjs +++ /dev/null @@ -1,36 +0,0 @@ -import assert from 'node:assert'; -import dotenv from 'dotenv'; -import { Scraper } from '@the-convocation/twitter-scraper'; - -dotenv.config({ path: '../../.env.local' }); - -// Debug logging to show that the Node.js build is being loaded -console.log( - `Loaded @the-convocation/twitter-scraper from ${import.meta.resolve( - '@the-convocation/twitter-scraper', - )}`, -); - -/* - * Simplest scraper initialization. Refer to the README or `src/test-utils.ts` for more - * comprehensive examples. - */ - -// Load credentials from the environment -const username = process.env['TWITTER_USERNAME']; -const password = process.env['TWITTER_PASSWORD']; -const email = process.env['TWITTER_EMAIL']; - -assert(username && password && email); - -const scraper = new Scraper({ - experimental: { - xClientTransactionId: true, - xpff: true, - }, -}); -await scraper.login(username, password, email); - -const tweet = await scraper.getTweet('1585338303800578049'); - -console.log(tweet); diff --git a/twitter-scraper/examples/node-integration/yarn.lock b/twitter-scraper/examples/node-integration/yarn.lock deleted file mode 100644 index e040da6..0000000 --- a/twitter-scraper/examples/node-integration/yarn.lock +++ /dev/null @@ -1,369 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@noble/hashes@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@sinclair/typebox@^0.32.20": - version "0.32.32" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.32.tgz#e12172fe394e7adc868c62354f4f677e3196630e" - integrity sha512-m+A3zFSI87TCtoz6vQCSnd+t/kDKL78JmzhKYkON+7SnHSa+794qraIVpm6ozFGK+5svnVOt1LJ7BUEhGkIvgg== - -"@the-convocation/twitter-scraper@file:../..": - version "0.20.0" - dependencies: - "@sinclair/typebox" "^0.32.20" - cross-fetch "^4.0.0-alpha.5" - debug "^4.4.1" - headers-polyfill "^3.1.2" - json-stable-stringify "^1.0.2" - linkedom "^0.18.12" - otpauth "^9.2.2" - set-cookie-parser "^2.6.0" - tough-cookie "^4.1.2" - tslib "^2.5.2" - x-client-transaction-id "^0.1.9" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -cross-fetch@^4.0.0-alpha.5: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -css-select@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" - integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" - integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -debug@^4.4.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1, domutils@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dotenv@^17.2.3: - version "17.2.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.3.tgz#ad995d6997f639b11065f419a22fabf567cdb9a2" - integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== - -entities@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" - integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -headers-polyfill@^3.1.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== - -html-escaper@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" - integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== - -htmlparser2@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-10.0.0.tgz#77ad249037b66bf8cc99c6e286ef73b83aeb621d" - integrity sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.2.1" - entities "^6.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -json-stable-stringify@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -linkedom@^0.18.12, linkedom@^0.18.9: - version "0.18.12" - resolved "https://registry.yarnpkg.com/linkedom/-/linkedom-0.18.12.tgz#a8b1a1942b567dcb1888093df311055da1349a14" - integrity sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q== - dependencies: - css-select "^5.1.0" - cssom "^0.5.0" - html-escaper "^3.0.3" - htmlparser2 "^10.0.0" - uhyphen "^0.2.0" - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -otpauth@^9.2.2: - version "9.3.1" - resolved "https://registry.yarnpkg.com/otpauth/-/otpauth-9.3.1.tgz#4756aff0f0b6e04966fa2b14d865e8f6f4cf4279" - integrity sha512-E6d2tMxPofHNk4sRFp+kqW7vQ+WJGO9VLI2N/W00DnI+ThskU12Qa10kyNSGklrzhN5c+wRUsN4GijVgCU2N9w== - dependencies: - "@noble/hashes" "1.4.0" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -set-cookie-parser@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tslib@^2.5.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -uhyphen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/uhyphen/-/uhyphen-0.2.0.tgz#8fdf0623314486e020a3c00ee5cc7a12fe722b81" - integrity sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -x-client-transaction-id@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/x-client-transaction-id/-/x-client-transaction-id-0.1.9.tgz#3bb0359268a481f66edf39c0aaa195d73195e849" - integrity sha512-CES4zgkJ0wbfFWm0qgdKphthyb+L7lVHymgOY15v6ivcWSx5p9lp5kzAed+BuqJSP7bS0GbQyJ16ONkRthgsUw== - dependencies: - linkedom "^0.18.9" diff --git a/twitter-scraper/examples/react-integration/.env.example b/twitter-scraper/examples/react-integration/.env.example deleted file mode 100644 index d03a18d..0000000 --- a/twitter-scraper/examples/react-integration/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -# Copy this file to .env.local and update these values if needed. -VITE_TWITTER_USERNAME=$TWITTER_USERNAME -VITE_TWITTER_PASSWORD=$TWITTER_PASSWORD -VITE_TWITTER_EMAIL=$TWITTER_EMAIL diff --git a/twitter-scraper/examples/react-integration/.eslintrc.cjs b/twitter-scraper/examples/react-integration/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/twitter-scraper/examples/react-integration/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/twitter-scraper/examples/react-integration/.gitignore b/twitter-scraper/examples/react-integration/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/twitter-scraper/examples/react-integration/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/twitter-scraper/examples/react-integration/README.md b/twitter-scraper/examples/react-integration/README.md deleted file mode 100644 index 878cf43..0000000 --- a/twitter-scraper/examples/react-integration/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# React Example - -Browser usage example in React. Due to Twitter's CORS headers not allowing external websites from calling their APIs, -this requires using a CORS proxy of some kind. - -## Running - -First, copy `.env.example` to a new `.env.local` file, and update the environment variables to point to your -own account credentials if needed. - -In the `cors-proxy` example folder, run the following command: - -```bash -yarn start -``` - -Then, in this folder, run the following command to start the Vite development server: - -```bash -yarn dev -``` diff --git a/twitter-scraper/examples/react-integration/index.html b/twitter-scraper/examples/react-integration/index.html deleted file mode 100644 index e4b78ea..0000000 --- a/twitter-scraper/examples/react-integration/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/twitter-scraper/examples/react-integration/package.json b/twitter-scraper/examples/react-integration/package.json deleted file mode 100644 index afef954..0000000 --- a/twitter-scraper/examples/react-integration/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "react-integration", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@the-convocation/twitter-scraper": "^0.16.6", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" - } -} diff --git a/twitter-scraper/examples/react-integration/public/vite.svg b/twitter-scraper/examples/react-integration/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/twitter-scraper/examples/react-integration/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/twitter-scraper/examples/react-integration/src/App.css b/twitter-scraper/examples/react-integration/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/twitter-scraper/examples/react-integration/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/twitter-scraper/examples/react-integration/src/App.tsx b/twitter-scraper/examples/react-integration/src/App.tsx deleted file mode 100644 index 68adc4d..0000000 --- a/twitter-scraper/examples/react-integration/src/App.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import { Scraper, Tweet } from '@the-convocation/twitter-scraper'; -import './App.css'; - -function getProxyHost(host: string): string { - if (host.startsWith('api')) { - return 'localhost:5174'; - } else { - return 'localhost:5175'; - } -} - -function FetchTweet() { - const [tweet, setTweet] = useState(null); - - const scraper = useRef( - new Scraper({ - transform: { - request(input: RequestInfo | URL, init?: RequestInit) { - console.log(input, init); - if (input instanceof URL) { - input.protocol = 'http'; - input.host = getProxyHost(input.host); - return [input, init]; - } else if (typeof input === 'string') { - const proxy = new URL(input); - proxy.protocol = 'http'; - proxy.host = getProxyHost(proxy.host); - return [proxy, init]; - } else { - throw new Error('Unexpected request input type'); - } - }, - }, - }), - ); - const loggedIn = useRef(false); - const loggingIn = useRef(false); - - useEffect(() => { - async function getTweet() { - if (loggedIn.current || loggingIn.current) { - return; - } - - loggingIn.current = true; - - try { - if (!loggedIn.current) { - await scraper.current.login( - import.meta.env.VITE_TWITTER_USERNAME, - import.meta.env.VITE_TWITTER_PASSWORD, - import.meta.env.VITE_TWITTER_EMAIL, - ); - loggedIn.current = true; - } - - const latestTweet = await scraper.current.getTweet( - '1585338303800578049', - ); - if (latestTweet) { - setTweet(latestTweet); - } - } finally { - loggingIn.current = false; - } - } - - getTweet(); - }, []); - - return

{tweet?.text}

; -} - -function App() { - return ( - <> -
- -
- - ); -} - -export default App; diff --git a/twitter-scraper/examples/react-integration/src/index.css b/twitter-scraper/examples/react-integration/src/index.css deleted file mode 100644 index 6119ad9..0000000 --- a/twitter-scraper/examples/react-integration/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/twitter-scraper/examples/react-integration/src/main.tsx b/twitter-scraper/examples/react-integration/src/main.tsx deleted file mode 100644 index 9bb419d..0000000 --- a/twitter-scraper/examples/react-integration/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './App.tsx'; -import './index.css'; - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -); diff --git a/twitter-scraper/examples/react-integration/src/vite-env.d.ts b/twitter-scraper/examples/react-integration/src/vite-env.d.ts deleted file mode 100644 index 1a471cf..0000000 --- a/twitter-scraper/examples/react-integration/src/vite-env.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_TWITTER_USERNAME: string; - readonly VITE_TWITTER_PASSWORD: string; - readonly VITE_TWITTER_EMAIL: string; -} - -interface ImportMeta { - readonly env: ImportMetaEnv; -} diff --git a/twitter-scraper/examples/react-integration/tsconfig.json b/twitter-scraper/examples/react-integration/tsconfig.json deleted file mode 100644 index a7fc6fb..0000000 --- a/twitter-scraper/examples/react-integration/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/twitter-scraper/examples/react-integration/tsconfig.node.json b/twitter-scraper/examples/react-integration/tsconfig.node.json deleted file mode 100644 index 97ede7e..0000000 --- a/twitter-scraper/examples/react-integration/tsconfig.node.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true - }, - "include": ["vite.config.ts"] -} diff --git a/twitter-scraper/examples/react-integration/vite.config.ts b/twitter-scraper/examples/react-integration/vite.config.ts deleted file mode 100644 index e214f89..0000000 --- a/twitter-scraper/examples/react-integration/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react-swc'; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}); diff --git a/twitter-scraper/examples/react-integration/yarn.lock b/twitter-scraper/examples/react-integration/yarn.lock deleted file mode 100644 index 7627445..0000000 --- a/twitter-scraper/examples/react-integration/yarn.lock +++ /dev/null @@ -1,1610 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@noble/hashes@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" - integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-x64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz" - integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== - -"@sinclair/typebox@^0.32.20": - version "0.32.35" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.35.tgz#41c04473509478df9895800018a3d3ae7d40fb3c" - integrity sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA== - -"@swc/core-darwin-arm64@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.1.tgz#72d861fb7094b7a0004f4f300e2c5d4ea1549d9e" - integrity sha512-u6GdwOXsOEdNAdSI6nWq6G2BQw5HiSNIZVcBaH1iSvBnxZvWbnIKyDiZKaYnDwTLHLzig2GuUjjE2NaCJPy4jg== - -"@swc/core-darwin-x64@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.1.tgz#8b7070fcee4a4570d0af245c4614ca4e492dfd5b" - integrity sha512-/tXwQibkDNLVbAtr7PUQI0iQjoB708fjhDDDfJ6WILSBVZ3+qs/LHjJ7jHwumEYxVq1XA7Fv2Q7SE/ZSQoWHcQ== - -"@swc/core-linux-arm-gnueabihf@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.1.tgz#bea6d2e75127bbc65a664284f012ffa90c8325d5" - integrity sha512-aDgipxhJTms8iH78emHVutFR2c16LNhO+NTRCdYi+X4PyIn58/DyYTH6VDZ0AeEcS5f132ZFldU5AEgExwihXA== - -"@swc/core-linux-arm64-gnu@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.1.tgz#5c84d804ec23cf54b31c0bc0b4bdd30ec5d43ce8" - integrity sha512-XkJ+eO4zUKG5g458RyhmKPyBGxI0FwfWFgpfIj5eDybxYJ6s4HBT5MoxyBLorB5kMlZ0XoY/usUMobPVY3nL0g== - -"@swc/core-linux-arm64-musl@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.1.tgz#e167a350bec12caebc97304068c3ffbad6c398ce" - integrity sha512-dr6YbLBg/SsNxs1hDqJhxdcrS8dGMlOXJwXIrUvACiA8jAd6S5BxYCaqsCefLYXtaOmu0bbx1FB/evfodqB70Q== - -"@swc/core-linux-x64-gnu@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.1.tgz#fdd4e1d63b3e53d195e2ddcb9cb5ad9f31995796" - integrity sha512-A0b/3V+yFy4LXh3O9umIE7LXPC7NBWdjl6AQYqymSMcMu0EOb1/iygA6s6uWhz9y3e172Hpb9b/CGsuD8Px/bg== - -"@swc/core-linux-x64-musl@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.1.tgz#81a312dd9e62da5f4c48e3cd23b6c6d28a31ac42" - integrity sha512-5dJjlzZXhC87nZZZWbpiDP8kBIO0ibis893F/rtPIQBI5poH+iJuA32EU3wN4/WFHeK4et8z6SGSVghPtWyk4g== - -"@swc/core-win32-arm64-msvc@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.1.tgz#e131f579a69c5d807013e54ccb311e10caa27bcb" - integrity sha512-HBi1ZlwvfcUibLtT3g/lP57FaDPC799AD6InolB2KSgkqyBbZJ9wAXM8/CcH67GLIP0tZ7FqblrJTzGXxetTJQ== - -"@swc/core-win32-ia32-msvc@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.1.tgz#9f3d88cf0e826aa8222a695177a065ed2899eb21" - integrity sha512-AKqHohlWERclexar5y6ux4sQ8yaMejEXNxeKXm7xPhXrp13/1p4/I3E5bPVX/jMnvpm4HpcKSP0ee2WsqmhhPw== - -"@swc/core-win32-x64-msvc@1.6.1": - version "1.6.1" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.1.tgz" - integrity sha512-0dLdTLd+ONve8kgC5T6VQ2Y5G+OZ7y0ujjapnK66wpvCBM6BKYGdT/OKhZKZydrC5gUKaxFN6Y5oOt9JOFUrOQ== - -"@swc/core@^1.5.7": - version "1.6.1" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.6.1.tgz" - integrity sha512-Yz5uj5hNZpS5brLtBvKY0L4s2tBAbQ4TjmW8xF1EC3YLFxQRrUjMP49Zm1kp/KYyYvTkSaG48Ffj2YWLu9nChw== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.8" - optionalDependencies: - "@swc/core-darwin-arm64" "1.6.1" - "@swc/core-darwin-x64" "1.6.1" - "@swc/core-linux-arm-gnueabihf" "1.6.1" - "@swc/core-linux-arm64-gnu" "1.6.1" - "@swc/core-linux-arm64-musl" "1.6.1" - "@swc/core-linux-x64-gnu" "1.6.1" - "@swc/core-linux-x64-musl" "1.6.1" - "@swc/core-win32-arm64-msvc" "1.6.1" - "@swc/core-win32-ia32-msvc" "1.6.1" - "@swc/core-win32-x64-msvc" "1.6.1" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/types@^0.1.8": - version "0.1.8" - resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.8.tgz" - integrity sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA== - dependencies: - "@swc/counter" "^0.1.3" - -"@the-convocation/twitter-scraper@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@the-convocation/twitter-scraper/-/twitter-scraper-0.16.6.tgz#41484ba294eaf43cc8f442234a5f80d5feb83a23" - integrity sha512-+75F/1MVFDJ9UfDwmhEjUbFqbVyLMnBwWNgKCKsshhU+X9Faom0C78RirPLRB088+Gc4aTLcbBS0vyEqz5bqwA== - dependencies: - "@sinclair/typebox" "^0.32.20" - cross-fetch "^4.0.0-alpha.5" - debug "^4.4.1" - headers-polyfill "^3.1.2" - json-stable-stringify "^1.0.2" - otpauth "^9.2.2" - set-cookie-parser "^2.6.0" - tough-cookie "^4.1.2" - tslib "^2.5.2" - -"@types/estree@1.0.5": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18.2.22": - version "18.3.0" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.2.66": - version "18.3.3" - resolved "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@typescript-eslint/eslint-plugin@^7.2.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz" - integrity sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.13.0" - "@typescript-eslint/type-utils" "7.13.0" - "@typescript-eslint/utils" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^7.2.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz" - integrity sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA== - dependencies: - "@typescript-eslint/scope-manager" "7.13.0" - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/typescript-estree" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz" - integrity sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng== - dependencies: - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" - -"@typescript-eslint/type-utils@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz" - integrity sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A== - dependencies: - "@typescript-eslint/typescript-estree" "7.13.0" - "@typescript-eslint/utils" "7.13.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz" - integrity sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA== - -"@typescript-eslint/typescript-estree@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz" - integrity sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw== - dependencies: - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz" - integrity sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.13.0" - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/typescript-estree" "7.13.0" - -"@typescript-eslint/visitor-keys@7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz" - integrity sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw== - dependencies: - "@typescript-eslint/types" "7.13.0" - eslint-visitor-keys "^3.4.3" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vitejs/plugin-react-swc@^3.5.0": - version "3.7.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz" - integrity sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA== - dependencies: - "@swc/core" "^1.5.7" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-fetch@^4.0.0-alpha.5: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" - integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== - dependencies: - node-fetch "^2.7.0" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -debug@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-plugin-react-hooks@^4.6.0: - version "4.6.2" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" - integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== - -eslint-plugin-react-refresh@^0.4.6: - version "0.4.7" - resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz" - integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -headers-polyfill@^3.1.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" - integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -otpauth@^9.2.2: - version "9.4.0" - resolved "https://registry.yarnpkg.com/otpauth/-/otpauth-9.4.0.tgz#ed52538848cc52138e4dcd75cef45412b6175ea1" - integrity sha512-fHIfzIG5RqCkK9cmV8WU+dPQr9/ebR5QOwGZn2JAr1RQF+lmAuLL2YdtdqvmBjNmgJlYk3KZ4a0XokaEhg1Jsw== - dependencies: - "@noble/hashes" "1.7.1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react@^18.2.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^4.13.0: - version "4.18.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semver@^7.6.0: - version "7.6.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -set-cookie-parser@^2.6.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" - integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -tslib@^2.5.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@^5.2.2: - version "5.4.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -vite@^5.2.0: - version "5.3.1" - resolved "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz" - integrity sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.38" - rollup "^4.13.0" - optionalDependencies: - fsevents "~2.3.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/twitter-scraper/jest.config.js b/twitter-scraper/jest.config.js deleted file mode 100644 index 44e0f35..0000000 --- a/twitter-scraper/jest.config.js +++ /dev/null @@ -1,27 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest/presets/default-esm', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - setupFiles: ['dotenv/config', './test-setup.js'], - collectCoverage: true, - collectCoverageFrom: [ - 'src/**/*.{js,ts}', - '!src/index.ts', - '!src/**/*.d.ts', - '!src/**/*.test.{js,ts}', - '!src/**/*.spec.{js,ts}', - ], - coverageDirectory: 'coverage', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, -}; diff --git a/twitter-scraper/package.json b/twitter-scraper/package.json deleted file mode 100644 index 5dcf5e8..0000000 --- a/twitter-scraper/package.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "name": "@the-convocation/twitter-scraper", - "description": "A port of n0madic/twitter-scraper to Node.js.", - "keywords": [ - "x", - "twitter", - "scraper", - "crawler" - ], - "version": "0.21.1", - "main": "dist/default/cjs/index.js", - "types": "./dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "node": { - "import": "./dist/node/esm/index.mjs", - "require": "./dist/node/cjs/index.cjs" - }, - "default": { - "import": "./dist/default/esm/index.mjs", - "require": "./dist/default/cjs/index.js" - } - }, - "./cycletls": { - "types": "./dist/cycletls/index.d.ts", - "import": "./dist/cycletls/esm/index.mjs", - "require": "./dist/cycletls/cjs/index.cjs" - } - }, - "repository": "https://github.com/the-convocation/twitter-scraper.git", - "author": "karashiiro <49822414+karashiiro@users.noreply.github.com>", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "packageManager": "yarn@1.22.19", - "scripts": { - "build": "rimraf dist && rollup -c", - "commit": "cz", - "docs:generate": "typedoc --options typedoc.json", - "docs:deploy": "yarn docs:generate && gh-pages -d docs", - "format": "prettier --write src/**/*.ts examples/**/*.{ts,js,tsx}", - "test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --runInBand --forceExit" - }, - "dependencies": { - "@sinclair/typebox": "^0.32.20", - "cross-fetch": "^4.0.0-alpha.5", - "debug": "^4.4.1", - "headers-polyfill": "^3.1.2", - "json-stable-stringify": "^1.0.2", - "linkedom": "^0.18.12", - "otpauth": "^9.2.2", - "set-cookie-parser": "^2.6.0", - "tough-cookie": "^4.1.2", - "tslib": "^2.5.2", - "x-client-transaction-id": "^0.1.9" - }, - "peerDependencies": { - "cycletls": "^2.0.5" - }, - "peerDependenciesMeta": { - "cycletls": { - "optional": true - } - }, - "devDependencies": { - "@commitlint/cli": "^17.6.3", - "@commitlint/config-conventional": "^17.6.3", - "@tsconfig/node16": "^16.1.0", - "@types/debug": "^4.1.12", - "@types/jest": "^29.5.1", - "@types/json-stable-stringify": "^1.0.34", - "@types/set-cookie-parser": "^2.4.2", - "@types/tough-cookie": "^4.0.2", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", - "cycletls": "^2.0.4", - "cz-conventional-changelog": "^3.3.0", - "dotenv": "^16.3.1", - "esbuild": "^0.21.5", - "eslint": "^8.41.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^4.2.1", - "gh-pages": "^5.0.0", - "https-proxy-agent": "^7.0.2", - "husky": "^8.0.3", - "jest": "^29.5.0", - "lint-staged": "^13.2.2", - "prettier": "^2.8.8", - "rimraf": "^5.0.7", - "rollup": "^4.18.0", - "rollup-plugin-dts": "^6.1.1", - "rollup-plugin-esbuild": "^6.1.1", - "ts-jest": "^29.1.0", - "typedoc": "^0.27.6", - "typescript": "^5.0.4" - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } - }, - "lint-staged": { - "*.{js,ts}": [ - "eslint --cache --fix", - "prettier --write" - ] - } -} diff --git a/twitter-scraper/rollup.config.mjs b/twitter-scraper/rollup.config.mjs deleted file mode 100644 index 6c9fd3a..0000000 --- a/twitter-scraper/rollup.config.mjs +++ /dev/null @@ -1,92 +0,0 @@ -import dts from 'rollup-plugin-dts'; -import esbuild from 'rollup-plugin-esbuild'; - -export default [ - { - input: 'src/_module.ts', - plugins: [ - esbuild({ - define: { - PLATFORM_NODE: 'false', - }, - }), - ], - output: [ - { - file: 'dist/default/cjs/index.js', - format: 'cjs', - sourcemap: true, - }, - { - file: 'dist/default/esm/index.mjs', - format: 'es', - sourcemap: true, - }, - ], - }, - { - input: 'src/_module.ts', - plugins: [ - esbuild({ - define: { - PLATFORM_NODE: 'true', - }, - }), - ], - output: [ - { - file: 'dist/node/cjs/index.cjs', - format: 'cjs', - sourcemap: true, - inlineDynamicImports: true, - }, - { - file: 'dist/node/esm/index.mjs', - format: 'es', - sourcemap: true, - inlineDynamicImports: true, - }, - ], - }, - { - input: 'src/_module.ts', - plugins: [dts()], - output: { - file: 'dist/types/index.d.ts', - format: 'es', - }, - }, - // CycleTLS build (Node-only) - { - input: 'src/_cycletls.ts', - external: ['cycletls'], - plugins: [ - esbuild({ - define: { - PLATFORM_NODE: 'true', - }, - }), - ], - output: [ - { - file: 'dist/cycletls/cjs/index.cjs', - format: 'cjs', - sourcemap: true, - }, - { - file: 'dist/cycletls/esm/index.mjs', - format: 'es', - sourcemap: true, - }, - ], - }, - { - input: 'src/_cycletls.ts', - external: ['cycletls'], - plugins: [dts()], - output: { - file: 'dist/cycletls/index.d.ts', - format: 'es', - }, - }, -]; diff --git a/twitter-scraper/src/_cycletls.ts b/twitter-scraper/src/_cycletls.ts deleted file mode 100644 index 0a1811f..0000000 --- a/twitter-scraper/src/_cycletls.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * CycleTLS fetch wrapper for bypassing Cloudflare bot detection - * - * This is a separate entrypoint to avoid bundling cycletls in environments - * where it cannot run (like browsers). Import from '@the-convocation/twitter-scraper/cycletls' - */ -export { cycleTLSFetch, cycleTLSExit } from './cycletls-fetch'; diff --git a/twitter-scraper/src/_module.ts b/twitter-scraper/src/_module.ts deleted file mode 100644 index f86eaf8..0000000 --- a/twitter-scraper/src/_module.ts +++ /dev/null @@ -1,58 +0,0 @@ -export type { FetchTransformOptions } from './api'; -export type { FetchParameters } from './api-types'; -export type { - TwitterUserAuthCredentials, - TwitterUserAuthFlowInitRequest, - TwitterUserAuthFlowSubtaskRequest, - TwitterUserAuthFlowRequest, - TwitterUserAuthFlowResponse, - FlowSubtaskHandler, - FlowSubtaskHandlerApi, - FlowTokenResult, - FlowTokenResultError, - FlowTokenResultSuccess, -} from './auth-user'; -export type { - DmInboxResponse, - DmInbox, - DmConversationResponse, - DmConversationTimeline, - DmConversation, - DmStatus, - DmParticipant, - DmMessageEntry, - DmMessage, - DmMessageData, - DmReaction, - DmMessageEntities, - DmMessageUrl, - DmWelcomeMessage, - DmInboxTimelines, - DmTimelineState, -} from './direct-messages'; -export { - ApiError, - AuthenticationError, - type TwitterApiErrorRaw, - type TwitterApiErrorExtensions, - type TwitterApiErrorPosition, - type TwitterApiErrorTraceInfo, -} from './errors'; -export type { Profile } from './profile'; -export { - type RateLimitEvent, - type RateLimitStrategy, - WaitingRateLimitStrategy, - ErrorRateLimitStrategy, -} from './rate-limit'; -export { Scraper, type ScraperOptions } from './scraper'; -export { SearchMode } from './search'; -export type { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1'; -export type { - Tweet, - TweetQuery, - Mention, - Photo, - PlaceRaw, - Video, -} from './tweets'; diff --git a/twitter-scraper/src/api-data.ts b/twitter-scraper/src/api-data.ts deleted file mode 100644 index d35ec62..0000000 --- a/twitter-scraper/src/api-data.ts +++ /dev/null @@ -1,179 +0,0 @@ -import stringify from 'json-stable-stringify'; - -/** - * Examples of requests to API endpoints. These are parsed at runtime and used - * as templates for requests to a particular endpoint. Please ensure these do - * not contain any information that you do not want published to NPM. - */ -const endpoints = { - UserTweets: - 'https://x.com/i/api/graphql/oRJs8SLCRNRbQzuZG93_oA/UserTweets?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D', - UserTweetsAndReplies: - 'https://x.com/i/api/graphql/Hk4KlJ-ONjlJsucqR55P7g/UserTweetsAndReplies?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D', - UserLikedTweets: - 'https://x.com/i/api/graphql/XHTMjDbiTGLQ9cP1em-aqQ/Likes?variables=%7B%22userId%22%3A%222244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D', - UserByScreenName: - 'https://api.x.com/graphql/-oaLodhGbbnzJBACb1kk2Q/UserByScreenName?variables=%7B%22screen_name%22%3A%22geminiapp%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withPayments%22%3Afalse%2C%22withAuxiliaryUserLabels%22%3Atrue%7D', - TweetDetail: - 'https://x.com/i/api/graphql/YVyS4SfwYW7Uw5qwy0mQCA/TweetDetail?variables=%7B%22focalTweetId%22%3A%221985465713096794294%22%2C%22referrer%22%3A%22profile%22%2C%22with_rux_injections%22%3Afalse%2C%22rankingMode%22%3A%22Relevance%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D', - TweetResultByRestId: - 'https://api.x.com/graphql/tCVRZ3WCvoj0BVO7BKnL-Q/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221985465713096794294%22%2C%22withCommunity%22%3Afalse%2C%22includePromotedContent%22%3Afalse%2C%22withVoice%22%3Afalse%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Afalse%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22payments_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D', - ListTweets: - 'https://x.com/i/api/graphql/S1Sm3_mNJwa-fnY9htcaAQ/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Afalse%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Afalse%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D', - SearchTimeline: - 'https://x.com/i/api/graphql/nK1dw4oV3k4w5TdtcAdSww/SearchTimeline?variables=%7B%22rawQuery%22%3A%22twitter%22%2C%22count%22%3A20%2C%22querySource%22%3A%22typed_query%22%2C%22product%22%3A%22Top%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22rweb_lists_timeline_redesign_enabled%22%3Atrue%7D', - Followers: - 'https://x.com/i/api/graphql/SCu9fVIlCUm-BM8-tL5pkQ/Followers?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D', - Following: - 'https://x.com/i/api/graphql/S5xUN9s2v4xk50KWGGvyvQ/Following?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D', -} as const; - -export interface EndpointFieldInfo { - /** - * Request variables, used for providing arguments such as user IDs or result counts. - */ - variables: Record; - - /** - * Request features, used for encoding feature flags into the request. These may either be - * boolean values or numerically-encoded booleans (1 or 0). It is possible this may change - * to include other representations of booleans as Twitter's backend evolves. - */ - features: Record; - - /** - * Request field toggles, used for limiting how returned fields are represented. This is - * rarely used. - */ - fieldToggles: Record; -} - -type SomePartial = Omit & Partial>; - -type EndpointVersion = string; -type EndpointName = string; -type EncodedVariables = string; -type EncodedFeatures = string; -type EncodedFieldToggles = string; - -// TODO: Set up field-level Intellisense for the QraphQL parameters in these? -type BaseUrl = - | 'https://twitter.com/i/api/graphql' - | 'https://x.com/i/api/graphql' - | 'https://api.x.com/graphql'; -type EndpointFields = - EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}&fieldToggles=${EncodedFieldToggles}` - ? EndpointFieldInfo - : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}` - ? SomePartial - : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}` - ? SomePartial - : Partial; - -export type ApiRequestInfo = EndpointFields & { - /** - * The URL, without any GraphQL query parameters. - */ - url: string; - - /** - * Converts the request back into a URL to be sent to the Twitter API. - */ - toRequestUrl(): string; -}; - -/** Wrapper class for API request information. */ -class ApiRequest { - url: string; - variables?: Record | undefined; - features?: Record | undefined; - fieldToggles?: Record | undefined; - - constructor(info: Omit, 'toRequestUrl'>) { - this.url = info.url; - this.variables = info.variables; - this.features = info.features; - this.fieldToggles = info.fieldToggles; - } - - toRequestUrl(): string { - const params = new URLSearchParams(); - - // Only include query parameters with values - if (this.variables) { - // Stringify with the query keys in sorted order like the Go package - const variablesStr = stringify(this.variables); - if (variablesStr) params.set('variables', variablesStr); - } - - if (this.features) { - const featuresStr = stringify(this.features); - if (featuresStr) params.set('features', featuresStr); - } - - if (this.fieldToggles) { - const fieldTogglesStr = stringify(this.fieldToggles); - if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr); - } - - return `${this.url}?${params.toString()}`; - } -} - -/** - * Parses information from a Twitter API endpoint using an example request - * URL against that endpoint. This can be used to extract GraphQL parameters - * in order to easily reuse and/or override them later. - * @param example An example of the endpoint to analyze. - * @returns The parsed endpoint information. - */ -function parseEndpointExample< - Endpoints, - Endpoint extends string & keyof Endpoints, ->(example: Endpoint): ApiRequestInfo { - const { protocol, host, pathname, searchParams: query } = new URL(example); - - const base = `${protocol}//${host}${pathname}`; - const variables = query.get('variables'); - const features = query.get('features'); - const fieldToggles = query.get('fieldToggles'); - - return new ApiRequest({ - url: base, - variables: variables ? JSON.parse(variables) : undefined, - features: features ? JSON.parse(features) : undefined, - fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined, - } as Omit< - ApiRequestInfo, - 'toRequestUrl' - >) as ApiRequestInfo; -} - -type ApiRequestFactory = { - [Endpoint in keyof Endpoints as `create${string & - Endpoint}Request`]: () => ApiRequestInfo; -}; - -function createApiRequestFactory>( - endpoints: Endpoints, -): ApiRequestFactory { - type UntypedApiRequestFactory = ApiRequestFactory>; - - return Object.entries(endpoints) - .map(([endpointName, endpointExample]) => { - // Create a partial factory for only one endpoint - return { - [`create${endpointName}Request`]: () => { - // Create a new instance on each invocation so that we can safely - // mutate requests before sending them off - return parseEndpointExample(endpointExample); - }, - }; - }) - .reduce((agg, next) => { - // Merge all of our factories into one that includes every endpoint - return Object.assign(agg, next); - }) as ApiRequestFactory; -} - -export const apiRequestFactory = createApiRequestFactory(endpoints); diff --git a/twitter-scraper/src/api-types.ts b/twitter-scraper/src/api-types.ts deleted file mode 100644 index 373d05d..0000000 --- a/twitter-scraper/src/api-types.ts +++ /dev/null @@ -1,3 +0,0 @@ -// For some reason using Parameters reduces the request transform function to -// `(url: string) => string` in tests. -export type FetchParameters = [input: RequestInfo | URL, init?: RequestInit]; diff --git a/twitter-scraper/src/api.ts b/twitter-scraper/src/api.ts deleted file mode 100644 index 018d4ff..0000000 --- a/twitter-scraper/src/api.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { FetchParameters } from './api-types'; -import { TwitterAuth, TwitterGuestAuth } from './auth'; -import { ApiError } from './errors'; -import { Platform, PlatformExtensions } from './platform'; -import { updateCookieJar } from './requests'; -import { Headers } from 'headers-polyfill'; -import debug from 'debug'; -import { generateTransactionId } from './xctxid'; - -const log = debug('twitter-scraper:api'); - -export interface FetchTransformOptions { - /** - * Transforms the request options before a request is made. This executes after all of the default - * parameters have been configured, and is stateless. It is safe to return new request options - * objects. - * @param args The request options. - * @returns The transformed request options. - */ - request: ( - ...args: FetchParameters - ) => FetchParameters | Promise; - - /** - * Transforms the response after a request completes. This executes immediately after the request - * completes, and is stateless. It is safe to return a new response object. - * @param response The response object. - * @returns The transformed response object. - */ - response: (response: Response) => Response | Promise; -} - -export const bearerToken = - 'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF'; - -export const bearerToken2 = - 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA'; - -export async function jitter(maxMs: number): Promise { - const jitter = Math.random() * maxMs; - await new Promise((resolve) => setTimeout(resolve, jitter)); -} - -/** - * An API result container. - */ -export type RequestApiResult = - | { success: true; value: T } - | { success: false; err: Error }; - -/** - * Used internally to send HTTP requests to the Twitter API. - * @internal - * @param url - The URL to send the request to. - * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request. - * @param method - The HTTP method used when sending this request. - * @param platform - The platform extensions to use. - * @param headers - The headers to include in the request. - * @param bearerTokenOverride - Optional bearer token to use instead of the default one. - */ -export async function requestApi( - url: string, - auth: TwitterAuth, - method: 'GET' | 'POST' = 'GET', - platform: PlatformExtensions = new Platform(), - headers: Headers = new Headers(), - bearerTokenOverride?: string, -): Promise> { - log(`Making ${method} request to ${url}`); - - await auth.installTo(headers, url, bearerTokenOverride); - await platform.randomizeCiphers(); - - if ( - auth instanceof TwitterGuestAuth && - auth.options?.experimental?.xClientTransactionId - ) { - const transactionId = await generateTransactionId( - url, - auth.fetch.bind(auth), - method, - ); - headers.set('x-client-transaction-id', transactionId); - } - - let res: Response; - do { - const fetchParameters: FetchParameters = [ - url, - { - method, - headers, - credentials: 'include', - }, - ]; - - try { - res = await auth.fetch(...fetchParameters); - } catch (err) { - if (!(err instanceof Error)) { - throw err; - } - - return { - success: false, - err: new Error('Failed to perform request.'), - }; - } - - await updateCookieJar(auth.cookieJar(), res.headers); - - if (res.status === 429) { - log('Rate limit hit, waiting for retry...'); - await auth.onRateLimit({ - fetchParameters: fetchParameters, - response: res, - }); - } - } while (res.status === 429); - - if (!res.ok) { - return { - success: false, - err: await ApiError.fromResponse(res), - }; - } - - const value: T = await flexParseJson(res); - if (res.headers.get('x-rate-limit-incoming') == '0') { - auth.deleteToken(); - return { success: true, value }; - } else { - return { success: true, value }; - } -} - -export async function flexParseJson(res: Response): Promise { - try { - return await res.json(); - } catch { - log('Failed to parse response as JSON, trying text parse...'); - const text = await res.text(); - log('Response text:', text); - return JSON.parse(text); - } -} - -/** @internal */ -export function addApiFeatures(o: object) { - return { - ...o, - rweb_lists_timeline_redesign_enabled: true, - responsive_web_graphql_exclude_directive_enabled: true, - verified_phone_label_enabled: false, - creator_subscriptions_tweet_preview_api_enabled: true, - responsive_web_graphql_timeline_navigation_enabled: true, - responsive_web_graphql_skip_user_profile_image_extensions_enabled: false, - tweetypie_unmention_optimization_enabled: true, - responsive_web_edit_tweet_api_enabled: true, - graphql_is_translatable_rweb_tweet_is_translatable_enabled: true, - view_counts_everywhere_api_enabled: true, - longform_notetweets_consumption_enabled: true, - tweet_awards_web_tipping_enabled: false, - freedom_of_speech_not_reach_fetch_enabled: true, - standardized_nudges_misinfo: true, - longform_notetweets_rich_text_read_enabled: true, - responsive_web_enhance_cards_enabled: false, - subscriptions_verification_info_enabled: true, - subscriptions_verification_info_reason_enabled: true, - subscriptions_verification_info_verified_since_enabled: true, - super_follow_badge_privacy_enabled: false, - super_follow_exclusive_tweet_notifications_enabled: false, - super_follow_tweet_api_enabled: false, - super_follow_user_api_enabled: false, - android_graphql_skip_api_media_color_palette: false, - creator_subscriptions_subscription_count_enabled: false, - blue_business_profile_image_shape_enabled: false, - unified_cards_ad_metadata_container_dynamic_card_content_query_enabled: - false, - }; -} - -export function addApiParams( - params: URLSearchParams, - includeTweetReplies: boolean, -): URLSearchParams { - params.set('include_profile_interstitial_type', '1'); - params.set('include_blocking', '1'); - params.set('include_blocked_by', '1'); - params.set('include_followed_by', '1'); - params.set('include_want_retweets', '1'); - params.set('include_mute_edge', '1'); - params.set('include_can_dm', '1'); - params.set('include_can_media_tag', '1'); - params.set('include_ext_has_nft_avatar', '1'); - params.set('include_ext_is_blue_verified', '1'); - params.set('include_ext_verified_type', '1'); - params.set('skip_status', '1'); - params.set('cards_platform', 'Web-12'); - params.set('include_cards', '1'); - params.set('include_ext_alt_text', 'true'); - params.set('include_ext_limited_action_results', 'false'); - params.set('include_quote_count', 'true'); - params.set('include_reply_count', '1'); - params.set('tweet_mode', 'extended'); - params.set('include_ext_collab_control', 'true'); - params.set('include_ext_views', 'true'); - params.set('include_entities', 'true'); - params.set('include_user_entities', 'true'); - params.set('include_ext_media_color', 'true'); - params.set('include_ext_media_availability', 'true'); - params.set('include_ext_sensitive_media_warning', 'true'); - params.set('include_ext_trusted_friends_metadata', 'true'); - params.set('send_error_codes', 'true'); - params.set('simple_quoted_tweet', 'true'); - params.set('include_tweet_replies', `${includeTweetReplies}`); - params.set( - 'ext', - 'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe', - ); - return params; -} diff --git a/twitter-scraper/src/auth-user.test.ts b/twitter-scraper/src/auth-user.test.ts deleted file mode 100644 index 7aa7eb8..0000000 --- a/twitter-scraper/src/auth-user.test.ts +++ /dev/null @@ -1,397 +0,0 @@ -import { TwitterUserAuth } from './auth-user'; -import { bearerToken } from './api'; -import { jest } from '@jest/globals'; - -describe('TwitterUserAuth', () => { - const mockFetch = jest.fn(); - let auth: TwitterUserAuth; - - // Common login flows - const loginFlows = { - standard: [ - 'LoginJsInstrumentationSubtask', - 'LoginEnterUserIdentifierSSO', - 'LoginEnterPassword', - 'LoginSuccessSubtask', - ], - twoFactor: [ - 'LoginJsInstrumentationSubtask', - 'LoginEnterUserIdentifierSSO', - 'LoginEnterPassword', - 'LoginTwoFactorAuthChallenge', - 'LoginSuccessSubtask', - ], - }; - - // Common mock responses - const mockResponses = { - xcomHomepage: { - ok: true, - status: 200, - text: () => - Promise.resolve( - '', - ), - headers: new Headers(), - } as Response, - guestToken: { - ok: true, - json: () => Promise.resolve({ guest_token: 'test-guest-token' }), - text: () => - Promise.resolve(JSON.stringify({ guest_token: 'test-guest-token' })), - headers: new Headers(), - } as Response, - success: (token: string): Response => - ({ - ok: true, - json: () => Promise.resolve({ flow_token: token }), - text: () => Promise.resolve(JSON.stringify({ flow_token: token })), - headers: new Headers(), - } as Response), - subtask: (token: string, subtaskId: string): Response => - ({ - ok: true, - json: () => - Promise.resolve({ - flow_token: token, - subtasks: [{ subtask_id: subtaskId }], - }), - text: () => - Promise.resolve( - JSON.stringify({ - flow_token: token, - subtasks: [{ subtask_id: subtaskId }], - }), - ), - headers: new Headers(), - } as Response), - error: (code: number, message: string): Response => - ({ - ok: true, - json: () => - Promise.resolve({ - flow_token: 'error-token', - errors: [{ code, message }], - }), - text: () => - Promise.resolve( - JSON.stringify({ - flow_token: 'error-token', - errors: [{ code, message }], - }), - ), - headers: new Headers(), - } as Response), - httpError: ( - status: number, - statusText: string, - message: string, - ): Response => - ({ - ok: false, - status, - statusText, - headers: new Headers(), - text: () => Promise.resolve(message), - json: () => Promise.resolve({ errors: [{ code: status, message }] }), - } as Response), - }; - - // Test utilities - const setupAuth = () => { - mockFetch.mockReset(); - return new TwitterUserAuth(bearerToken, { - fetch: mockFetch, - transform: {}, - rateLimitStrategy: { - onRateLimit: async () => { - throw new Error('Rate limit hit'); - }, - }, - }); - }; - - const mockLoginFlow = (subtasks: string[]) => { - // Guest token fetch - mockFetch.mockResolvedValueOnce(mockResponses.guestToken); - - // initLogin: task endpoint returns first subtask - mockFetch.mockResolvedValueOnce( - mockResponses.subtask('token1', subtasks[0]), - ); - - // Each subsequent subtask handler: task endpoint - for (let i = 1; i < subtasks.length; i++) { - mockFetch.mockResolvedValueOnce( - mockResponses.subtask(`token${i + 1}`, subtasks[i]), - ); - } - }; - - const setupAuthenticatedState = async () => { - // Use a minimal login flow that goes straight to success - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'LoginSuccessSubtask'), - ); - - await auth.login('testuser', 'testpass'); - mockFetch.mockClear(); - }; - - beforeEach(() => { - auth = setupAuth(); - }); - - describe('login', () => { - it('should handle successful login flow', async () => { - mockLoginFlow(loginFlows.standard); - await auth.login('testuser', 'testpass'); - - // Guest token + 4 subtask calls = 5 total - expect(mockFetch).toHaveBeenCalledTimes(5); - expect(mockFetch.mock.calls[0][0]).toBe( - 'https://api.x.com/1.1/guest/activate.json', - ); - expect(mockFetch.mock.calls[1][0]).toBe( - 'https://api.x.com/1.1/onboarding/task.json?flow_name=login', - ); - }); - - it('should handle login failure', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - .mockResolvedValueOnce(mockResponses.error(99, 'Invalid credentials')); - - await expect(auth.login('testuser', 'wrongpass')).rejects.toThrow( - 'Authentication error (99): Invalid credentials', - ); - }); - - it('should handle DenyLoginSubtask flow', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'DenyLoginSubtask'), - ); - - await expect(auth.login('testuser', 'wrongpass')).rejects.toThrow( - 'Authentication error: DenyLoginSubtask', - ); - }); - - it('should handle 2FA challenge', async () => { - mockLoginFlow(loginFlows.twoFactor); - await auth.login('testuser', 'testpass', undefined, 'JBSWY3DPEHPK3PXP'); - // Guest token + 5 subtask calls = 6 total - expect(mockFetch).toHaveBeenCalledTimes(6); - }); - - it('should retry 2FA challenge after failure', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'LoginTwoFactorAuthChallenge'), - ) - // First 2FA attempt fails - returns same subtask - .mockResolvedValueOnce( - mockResponses.subtask('token2', 'LoginTwoFactorAuthChallenge'), - ) - // Second 2FA attempt succeeds - .mockResolvedValueOnce( - mockResponses.subtask('token3', 'LoginSuccessSubtask'), - ); - - await auth.login('testuser', 'testpass', undefined, 'JBSWY3DPEHPK3PXP'); - expect(mockFetch).toHaveBeenCalledTimes(4); - }); - - it('should handle all 2FA attempts failing', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin returns 2FA challenge - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'LoginTwoFactorAuthChallenge'), - ) - // First 2FA attempt fails - .mockResolvedValueOnce(mockResponses.error(236, 'Bad 2FA code')) - // Second 2FA attempt fails - .mockResolvedValueOnce(mockResponses.error(236, 'Bad 2FA code')) - // Third 2FA attempt fails - .mockResolvedValueOnce(mockResponses.error(236, 'Bad 2FA code')); - - await expect( - auth.login('testuser', 'testpass', undefined, 'JBSWY3DPEHPK3PXP'), - ).rejects.toThrow('Bad 2FA code'); - }); - - it('should handle missing TOTP secret during 2FA challenge', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin returns 2FA challenge - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'LoginTwoFactorAuthChallenge'), - ); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow( - 'Two-factor authentication is required but no secret was provided', - ); - }); - - it('should handle invalid TOTP secret during 2FA challenge', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin returns 2FA challenge - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'LoginTwoFactorAuthChallenge'), - ); - - await expect( - auth.login('testuser', 'testpass', undefined, 'INVALID_SECRET'), - ).rejects.toThrow(); - }); - - it('should handle invalid subtask type', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - .mockResolvedValueOnce( - mockResponses.subtask('token1', 'UnknownSubtask'), - ); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow( - 'Unknown subtask UnknownSubtask', - ); - }); - - it('should handle network errors', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin fails on task endpoint - .mockRejectedValueOnce(new Error('Network error')); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow( - 'Network error', - ); - }); - - it('should handle invalid response format', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - .mockResolvedValueOnce({ - ok: true, - json: () => Promise.resolve({}), - text: () => Promise.resolve('{}'), - headers: new Headers(), - } as Response); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow(); - }); - - it('should handle rate limit errors', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin gets rate limited - .mockResolvedValueOnce( - mockResponses.httpError(429, 'Too Many Requests', 'Rate limit hit'), - ); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow( - 'Rate limit hit', - ); - }); - - it('should handle unauthorized errors', async () => { - mockFetch - .mockResolvedValueOnce(mockResponses.guestToken) - // initLogin gets 401 error - .mockResolvedValueOnce( - mockResponses.httpError( - 401, - 'Unauthorized', - 'Could not authenticate you', - ), - ); - - await expect(auth.login('testuser', 'testpass')).rejects.toThrow( - 'Could not authenticate you', - ); - }); - }); - - describe('logout', () => { - it('should handle successful logout', async () => { - await setupAuthenticatedState(); - mockFetch.mockResolvedValueOnce(mockResponses.success('logout')); - - await auth.logout(); - - expect(mockFetch).toHaveBeenCalledWith( - 'https://api.x.com/1.1/account/logout.json', - expect.objectContaining({ - method: 'POST', - }), - ); - - expect(auth.hasToken()).toBe(false); - expect(await auth.cookieJar().getCookies('https://x.com')).toHaveLength( - 0, - ); - }); - - it('should clear state on network error during logout', async () => { - mockFetch.mockRejectedValueOnce(new Error('Network error')); - await auth.logout(); - - expect(auth.hasToken()).toBe(false); - expect(await auth.cookieJar().getCookies('https://x.com')).toHaveLength( - 0, - ); - }); - - it('should clear state on failed logout', async () => { - mockFetch.mockResolvedValueOnce( - mockResponses.httpError(400, 'Bad Request', 'User not found'), - ); - - await auth.logout(); - - expect(auth.hasToken()).toBe(false); - expect(await auth.cookieJar().getCookies('https://x.com')).toHaveLength( - 0, - ); - }); - }); - - describe('isLoggedIn', () => { - it('should return true when ct0 cookie is present', async () => { - // Set up a ct0 cookie in the jar - await auth.cookieJar().setCookie('ct0=test_token', 'https://x.com'); - const result = await auth.isLoggedIn(); - expect(result).toBe(true); - }); - - it('should return false when ct0 cookie is not present', async () => { - const result = await auth.isLoggedIn(); - expect(result).toBe(false); - }); - - it('should return false after logout', async () => { - // Set up authenticated state with login - await setupAuthenticatedState(); - - // Manually set ct0 cookie to ensure isLoggedIn returns true - await auth.cookieJar().setCookie('ct0=test_token', 'https://x.com'); - expect(await auth.isLoggedIn()).toBe(true); - - // Logout should clear cookies - mockFetch.mockResolvedValueOnce(mockResponses.success('logout')); - await auth.logout(); - - // Now should be logged out - const result = await auth.isLoggedIn(); - expect(result).toBe(false); - }); - }); -}); diff --git a/twitter-scraper/src/auth-user.ts b/twitter-scraper/src/auth-user.ts deleted file mode 100644 index 0da9fa9..0000000 --- a/twitter-scraper/src/auth-user.ts +++ /dev/null @@ -1,706 +0,0 @@ -import { TwitterAuthOptions, TwitterGuestAuth } from './auth'; -import { flexParseJson, requestApi } from './api'; -import { CookieJar } from 'tough-cookie'; -import { updateCookieJar } from './requests'; -import { Headers } from 'headers-polyfill'; -import { TwitterApiErrorRaw, AuthenticationError, ApiError } from './errors'; -import { Type, type Static } from '@sinclair/typebox'; -import { Check } from '@sinclair/typebox/value'; -import * as OTPAuth from 'otpauth'; -import { FetchParameters } from './api-types'; -import debug from 'debug'; -import { generateXPFFHeader } from './xpff'; -import { generateTransactionId } from './xctxid'; - -const log = debug('twitter-scraper:auth-user'); - -export interface TwitterUserAuthFlowInitRequest { - flow_name: string; - input_flow_data: Record; - subtask_versions: Record; -} - -export interface TwitterUserAuthFlowSubtaskRequest { - flow_token: string; - subtask_inputs: ({ - subtask_id: string; - } & Record)[]; -} - -export type TwitterUserAuthFlowRequest = - | TwitterUserAuthFlowInitRequest - | TwitterUserAuthFlowSubtaskRequest; - -export interface TwitterUserAuthFlowResponse { - errors?: TwitterApiErrorRaw[]; - flow_token?: string; - status?: string; - subtasks?: TwitterUserAuthSubtask[]; -} - -interface TwitterUserAuthVerifyCredentials { - errors?: TwitterApiErrorRaw[]; -} - -const TwitterUserAuthSubtask = Type.Object({ - subtask_id: Type.String(), - enter_text: Type.Optional(Type.Object({})), -}); -type TwitterUserAuthSubtask = Static; - -export type FlowTokenResultSuccess = { - status: 'success'; - response: TwitterUserAuthFlowResponse; -}; - -export type FlowTokenResultError = { - status: 'error'; - err: Error; -}; - -export type FlowTokenResult = FlowTokenResultSuccess | FlowTokenResultError; - -export interface TwitterUserAuthCredentials { - username: string; - password: string; - email?: string; - twoFactorSecret?: string; -} - -/** - * The API interface provided to custom subtask handlers for interacting with the Twitter authentication flow. - * This interface allows handlers to send flow requests and access the current flow token. - * - * The API is passed to each subtask handler and provides methods necessary for implementing - * custom authentication subtasks. It abstracts away the low-level details of communicating - * with Twitter's authentication API. - * - * @example - * ```typescript - * import { Scraper, FlowSubtaskHandler } from "@the-convocation/twitter-scraper"; - * - * // A custom subtask handler that implements a hypothetical example subtask - * const exampleHandler: FlowSubtaskHandler = async (subtaskId, response, credentials, api) => { - * // Process the example subtask somehow - * const data = await processExampleTask(); - * - * // Submit the processed data using the provided API - * return await api.sendFlowRequest({ - * flow_token: api.getFlowToken(), - * subtask_inputs: [{ - * subtask_id: subtaskId, - * example_data: { - * value: data, - * link: "next_link" - * } - * }] - * }); - * }; - * - * const scraper = new Scraper(); - * scraper.registerAuthSubtaskHandler("ExampleSubtask", exampleHandler); - * ``` - */ -export interface FlowSubtaskHandlerApi { - /** - * Send a flow request to the Twitter API. - * @param request The request object containing flow token and subtask inputs - * @returns The result of the flow task - */ - sendFlowRequest: ( - request: TwitterUserAuthFlowRequest, - ) => Promise; - /** - * Gets the current flow token. - * @returns The current flow token - */ - getFlowToken: () => string; -} - -/** - * A handler function for processing Twitter authentication flow subtasks. - * Library consumers can implement and register custom handlers for new or - * existing subtask types using the Scraper.registerAuthSubtaskHandler method. - * - * Each subtask handler is called when its corresponding subtask ID is encountered - * during the authentication flow. The handler receives the subtask ID, the previous - * response data, the user's credentials, and an API interface for interacting with - * the authentication flow. - * - * Handlers should process their specific subtask and return either a successful response - * or an error. Success responses typically lead to the next subtask in the flow, while - * errors will halt the authentication process. - * - * @param subtaskId - The identifier of the subtask being handled - * @param previousResponse - The complete response from the previous authentication flow step - * @param credentials - The user's authentication credentials including username, password, etc. - * @param api - An interface providing methods to interact with the authentication flow - * @returns A promise resolving to either a successful flow response or an error - * - * @example - * ```typescript - * import { Scraper, FlowSubtaskHandler } from "@the-convocation/twitter-scraper"; - * - * // Custom handler for a hypothetical verification subtask - * const verificationHandler: FlowSubtaskHandler = async ( - * subtaskId, - * response, - * credentials, - * api - * ) => { - * // Extract the verification data from the response - * const verificationData = response.subtasks?.[0].exampleData?.value; - * if (!verificationData) { - * return { - * status: 'error', - * err: new Error('No verification data found in response') - * }; - * } - * - * // Process the verification data somehow - * const result = await processVerification(verificationData); - * - * // Submit the result using the flow API - * return await api.sendFlowRequest({ - * flow_token: api.getFlowToken(), - * subtask_inputs: [{ - * subtask_id: subtaskId, - * example_verification: { - * value: result, - * link: "next_link" - * } - * }] - * }); - * }; - * - * const scraper = new Scraper(); - * scraper.registerAuthSubtaskHandler("ExampleVerificationSubtask", verificationHandler); - * - * // Later, when logging in... - * await scraper.login("username", "password"); - * ``` - */ -export type FlowSubtaskHandler = ( - subtaskId: string, - previousResponse: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, -) => Promise; - -/** - * A user authentication token manager. - */ -export class TwitterUserAuth extends TwitterGuestAuth { - private readonly subtaskHandlers: Map = new Map(); - - constructor(bearerToken: string, options?: Partial) { - super(bearerToken, options); - this.initializeDefaultHandlers(); - } - - /** - * Register a custom subtask handler or override an existing one - * @param subtaskId The ID of the subtask to handle - * @param handler The handler function that processes the subtask - */ - registerSubtaskHandler(subtaskId: string, handler: FlowSubtaskHandler): void { - this.subtaskHandlers.set(subtaskId, handler); - } - - private initializeDefaultHandlers(): void { - this.subtaskHandlers.set( - 'LoginJsInstrumentationSubtask', - this.handleJsInstrumentationSubtask.bind(this), - ); - this.subtaskHandlers.set( - 'LoginEnterUserIdentifierSSO', - this.handleEnterUserIdentifierSSO.bind(this), - ); - this.subtaskHandlers.set( - 'LoginEnterAlternateIdentifierSubtask', - this.handleEnterAlternateIdentifierSubtask.bind(this), - ); - this.subtaskHandlers.set( - 'LoginEnterPassword', - this.handleEnterPassword.bind(this), - ); - this.subtaskHandlers.set( - 'AccountDuplicationCheck', - this.handleAccountDuplicationCheck.bind(this), - ); - this.subtaskHandlers.set( - 'LoginTwoFactorAuthChallenge', - this.handleTwoFactorAuthChallenge.bind(this), - ); - this.subtaskHandlers.set('LoginAcid', this.handleAcid.bind(this)); - this.subtaskHandlers.set( - 'LoginSuccessSubtask', - this.handleSuccessSubtask.bind(this), - ); - } - - async isLoggedIn(): Promise { - const cookie = await this.getCookieString(); - return cookie.includes('ct0='); - } - - async login( - username: string, - password: string, - email?: string, - twoFactorSecret?: string, - ): Promise { - await this.updateGuestToken(); - - const credentials: TwitterUserAuthCredentials = { - username, - password, - email, - twoFactorSecret, - }; - - let next: FlowTokenResult = await this.initLogin(); - while (next.status === 'success' && next.response.subtasks?.length) { - const flowToken = next.response.flow_token; - if (flowToken == null) { - // Should never happen - throw new Error('flow_token not found.'); - } - - const subtaskId = next.response.subtasks[0].subtask_id; - const handler = this.subtaskHandlers.get(subtaskId); - - if (handler) { - next = await handler(subtaskId, next.response, credentials, { - sendFlowRequest: this.executeFlowTask.bind(this), - getFlowToken: () => flowToken, - }); - } else { - throw new Error(`Unknown subtask ${subtaskId}`); - } - } - if (next.status === 'error') { - throw next.err; - } - } - - async logout(): Promise { - if (!this.hasToken()) { - return; - } - - try { - await requestApi( - 'https://api.x.com/1.1/account/logout.json', - this, - 'POST', - ); - } catch (error) { - // Ignore errors during logout but still clean up state - console.warn('Error during logout:', error); - } finally { - this.deleteToken(); - this.jar = new CookieJar(); - } - } - - async installTo( - headers: Headers, - _url: string, - bearerTokenOverride?: string, - ): Promise { - // Use the override token if provided, otherwise use the instance's bearer token - const tokenToUse = bearerTokenOverride ?? this.bearerToken; - headers.set('authorization', `Bearer ${tokenToUse}`); - headers.set( - 'user-agent', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', - ); - - if (this.guestToken) { - // Guest token is optional for authenticated users - headers.set('x-guest-token', this.guestToken); - } - - await this.installCsrfToken(headers); - - if (this.options?.experimental?.xpff) { - const guestId = await this.guestId(); - if (guestId != null) { - const xpffHeader = await generateXPFFHeader(guestId); - headers.set('x-xp-forwarded-for', xpffHeader); - } - } - - const cookie = await this.getCookieString(); - headers.set('cookie', cookie); - } - - private async initLogin(): Promise { - // Reset certain session-related cookies because Twitter complains sometimes if we don't - this.removeCookie('twitter_ads_id='); - this.removeCookie('ads_prefs='); - this.removeCookie('_twitter_sess='); - this.removeCookie('zipbox_forms_auth_token='); - this.removeCookie('lang='); - this.removeCookie('bouncer_reset_cookie='); - this.removeCookie('twid='); - this.removeCookie('twitter_ads_idb='); - this.removeCookie('email_uid='); - this.removeCookie('external_referer='); - this.removeCookie('ct0='); - this.removeCookie('aa_u='); - this.removeCookie('__cf_bm='); - - return await this.executeFlowTask({ - flow_name: 'login', - input_flow_data: { - flow_context: { - debug_overrides: {}, - start_location: { - location: 'unknown', - }, - }, - }, - subtask_versions: { - action_list: 2, - alert_dialog: 1, - app_download_cta: 1, - check_logged_in_account: 1, - choice_selection: 3, - contacts_live_sync_permission_prompt: 0, - cta: 7, - email_verification: 2, - end_flow: 1, - enter_date: 1, - enter_email: 2, - enter_password: 5, - enter_phone: 2, - enter_recaptcha: 1, - enter_text: 5, - enter_username: 2, - generic_urt: 3, - in_app_notification: 1, - interest_picker: 3, - js_instrumentation: 1, - menu_dialog: 1, - notifications_permission_prompt: 2, - open_account: 2, - open_home_timeline: 1, - open_link: 1, - phone_verification: 4, - privacy_options: 1, - security_key: 3, - select_avatar: 4, - select_banner: 2, - settings_list: 7, - show_code: 1, - sign_up: 2, - sign_up_review: 4, - tweet_selection_urt: 1, - update_users: 1, - upload_media: 1, - user_recommendations_list: 4, - user_recommendations_urt: 1, - wait_spinner: 3, - web_modal: 1, - }, - }); - } - - private async handleJsInstrumentationSubtask( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - _credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await api.sendFlowRequest({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - js_instrumentation: { - response: '{}', - link: 'next_link', - }, - }, - ], - }); - } - - private async handleEnterAlternateIdentifierSubtask( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await this.executeFlowTask({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - enter_text: { - text: credentials.email, - link: 'next_link', - }, - }, - ], - }); - } - - private async handleEnterUserIdentifierSSO( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await this.executeFlowTask({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - settings_list: { - setting_responses: [ - { - key: 'user_identifier', - response_data: { - text_data: { result: credentials.username }, - }, - }, - ], - link: 'next_link', - }, - }, - ], - }); - } - - private async handleEnterPassword( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await this.executeFlowTask({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - enter_password: { - password: credentials.password, - link: 'next_link', - }, - }, - ], - }); - } - - private async handleAccountDuplicationCheck( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - _credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await this.executeFlowTask({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - check_logged_in_account: { - link: 'AccountDuplicationCheck_false', - }, - }, - ], - }); - } - - private async handleTwoFactorAuthChallenge( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - if (!credentials.twoFactorSecret) { - return { - status: 'error', - err: new AuthenticationError( - 'Two-factor authentication is required but no secret was provided', - ), - }; - } - - const totp = new OTPAuth.TOTP({ secret: credentials.twoFactorSecret }); - let error; - for (let attempts = 1; attempts < 4; attempts += 1) { - try { - return await api.sendFlowRequest({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - enter_text: { - link: 'next_link', - text: totp.generate(), - }, - }, - ], - }); - } catch (err) { - error = err; - await new Promise((resolve) => setTimeout(resolve, 2000 * attempts)); - } - } - throw error; - } - - private async handleAcid( - subtaskId: string, - _prev: TwitterUserAuthFlowResponse, - credentials: TwitterUserAuthCredentials, - api: FlowSubtaskHandlerApi, - ): Promise { - return await this.executeFlowTask({ - flow_token: api.getFlowToken(), - subtask_inputs: [ - { - subtask_id: subtaskId, - enter_text: { - text: credentials.email, - link: 'next_link', - }, - }, - ], - }); - } - - private async handleSuccessSubtask(): Promise { - // Login completed successfully, nothing more to do - log('Successfully logged in with user credentials.'); - return { - status: 'success', - response: {}, - }; - } - - private async executeFlowTask( - data: TwitterUserAuthFlowRequest, - ): Promise { - let onboardingTaskUrl = 'https://api.x.com/1.1/onboarding/task.json'; - if ('flow_name' in data) { - onboardingTaskUrl = `https://api.x.com/1.1/onboarding/task.json?flow_name=${data.flow_name}`; - } - - log(`Making POST request to ${onboardingTaskUrl}`); - const headers = new Headers({ - accept: '*/*', - 'accept-language': 'en-US,en;q=0.9', - 'content-type': 'application/json', - 'cache-control': 'no-cache', - origin: 'https://x.com', - pragma: 'no-cache', - priority: 'u=1, i', - referer: 'https://x.com/', - 'sec-ch-ua': - '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin', - 'user-agent': - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', - 'x-twitter-auth-type': 'OAuth2Client', - 'x-twitter-active-user': 'yes', - 'x-twitter-client-language': 'en', - }); - await this.installTo(headers, onboardingTaskUrl); - - if (this.options?.experimental?.xClientTransactionId) { - const transactionId = await generateTransactionId( - onboardingTaskUrl, - this.fetch.bind(this), - 'POST', - ); - headers.set('x-client-transaction-id', transactionId); - } - - let res: Response; - do { - const fetchParameters: FetchParameters = [ - onboardingTaskUrl, - { - credentials: 'include', - method: 'POST', - headers: headers, - body: JSON.stringify(data), - }, - ]; - - try { - res = await this.fetch(...fetchParameters); - } catch (err) { - if (!(err instanceof Error)) { - throw err; - } - - return { - status: 'error', - err: err, - }; - } - - await updateCookieJar(this.jar, res.headers); - - if (res.status === 429) { - log('Rate limit hit, waiting before retrying...'); - await this.onRateLimit({ - fetchParameters: fetchParameters, - response: res, - }); - } - } while (res.status === 429); - - if (!res.ok) { - return { status: 'error', err: await ApiError.fromResponse(res) }; - } - - const flow: TwitterUserAuthFlowResponse = await flexParseJson(res); - if (flow?.flow_token == null) { - return { - status: 'error', - err: new AuthenticationError('flow_token not found.'), - }; - } - - if (flow.errors?.length) { - return { - status: 'error', - err: new AuthenticationError( - `Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`, - ), - }; - } - - if (typeof flow.flow_token !== 'string') { - return { - status: 'error', - err: new AuthenticationError('flow_token was not a string.'), - }; - } - - const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined; - Check(TwitterUserAuthSubtask, subtask); - - if (subtask && subtask.subtask_id === 'DenyLoginSubtask') { - return { - status: 'error', - err: new AuthenticationError('Authentication error: DenyLoginSubtask'), - }; - } - - return { - status: 'success', - response: flow, - }; - } -} diff --git a/twitter-scraper/src/auth.test.ts b/twitter-scraper/src/auth.test.ts deleted file mode 100644 index ca859a5..0000000 --- a/twitter-scraper/src/auth.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { getScraper } from './test-utils'; - -const testLogin = process.env['TWITTER_PASSWORD'] ? test : test.skip; - -testLogin( - 'scraper can log in', - async () => { - const scraper = await getScraper({ authMethod: 'password' }); - await expect(scraper.isLoggedIn()).resolves.toBeTruthy(); - }, - 15000, -); - -test('scraper can log in with cookies', async () => { - const scraper = await getScraper(); - await expect(scraper.isLoggedIn()).resolves.toBeTruthy(); -}); - -test('scraper can restore its login state from cookies', async () => { - const scraper = await getScraper(); - await expect(scraper.isLoggedIn()).resolves.toBeTruthy(); - const scraper2 = await getScraper({ authMethod: 'anonymous' }); - await expect(scraper2.isLoggedIn()).resolves.toBeFalsy(); - - // Serialize since that's the usual usage pattern - const cookies = await scraper - .getCookies() - .then((cookies) => cookies.map((cookie) => cookie.toString())); - await scraper2.setCookies(cookies); - - await expect(scraper2.isLoggedIn()).resolves.toBeTruthy(); -}); - -testLogin( - 'scraper can log out', - async () => { - const scraper = await getScraper({ authMethod: 'password' }); - await expect(scraper.isLoggedIn()).resolves.toBeTruthy(); - - await scraper.logout(); - - await expect(scraper.isLoggedIn()).resolves.toBeFalsy(); - }, - 15000, -); diff --git a/twitter-scraper/src/auth.ts b/twitter-scraper/src/auth.ts deleted file mode 100644 index 0d93fa6..0000000 --- a/twitter-scraper/src/auth.ts +++ /dev/null @@ -1,343 +0,0 @@ -import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie'; -import { updateCookieJar } from './requests'; -import { Headers } from 'headers-polyfill'; -import fetch from 'cross-fetch'; -import { FetchTransformOptions, flexParseJson } from './api'; -import { - RateLimitEvent, - RateLimitStrategy, - WaitingRateLimitStrategy, -} from './rate-limit'; -import { AuthenticationError } from './errors'; -import debug from 'debug'; -import { generateXPFFHeader } from './xpff'; - -const log = debug('twitter-scraper:auth'); - -export interface TwitterAuthOptions { - fetch: typeof fetch; - transform: Partial; - rateLimitStrategy: RateLimitStrategy; - experimental: { - xClientTransactionId?: boolean; - xpff?: boolean; - }; -} - -export interface TwitterAuth { - fetch: typeof fetch; - - /** - * How to behave when being rate-limited. - * @param event The event information. - */ - onRateLimit(event: RateLimitEvent): Promise; - - /** - * Returns the current cookie jar. - */ - cookieJar(): CookieJar; - - /** - * Returns the current cookies. - */ - getCookies(): Promise; - - /** - * Returns if a user is logged-in to Twitter through this instance. - * @returns `true` if a user is logged-in; otherwise `false`. - */ - isLoggedIn(): Promise; - - /** - * Logs into a Twitter account. - * @param username The username to log in with. - * @param password The password to log in with. - * @param email The email to log in with, if you have email confirmation enabled. - * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled. - */ - login( - username: string, - password: string, - email?: string, - twoFactorSecret?: string, - ): Promise; - - /** - * Logs out of the current session. - */ - logout(): Promise; - - /** - * Deletes the current guest token token. - */ - deleteToken(): void; - - /** - * Returns if the authentication state has a token. - * @returns `true` if the authentication state has a token; `false` otherwise. - */ - hasToken(): boolean; - - /** - * Returns the time that authentication was performed. - * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet. - */ - authenticatedAt(): Date | null; - - /** - * Installs the authentication information into a headers-like object. If needed, the - * authentication token will be updated from the API automatically. - * @param headers A Headers instance representing a request's headers. - * @param _url The URL being requested (currently unused, reserved for future use). - * @param bearerTokenOverride Optional bearer token to use instead of the default one. - */ - installTo( - headers: Headers, - _url: string, - bearerTokenOverride?: string, - ): Promise; -} - -/** - * Wraps the provided fetch function with transforms. - * @param fetchFn The fetch function. - * @param transform The transform options. - * @returns The input fetch function, wrapped with the provided transforms. - */ -function withTransform( - fetchFn: typeof fetch, - transform?: Partial, -): typeof fetch { - return async (input, init) => { - const fetchArgs = (await transform?.request?.(input, init)) ?? [ - input, - init, - ]; - const res = await fetchFn(...fetchArgs); - return (await transform?.response?.(res)) ?? res; - }; -} - -/** - * A guest authentication token manager. Automatically handles token refreshes. - */ -export class TwitterGuestAuth implements TwitterAuth { - protected bearerToken: string; - protected jar: CookieJar; - protected guestToken?: string; - protected guestCreatedAt?: Date; - protected rateLimitStrategy: RateLimitStrategy; - - fetch: typeof fetch; - - constructor( - bearerToken: string, - readonly options?: Partial, - ) { - this.fetch = withTransform(options?.fetch ?? fetch, options?.transform); - this.rateLimitStrategy = - options?.rateLimitStrategy ?? new WaitingRateLimitStrategy(); - this.bearerToken = bearerToken; - this.jar = new CookieJar(); - } - - async onRateLimit(event: RateLimitEvent): Promise { - await this.rateLimitStrategy.onRateLimit(event); - } - - cookieJar(): CookieJar { - return this.jar; - } - - isLoggedIn(): Promise { - return Promise.resolve(false); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - login(_username: string, _password: string, _email?: string): Promise { - return this.updateGuestToken(); - } - - logout(): Promise { - this.deleteToken(); - this.jar = new CookieJar(); - return Promise.resolve(); - } - - deleteToken() { - delete this.guestToken; - delete this.guestCreatedAt; - } - - hasToken(): boolean { - return this.guestToken != null; - } - - authenticatedAt(): Date | null { - if (this.guestCreatedAt == null) { - return null; - } - - return new Date(this.guestCreatedAt); - } - - async installTo( - headers: Headers, - _url: string, - bearerTokenOverride?: string, - ): Promise { - // Use the override token if provided, otherwise use the instance's bearer token - const tokenToUse = bearerTokenOverride ?? this.bearerToken; - - // Only use guest tokens when not overriding the bearer token - // Guest tokens are tied to the bearer token they were generated with - if (!bearerTokenOverride) { - if (this.shouldUpdate()) { - await this.updateGuestToken(); - } - - if (this.guestToken) { - headers.set('x-guest-token', this.guestToken); - } - } - - headers.set('authorization', `Bearer ${tokenToUse}`); - headers.set( - 'user-agent', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', - ); - - await this.installCsrfToken(headers); - - if (this.options?.experimental?.xpff) { - const guestId = await this.guestId(); - if (guestId != null) { - const xpffHeader = await generateXPFFHeader(guestId); - headers.set('x-xp-forwarded-for', xpffHeader); - } - } - - headers.set('cookie', await this.getCookieString()); - } - - async installCsrfToken(headers: Headers): Promise { - const cookies = await this.getCookies(); - const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0'); - if (xCsrfToken) { - headers.set('x-csrf-token', xCsrfToken.value); - } - } - - protected async setCookie(key: string, value: string): Promise { - const cookie = Cookie.parse(`${key}=${value}`); - if (!cookie) { - throw new Error('Failed to parse cookie.'); - } - - await this.jar.setCookie(cookie, this.getCookieJarUrl()); - - if (typeof document !== 'undefined') { - document.cookie = cookie.toString(); - } - } - - public async getCookies(): Promise { - return this.jar.getCookies(this.getCookieJarUrl()); - } - - protected async getCookieString(): Promise { - const cookies = await this.getCookies(); - return cookies.map((cookie) => `${cookie.key}=${cookie.value}`).join('; '); - } - - protected async removeCookie(key: string): Promise { - //@ts-expect-error don't care - const store: MemoryCookieStore = this.jar.store; - const cookies = await this.jar.getCookies(this.getCookieJarUrl()); - for (const cookie of cookies) { - if (!cookie.domain || !cookie.path) continue; - store.removeCookie(cookie.domain, cookie.path, key); - - if (typeof document !== 'undefined') { - document.cookie = `${cookie.key}=; Max-Age=0; path=${cookie.path}; domain=${cookie.domain}`; - } - } - } - - private getCookieJarUrl(): string { - return typeof document !== 'undefined' - ? document.location.toString() - : 'https://x.com'; - } - - protected async guestId(): Promise { - const cookies = await this.getCookies(); - const guestIdCookie = cookies.find((cookie) => cookie.key === 'guest_id'); - return guestIdCookie ? guestIdCookie.value : null; - } - - /** - * Updates the authentication state with a new guest token from the Twitter API. - */ - protected async updateGuestToken() { - try { - await this.updateGuestTokenCore(); - } catch (err) { - log('Failed to update guest token; this may cause issues:', err); - } - } - - private async updateGuestTokenCore() { - const guestActivateUrl = 'https://api.x.com/1.1/guest/activate.json'; - - const headers = new Headers({ - Authorization: `Bearer ${this.bearerToken}`, - Cookie: await this.getCookieString(), - }); - - log(`Making POST request to ${guestActivateUrl}`); - - const res = await this.fetch(guestActivateUrl, { - method: 'POST', - headers: headers, - referrerPolicy: 'no-referrer', - }); - - await updateCookieJar(this.jar, res.headers); - - if (!res.ok) { - throw new AuthenticationError(await res.text()); - } - - const o = await flexParseJson(res); - if (o == null || o['guest_token'] == null) { - throw new AuthenticationError('guest_token not found.'); - } - - const newGuestToken = o['guest_token']; - if (typeof newGuestToken !== 'string') { - throw new AuthenticationError('guest_token was not a string.'); - } - - this.guestToken = newGuestToken; - this.guestCreatedAt = new Date(); - - await this.setCookie('gt', newGuestToken); - - log(`Updated guest token: ${newGuestToken}`); - } - - /** - * Returns if the authentication token needs to be updated or not. - * @returns `true` if the token needs to be updated; `false` otherwise. - */ - private shouldUpdate(): boolean { - return ( - !this.hasToken() || - (this.guestCreatedAt != null && - this.guestCreatedAt < - new Date(new Date().valueOf() - 3 * 60 * 60 * 1000)) - ); - } -} diff --git a/twitter-scraper/src/cycletls-fetch.ts b/twitter-scraper/src/cycletls-fetch.ts deleted file mode 100644 index 1e399d8..0000000 --- a/twitter-scraper/src/cycletls-fetch.ts +++ /dev/null @@ -1,141 +0,0 @@ -import initCycleTLS from 'cycletls'; -import { Headers } from 'headers-polyfill'; -import debug from 'debug'; - -const log = debug('twitter-scraper:cycletls'); - -let cycleTLSInstance: Awaited> | null = null; - -/** - * Initialize the CycleTLS instance. This should be called once before using the fetch wrapper. - */ -export async function initCycleTLSFetch() { - if (!cycleTLSInstance) { - log('Initializing CycleTLS...'); - cycleTLSInstance = await initCycleTLS(); - log('CycleTLS initialized successfully'); - } - return cycleTLSInstance; -} - -/** - * Cleanup the CycleTLS instance. Call this when you're done making requests. - */ -export function cycleTLSExit() { - if (cycleTLSInstance) { - log('Exiting CycleTLS...'); - cycleTLSInstance.exit(); - cycleTLSInstance = null; - } -} - -/** - * A fetch-compatible wrapper around CycleTLS that mimics Chrome's TLS fingerprint - * to bypass Cloudflare and other bot detection systems. - */ -export async function cycleTLSFetch( - input: RequestInfo | URL, - init?: RequestInit, -): Promise { - const instance = await initCycleTLSFetch(); - - const url = - typeof input === 'string' - ? input - : input instanceof URL - ? input.toString() - : input.url; - const method = (init?.method || 'GET').toUpperCase(); - - log(`Making ${method} request to ${url}`); - - // Extract headers from RequestInit - const headers: Record = {}; - if (init?.headers) { - if (init.headers instanceof Headers) { - init.headers.forEach((value, key) => { - headers[key] = value; - }); - } else if (Array.isArray(init.headers)) { - init.headers.forEach(([key, value]) => { - headers[key] = value; - }); - } else { - Object.assign(headers, init.headers); - } - } - - // Convert body to string if needed - let body: string | undefined; - if (init?.body) { - if (typeof init.body === 'string') { - body = init.body; - } else if (init.body instanceof URLSearchParams) { - body = init.body.toString(); - } else { - body = init.body.toString(); - } - } - - // Use Chrome 120 JA3 fingerprint for maximum compatibility - const options = { - body, - headers, - // Chrome 120 on Windows 10 - ja3: '771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0', - userAgent: - headers['user-agent'] || - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', - }; - - try { - const response = await instance( - url, - options, - method.toLowerCase() as - | 'get' - | 'post' - | 'put' - | 'delete' - | 'patch' - | 'head' - | 'options', - ); - - // Convert CycleTLS response to fetch Response - // CycleTLS returns headers as an object - const responseHeaders = new Headers(); - if (response.headers) { - Object.entries(response.headers).forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach((v) => { - responseHeaders.append(key, v); - }); - } else if (typeof value === 'string') { - responseHeaders.set(key, value); - } - }); - } - - // Get response body - cycletls provides helper methods, but we need the raw text - // The response object has a text() method that returns the body as text - let responseBody = ''; - if (typeof response.text === 'function') { - responseBody = await response.text(); - } else if ((response as any).body) { - responseBody = (response as any).body; - } - - // Create a proper Response object using standard Response constructor - const fetchResponse = new Response(responseBody, { - status: response.status, - statusText: '', // CycleTLS doesn't provide status text - headers: responseHeaders, - }); - - return fetchResponse; - } catch (error) { - log(`CycleTLS request failed: ${error}`); - throw error; - } -} diff --git a/twitter-scraper/src/direct-messages-async.ts b/twitter-scraper/src/direct-messages-async.ts deleted file mode 100644 index 57f2072..0000000 --- a/twitter-scraper/src/direct-messages-async.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - DmConversationTimeline, - DmMessageEntry, - DmCursorOptions, -} from './direct-messages'; -import { jitter } from './api'; - -export interface FetchDmConversationMessagesResponse { - conversation: DmConversationTimeline; - next?: DmCursorOptions; -} - -export type FetchDmConversationFn = ( - conversationId: string, - maxMessages: number, - cursor: DmCursorOptions | undefined, -) => Promise; - -export async function* getDmConversationMessagesGenerator( - conversationId: string, - maxMessages: number, - initialCursor: DmCursorOptions | undefined, - fetchFunc: FetchDmConversationFn, -): AsyncGenerator { - let nMessages = 0; - let cursor = initialCursor; - - while (nMessages < maxMessages) { - const batch: FetchDmConversationMessagesResponse = await fetchFunc( - conversationId, - maxMessages, - cursor, - ); - - const { conversation, next } = batch; - - if (!conversation?.entries || conversation?.entries?.length === 0) { - break; - } - - for (const entry of conversation.entries) { - if (nMessages < maxMessages) { - yield entry; - nMessages++; - } else { - break; - } - } - - cursor = next; - - if (conversation.status === 'AT_END' || !next) { - break; - } - - await jitter(1000); - } -} diff --git a/twitter-scraper/src/direct-messages.test.ts b/twitter-scraper/src/direct-messages.test.ts deleted file mode 100644 index 737fd75..0000000 --- a/twitter-scraper/src/direct-messages.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { getScraper } from './test-utils'; -import { findDmConversationsByUserId, DmInbox } from './direct-messages'; - -async function getInboxWithConversations() { - const scraper = await getScraper(); - const directMessages = await scraper.getDmInbox(); - expect(directMessages.conversations).toBeDefined(); - - const conversationIds = Object.keys(directMessages.conversations); - expect(conversationIds.length).toBeGreaterThan(0); - - return { scraper, directMessages, conversationIds }; -} - -function getFirstConversation( - directMessages: DmInbox, - conversationIds: string[], -) { - // This should be your most recent DM. - const firstConversation = directMessages.conversations[conversationIds[0]]; - expect(firstConversation).toBeDefined(); - - return firstConversation; -} - -test('scraper can get direct message inbox when authenticated', async () => { - const scraper = await getScraper(); - - const directMessages = await scraper.getDmInbox(); - expect(directMessages).toBeDefined(); - - expect(typeof directMessages).toBe('object'); -}); - -test('getDmInbox throws error when not authenticated', async () => { - const scraper = await getScraper({ authMethod: 'anonymous' }); - - await expect(scraper.isLoggedIn()).resolves.toBeFalsy(); - await expect(scraper.getDmInbox()).rejects.toThrow(); -}); - -test('scraper can get direct message conversation', async () => { - const { scraper, directMessages, conversationIds } = - await getInboxWithConversations(); - - const firstConversation = getFirstConversation( - directMessages, - conversationIds, - ); - expect(firstConversation.conversation_id).toBeDefined(); - - const conversation = await scraper.getDmConversation( - firstConversation.conversation_id, - ); - - expect(conversation.status).toBeDefined(); - expect(conversation.min_entry_id).toBeDefined(); - expect(conversation.max_entry_id).toBeDefined(); - expect(conversation.entries).toBeDefined(); - expect(conversation.users).toBeDefined(); - expect(conversation.conversations).toBeDefined(); -}); - -test('scraper can paginate through direct message conversation', async () => { - const { scraper, directMessages, conversationIds } = - await getInboxWithConversations(); - - const firstConversation = getFirstConversation( - directMessages, - conversationIds, - ); - expect(firstConversation.conversation_id).toBeDefined(); - - const conversationId = firstConversation.conversation_id; - const messages = scraper.getDmMessages(conversationId, 30); - - let count = 0; - for await (const entry of messages) { - expect(entry).toBeDefined(); - - if (entry.message) { - expect(entry.message).toBeDefined(); - } else if (entry.welcome_message_create) { - expect(entry.welcome_message_create).toBeDefined(); - } else { - fail('No messages were retrieved'); - } - - count++; - } - - // Your DM will need at least 20+ messages to test this. - // 20 was chosen because that seems to be the max size per response. - expect(count).toBeGreaterThan(20); -}); - -test('findConversationsByUserId filters conversations by user ID', async () => { - const { directMessages, conversationIds } = await getInboxWithConversations(); - - const firstConversation = getFirstConversation( - directMessages, - conversationIds, - ); - expect(firstConversation.participants).toBeDefined(); - expect(firstConversation.participants.length).toBeGreaterThan(0); - - // in my responses, 0th is the current user and 1st is the other user. - const targetUserId = firstConversation.participants[1].user_id; - - const foundConversations = findDmConversationsByUserId( - directMessages, - targetUserId, - ); - - expect(foundConversations).toBeDefined(); - expect(foundConversations.length).toBeGreaterThan(0); - - // make sure all convos are the right user - foundConversations.forEach((conversation) => { - const hasUser = conversation.participants.some( - (participant) => participant.user_id === targetUserId, - ); - expect(hasUser).toBe(true); - }); -}); diff --git a/twitter-scraper/src/direct-messages.ts b/twitter-scraper/src/direct-messages.ts deleted file mode 100644 index b241a3a..0000000 --- a/twitter-scraper/src/direct-messages.ts +++ /dev/null @@ -1,301 +0,0 @@ -import { AuthenticationError } from './errors'; -import { TwitterAuth } from './auth'; -import { LegacyUserRaw } from './profile'; -import { requestApi, addApiParams } from './api'; - -import { getDmConversationMessagesGenerator } from './direct-messages-async'; - -export interface DmInboxResponse { - inbox_initial_state: DmInbox; -} - -export interface DmInbox { - last_seen_event_id: string; - trusted_last_seen_event_id: string; - untrusted_last_seen_event_id: string; - cursor: string; - inbox_timelines: DmInboxTimelines; - entries: DmMessageEntry[]; - users: { [key: string]: LegacyUserRaw }; - conversations: { [key: string]: DmConversation }; -} - -export interface DmConversationResponse { - conversation_timeline: DmConversationTimeline; -} - -export interface DmConversationTimeline { - status: DmStatus; - min_entry_id: string; - max_entry_id: string; - entries: DmMessageEntry[]; - users: { [key: string]: LegacyUserRaw }; - conversations: { [key: string]: DmConversation }; -} - -export interface DmConversation { - conversation_id: string; - type: string; - sort_event_id: string; - sort_timestamp: string; - participants: DmParticipant[]; - nsfw: boolean; - notifications_disabled: boolean; - mention_notifications_disabled: boolean; - last_read_event_id: string; - read_only: boolean; - trusted: boolean; - muted: boolean; - status: DmStatus; - min_entry_id: string; - max_entry_id: string; -} - -export type DmStatus = 'AT_END' | 'HAS_MORE'; - -export interface DmParticipant { - user_id: string; - last_read_event_id?: string; -} - -export interface DmMessageEntry { - welcome_message_create?: DmWelcomeMessage; - message?: DmMessage; -} - -export interface DmMessage { - id: string; - time: string; - affects_sort: boolean; - request_id: string; - conversation_id: string; - message_data: DmMessageData; - message_reactions: DmReaction[]; -} - -export interface DmMessageData { - id: string; - time: string; - recipient_id: string; - sender_id: string; - text: string; - edit_count?: number; - entities?: DmMessageEntities; -} - -export interface DmReaction { - id: string; - time: string; - conversation_id: string; - message_id: string; - reaction_key: string; - emoji_reaction: string; - sender_id: string; -} - -export interface DmMessageEntities { - // TODO: Not sure what these types are. - hashtags: any[]; - symbols: any[]; - user_mentions: any[]; - urls: DmMessageUrl[]; -} - -export interface DmMessageUrl { - url: string; - expanded_url: string; - display_url: string; - indices: number[]; -} - -export interface DmWelcomeMessage extends DmMessage { - welcome_message_id: string; -} - -export interface DmInboxTimelines { - trusted: DmTimelineState; - untrusted: DmTimelineState; - untrusted_low_quality: DmTimelineState; -} - -export interface DmTimelineState { - status: DmStatus; - min_entry_id: string; -} - -export interface DmCursorOptions { - maxId?: string; - minId?: string; -} - -export async function fetchDmInbox(auth: TwitterAuth) { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError( - 'Scraper is not logged-in for fetching direct messages.', - ); - } - - // TODO: Not sure how the "cursor" works for this. I don't have enough DMs to test. - const params = new URLSearchParams(); - addApiParams(params, false); - - params.set('nsfw_filtering_enabled', 'false'); - params.set('filter_low_quality', 'true'); - params.set('include_quality', 'all'); - params.set('include_ext_profile_image_shape', '1'); - params.set('dm_secret_conversations_enabled', 'false'); - params.set('krs_registration_enabled', 'false'); - params.set('include_ext_limited_action_results', 'true'); - params.set('dm_users', 'true'); - params.set('include_groups', 'true'); - params.set('include_inbox_timelines', 'true'); - params.set('supports_reactions', 'true'); - params.set('supports_edit', 'true'); - params.set('include_ext_edit_control', 'true'); - params.set('include_ext_business_affiliations_label', 'true'); - params.set('include_ext_parody_commentary_fan_label', 'true'); - params.set( - 'ext', - 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article', - ); - - const res = await requestApi( - `https://x.com/i/api/1.1/dm/inbox_initial_state.json?${params.toString()}`, - auth, - ); - - if (!res.success) { - throw res.err; - } - - return parseDmInbox(res.value); -} - -export async function parseDmInbox(inbox: DmInboxResponse) { - return inbox.inbox_initial_state; -} - -// This gets the current authenticated user's direct messages. -// This requires the user to be authenticated. -export async function getDmInbox(auth: TwitterAuth) { - return await fetchDmInbox(auth); -} - -// This gets the current authenticated user's direct conversations. -// This requires the user to be authenticated. -export async function fetchDmConversation( - conversationId: string, - cursor: DmCursorOptions | undefined, - auth: TwitterAuth, -) { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError( - 'Scraper is not logged-in for fetching direct messages.', - ); - } - - const params = new URLSearchParams(); - addApiParams(params, false); - - params.set('context', 'FETCH_DM_CONVERSATION_HISTORY'); - params.set('include_ext_profile_image_shape', '1'); - params.set('dm_secret_conversations_enabled', 'false'); - params.set('krs_registration_enabled', 'false'); - params.set('include_ext_limited_action_results', 'true'); - params.set('dm_users', 'true'); - params.set('include_groups', 'true'); - params.set('include_inbox_timelines', 'true'); - params.set('supports_reactions', 'true'); - params.set('supports_edit', 'true'); - params.set('include_conversation_info', 'true'); - params.set( - 'ext', - 'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article', - ); - - // By default, passing no cursor means you get the latest results. - // `max_id` does backwards pagination using min_entry_id as the maxId to get older messages. - // `min_id` does forward pagination using max_entry_id as the minId to get newer messages. - // To know when there are no more pages, the response's "status" will return "AT_END". - if (cursor) { - if (cursor.maxId) { - params.set('max_id', cursor.maxId); - } - if (cursor.minId) { - params.set('min_id', cursor.minId); - } - } - - const url = `https://x.com/i/api/1.1/dm/conversation/${conversationId}.json?${params.toString()}`; - - const res = await requestApi(url, auth); - - if (!res.success) { - throw res.err; - } - - return parseDmConversation(res.value); -} - -export async function parseDmConversation( - conversation: DmConversationResponse, -) { - return conversation.conversation_timeline; -} - -export async function getDmConversation( - conversationId: string, - cursor: DmCursorOptions | undefined, - auth: TwitterAuth, -) { - return await fetchDmConversation(conversationId, cursor, auth); -} - -export function getDmMessages( - conversationId: string, - maxMessages: number, - cursor: DmCursorOptions | undefined, - auth: TwitterAuth, -): AsyncGenerator { - return getDmConversationMessagesGenerator( - conversationId, - maxMessages, - cursor, - async (id, _max, cursor) => { - const conversation = await fetchDmConversation(id, cursor, auth); - - let next: DmCursorOptions | undefined = undefined; - - if (cursor?.minId && conversation.max_entry_id) { - next = { minId: conversation.max_entry_id }; - } else if (conversation.min_entry_id) { - next = { maxId: conversation.min_entry_id }; - } - - return { - conversation, - next, - }; - }, - ); -} - -export function findDmConversationsByUserId( - inbox: DmInbox, - userId: string, -): DmConversation[] { - const conversations: DmConversation[] = []; - - for (const conversationId in inbox.conversations) { - const conversation = inbox.conversations[conversationId]; - const hasUser = conversation.participants.some( - (participant) => participant.user_id === userId, - ); - - if (hasUser) { - conversations.push(conversation); - } - } - - return conversations; -} diff --git a/twitter-scraper/src/errors.ts b/twitter-scraper/src/errors.ts deleted file mode 100644 index 4720738..0000000 --- a/twitter-scraper/src/errors.ts +++ /dev/null @@ -1,66 +0,0 @@ -export class ApiError extends Error { - constructor(readonly response: Response, readonly data: any) { - super( - `Response status: ${response.status} | headers: ${JSON.stringify( - headersToString(response.headers), - )} | data: ${typeof data === 'string' ? data : JSON.stringify(data)}`, - ); - } - - static async fromResponse(response: Response) { - // Try our best to parse the result, but don't bother if we can't - let data: string | object | undefined = undefined; - try { - if (response.headers.get('content-type')?.includes('application/json')) { - data = await response.json(); - } else { - data = await response.text(); - } - } catch { - try { - data = await response.text(); - } catch {} - } - - return new ApiError(response, data); - } -} - -function headersToString(headers: Headers): string { - const result: string[] = []; - headers.forEach((value, key) => { - result.push(`${key}: ${value}`); - }); - return result.join('\n'); -} - -export class AuthenticationError extends Error { - constructor(message?: string) { - super(message || 'Authentication failed'); - this.name = 'AuthenticationError'; - } -} - -export interface TwitterApiErrorPosition { - line: number; - column: number; -} - -export interface TwitterApiErrorTraceInfo { - trace_id: string; -} - -export interface TwitterApiErrorExtensions { - code?: number; - kind?: string; - name?: string; - source?: string; - tracing?: TwitterApiErrorTraceInfo; -} - -export interface TwitterApiErrorRaw extends TwitterApiErrorExtensions { - message?: string; - locations?: TwitterApiErrorPosition[]; - path?: string[]; - extensions?: TwitterApiErrorExtensions; -} diff --git a/twitter-scraper/src/platform/index.ts b/twitter-scraper/src/platform/index.ts deleted file mode 100644 index 5abc5f7..0000000 --- a/twitter-scraper/src/platform/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PlatformExtensions, genericPlatform } from './platform-interface'; - -export * from './platform-interface'; - -declare const PLATFORM_NODE: boolean; - -export class Platform implements PlatformExtensions { - async randomizeCiphers() { - const platform = await Platform.importPlatform(); - await platform?.randomizeCiphers(); - } - - private static async importPlatform(): Promise { - if (PLATFORM_NODE) { - const { platform } = await import('./node/index.js'); - return platform as PlatformExtensions; - } - - return genericPlatform; - } -} diff --git a/twitter-scraper/src/platform/node/index.ts b/twitter-scraper/src/platform/node/index.ts deleted file mode 100644 index b4a19ed..0000000 --- a/twitter-scraper/src/platform/node/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PlatformExtensions } from '../platform-interface'; -import { randomizeCiphers } from './randomize-ciphers'; - -class NodePlatform implements PlatformExtensions { - randomizeCiphers(): Promise { - randomizeCiphers(); - return Promise.resolve(); - } -} - -export const platform = new NodePlatform(); diff --git a/twitter-scraper/src/platform/node/randomize-ciphers.ts b/twitter-scraper/src/platform/node/randomize-ciphers.ts deleted file mode 100644 index 86290a1..0000000 --- a/twitter-scraper/src/platform/node/randomize-ciphers.ts +++ /dev/null @@ -1,29 +0,0 @@ -import tls from 'node:tls'; -import { randomBytes } from 'node:crypto'; - -const ORIGINAL_CIPHERS = tls.DEFAULT_CIPHERS; - -// How many ciphers from the top of the list to shuffle. -// The remaining ciphers are left in the original order. -const TOP_N_SHUFFLE = 8; - -// Modified variation of https://stackoverflow.com/a/12646864 -const shuffleArray = (array: unknown[]) => { - for (let i = array.length - 1; i > 0; i--) { - const j = randomBytes(4).readUint32LE() % array.length; - [array[i], array[j]] = [array[j], array[i]]; - } - - return array; -}; - -// https://github.com/imputnet/cobalt/pull/574 -export const randomizeCiphers = () => { - do { - const cipherList = ORIGINAL_CIPHERS.split(':'); - const shuffled = shuffleArray(cipherList.slice(0, TOP_N_SHUFFLE)); - const retained = cipherList.slice(TOP_N_SHUFFLE); - - tls.DEFAULT_CIPHERS = [...shuffled, ...retained].join(':'); - } while (tls.DEFAULT_CIPHERS === ORIGINAL_CIPHERS); -}; diff --git a/twitter-scraper/src/platform/platform-interface.ts b/twitter-scraper/src/platform/platform-interface.ts deleted file mode 100644 index 46711e3..0000000 --- a/twitter-scraper/src/platform/platform-interface.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface PlatformExtensions { - /** - * Randomizes the runtime's TLS ciphers to bypass TLS client fingerprinting, which - * hopefully avoids random 404s on some requests. - * - * **References:** - * - https://github.com/imputnet/cobalt/pull/574 - */ - randomizeCiphers(): Promise; -} - -export const genericPlatform = new (class implements PlatformExtensions { - randomizeCiphers(): Promise { - return Promise.resolve(); - } -})(); diff --git a/twitter-scraper/src/profile.test.ts b/twitter-scraper/src/profile.test.ts deleted file mode 100644 index 7d053f4..0000000 --- a/twitter-scraper/src/profile.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Profile } from './profile'; -import { getScraper } from './test-utils'; - -test('scraper can get profile', async () => { - const expected: Profile = { - avatar: - 'https://pbs.twimg.com/profile_images/436075027193004032/XlDa2oaz.jpeg', - banner: 'https://pbs.twimg.com/profile_banners/106037940/1541084318', - biography: 'nothing', - isPrivate: false, - isVerified: undefined, - isBlueVerified: false, - joined: new Date(Date.UTC(2010, 0, 18, 8, 49, 30, 0)), - location: 'Ukraine', - name: 'Nomadic', - pinnedTweetIds: [], - url: 'https://x.com/nomadic_ua', - userId: '106037940', - username: 'nomadic_ua', - website: 'https://nomadic.name', - }; - - const scraper = await getScraper(); - - const actual = await scraper.getProfile('nomadic_ua'); - expect(actual.avatar).toEqual(expected.avatar); - expect(actual.banner).toEqual(expected.banner); - expect(actual.biography).toEqual(expected.biography); - expect(actual.isPrivate).toEqual(expected.isPrivate); - expect(actual.isVerified).toEqual(expected.isVerified); - expect(actual.isBlueVerified).toEqual(expected.isBlueVerified); - expect(actual.joined).toEqual(expected.joined); - expect(actual.location).toEqual(expected.location); - expect(actual.name).toEqual(expected.name); - expect(actual.pinnedTweetIds).toEqual(expected.pinnedTweetIds); - expect(actual.url).toEqual(expected.url); - expect(actual.userId).toEqual(expected.userId); - expect(actual.username).toEqual(expected.username); - expect(actual.website).toEqual(expected.website); -}); - -test('scraper can get profile without logging in', async () => { - const expected: Profile = { - avatar: - 'https://pbs.twimg.com/profile_images/436075027193004032/XlDa2oaz.jpeg', - banner: 'https://pbs.twimg.com/profile_banners/106037940/1541084318', - biography: 'nothing', - isPrivate: false, - isVerified: undefined, - isBlueVerified: false, - joined: new Date(Date.UTC(2010, 0, 18, 8, 49, 30, 0)), - location: 'Ukraine', - name: 'Nomadic', - pinnedTweetIds: [], - url: 'https://x.com/nomadic_ua', - userId: '106037940', - username: 'nomadic_ua', - website: 'https://nomadic.name', - }; - - const scraper = await getScraper({ authMethod: 'anonymous' }); - - const actual = await scraper.getProfile('nomadic_ua'); - expect(actual.avatar).toEqual(expected.avatar); - expect(actual.banner).toEqual(expected.banner); - expect(actual.biography).toEqual(expected.biography); - expect(actual.isPrivate).toEqual(expected.isPrivate); - expect(actual.isVerified).toEqual(expected.isVerified); - expect(actual.isBlueVerified).toEqual(expected.isBlueVerified); - expect(actual.joined).toEqual(expected.joined); - expect(actual.location).toEqual(expected.location); - expect(actual.name).toEqual(expected.name); - expect(actual.pinnedTweetIds).toEqual(expected.pinnedTweetIds); - expect(actual.url).toEqual(expected.url); - expect(actual.userId).toEqual(expected.userId); - expect(actual.username).toEqual(expected.username); - expect(actual.website).toEqual(expected.website); -}); - -test('scraper can get partial private profile', async () => { - const expected: Profile = { - avatar: - 'https://pbs.twimg.com/profile_images/1612213936082030594/_HEsjv7Q.jpg', - banner: - 'https://pbs.twimg.com/profile_banners/1221221876849995777/1673110776', - biography: `t h e h e r m i t`, - isPrivate: true, - isVerified: false, - joined: new Date(Date.UTC(2020, 0, 26, 0, 3, 5, 0)), - location: 'sometimes', - name: 'private account', - pinnedTweetIds: [], - url: 'https://x.com/tomdumont', - userId: '1221221876849995777', - username: 'tomdumont', - website: undefined, - }; - - const scraper = await getScraper(); - - const actual = await scraper.getProfile('tomdumont'); - expect(actual.avatar).toEqual(expected.avatar); - expect(actual.banner).toEqual(expected.banner); - expect(actual.biography).toEqual(expected.biography); - expect(actual.isPrivate).toEqual(expected.isPrivate); - expect(actual.isVerified).toEqual(expected.isVerified); - expect(actual.joined).toEqual(expected.joined); - expect(actual.location).toEqual(expected.location); - expect(actual.name).toEqual(expected.name); - expect(actual.pinnedTweetIds).toEqual(expected.pinnedTweetIds); - expect(actual.url).toEqual(expected.url); - expect(actual.userId).toEqual(expected.userId); - expect(actual.username).toEqual(expected.username); - expect(actual.website).toEqual(expected.website); -}); - -test('scraper cannot get suspended profile', async () => { - const scraper = await getScraper(); - // taken from https://en.wikipedia.org/wiki/Twitter_suspensions#List_of_notable_suspensions - expect(scraper.getProfile('RobertC20041800')).rejects.toThrow(); -}); - -test('scraper cannot get not found profile', async () => { - const scraper = await getScraper(); - expect(scraper.getProfile('sample3123131')).rejects.toThrow(); -}); - -test('scraper can get profile by screen name', async () => { - const scraper = await getScraper(); - await scraper.getProfile('GeminiApp'); -}); - -test('scraper return error on suspended profile', async () => { - const scraper = await getScraper(); - await expect(scraper.getProfile('elon')).rejects.toThrow( - 'User is suspended.', - ); -}); diff --git a/twitter-scraper/src/profile.ts b/twitter-scraper/src/profile.ts deleted file mode 100644 index ab89ca0..0000000 --- a/twitter-scraper/src/profile.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { requestApi, RequestApiResult, bearerToken2 } from './api'; -import { TwitterAuth } from './auth'; -import { TwitterApiErrorRaw } from './errors'; -import { apiRequestFactory } from './api-data'; - -export interface CoreUserRaw { - created_at?: string; - name?: string; - screen_name?: string; -} - -export interface LegacyUserRaw { - created_at?: string; - description?: string; - entities?: { - url?: { - urls?: { - url?: string; - expanded_url?: string; - display_url?: string; - indices?: [number, number]; - }[]; - }; - description?: { - // TODO: Get the proper type of this. - urls?: any[]; - }; - }; - favourites_count?: number; - followers_count?: number; - friends_count?: number; - media_count?: number; - statuses_count?: number; - id_str?: string; - listed_count?: number; - name?: string; - location?: string; - geo_enabled?: boolean; - pinned_tweet_ids_str?: string[]; - profile_background_color?: string; - profile_banner_url?: string; - profile_image_url_https?: string; - protected?: boolean; - screen_name?: string; - verified?: boolean; - has_custom_timelines?: boolean; - has_extended_profile?: boolean; - url?: string; - can_dm?: boolean; - id?: number; - // TODO: Get the proper type of this. - utc_offset?: any; - // TODO: Get the proper type of this. - time_zone?: any; - // TODO: Get the proper type of this. - lang?: any; - contributors_enabled?: boolean; - is_translator?: boolean; - is_translation_enabled?: boolean; - profile_background_image_url?: string; - profile_background_image_url_https?: string; - profile_background_tile?: boolean; - profile_image_url?: string; - profile_link_color?: string; - profile_sidebar_border_color?: string; - profile_sidebar_fill_color?: string; - profile_text_color?: string; - profile_use_background_image?: boolean; - default_profile?: boolean; - default_profile_image?: boolean; - can_secret_dm?: boolean; - can_media_tag?: boolean; - following?: boolean; - follow_request_sent?: boolean; - notifications?: boolean; - blocking?: boolean; - subscribed_by?: boolean; - blocked_by?: boolean; - want_retweets?: boolean; - dm_blocked_by?: boolean; - dm_blocking?: boolean; - business_profile_state?: string; - translator_type?: string; - // TODO: Get the proper type of this. - withheld_in_countries?: any[]; - followed_by?: boolean; -} - -/** - * A parsed profile object. - */ -export interface Profile { - avatar?: string; - banner?: string; - biography?: string; - birthday?: string; - followersCount?: number; - followingCount?: number; - friendsCount?: number; - mediaCount?: number; - statusesCount?: number; - isPrivate?: boolean; - isVerified?: boolean; - isBlueVerified?: boolean; - joined?: Date; - likesCount?: number; - listedCount?: number; - location?: string; - name?: string; - pinnedTweetIds?: string[]; - tweetsCount?: number; - url?: string; - userId?: string; - username?: string; - website?: string; - canDm?: boolean; -} - -export interface UserRaw { - data: { - user: { - result: { - __typename?: string; - message?: string; - reason?: string; - rest_id?: string; - is_blue_verified?: boolean; - legacy: LegacyUserRaw; - core?: CoreUserRaw; - avatar?: { - image_url?: string; - }; - location?: { - location?: string; - }; - }; - }; - }; - errors?: TwitterApiErrorRaw[]; -} - -function getAvatarOriginalSizeUrl(avatarUrl: string | undefined) { - return avatarUrl ? avatarUrl.replace('_normal', '') : undefined; -} - -export function parseProfile( - legacy: LegacyUserRaw, - isBlueVerified?: boolean, -): Profile { - const profile: Profile = { - avatar: getAvatarOriginalSizeUrl(legacy.profile_image_url_https), - banner: legacy.profile_banner_url, - biography: legacy.description, - followersCount: legacy.followers_count, - followingCount: legacy.friends_count, - friendsCount: legacy.friends_count, - mediaCount: legacy.media_count, - isPrivate: legacy.protected ?? false, - isVerified: legacy.verified, - likesCount: legacy.favourites_count, - listedCount: legacy.listed_count, - location: legacy.location, - name: legacy.name, - pinnedTweetIds: legacy.pinned_tweet_ids_str, - tweetsCount: legacy.statuses_count, - url: `https://x.com/${legacy.screen_name}`, - userId: legacy.id_str, - username: legacy.screen_name, - isBlueVerified: isBlueVerified ?? false, - canDm: legacy.can_dm, - }; - - if (legacy.created_at != null) { - profile.joined = new Date(Date.parse(legacy.created_at)); - } - - const urls = legacy.entities?.url?.urls; - if (urls?.length != null && urls?.length > 0) { - profile.website = urls[0].expanded_url; - } - - return profile; -} - -export async function getProfile( - username: string, - auth: TwitterAuth, -): Promise> { - const request = apiRequestFactory.createUserByScreenNameRequest(); - request.variables.screen_name = username; - - // Use bearerToken2 for UserByScreenName endpoint - const res = await requestApi( - request.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - if (!res.success) { - return res; - } - - const { value } = res; - const { errors } = value; - if ( - (!value.data || !value.data.user || !value.data.user.result) && - errors != null && - errors.length > 0 - ) { - return { - success: false, - err: new Error(errors.map((e) => e.message).join('\n')), - }; - } - - if (!value.data || !value.data.user || !value.data.user.result) { - return { - success: false, - err: new Error('User not found.'), - }; - } - const { result: user } = value.data.user; - const { legacy } = user; - - if (user.__typename === 'UserUnavailable' && user?.reason === 'Suspended') { - return { - success: false, - err: new Error('User is suspended.'), - }; - } - - if (user.rest_id == null || user.rest_id.length === 0) { - return { - success: false, - err: new Error('rest_id not found.'), - }; - } - - legacy.id_str = user.rest_id; - legacy.screen_name ??= user.core?.screen_name; - legacy.profile_image_url_https ??= user.avatar?.image_url; - legacy.created_at ??= user.core?.created_at; - legacy.location ??= user.location?.location; - legacy.name ??= user.core?.name; - - if (legacy.screen_name == null || legacy.screen_name.length === 0) { - return { - success: false, - err: new Error(`User ${username} does not exist or is private.`), - }; - } - - return { - success: true, - value: parseProfile(legacy, user.is_blue_verified), - }; -} - -const idCache = new Map(); - -export async function getUserIdByScreenName( - screenName: string, - auth: TwitterAuth, -): Promise> { - const cached = idCache.get(screenName); - if (cached != null) { - return { success: true, value: cached }; - } - - const profileRes = await getProfile(screenName, auth); - if (!profileRes.success) { - return profileRes; - } - - const profile = profileRes.value; - if (profile.userId != null) { - idCache.set(screenName, profile.userId); - - return { - success: true, - value: profile.userId, - }; - } - - return { - success: false, - err: new Error('User ID is undefined.'), - }; -} diff --git a/twitter-scraper/src/rate-limit.test.ts b/twitter-scraper/src/rate-limit.test.ts deleted file mode 100644 index e06e6a6..0000000 --- a/twitter-scraper/src/rate-limit.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ApiError } from './errors'; -import { ErrorRateLimitStrategy } from './rate-limit'; - -test('error rate limit strategy throws error when triggered', async () => { - const strategy = new ErrorRateLimitStrategy(); - - await expect(() => - strategy.onRateLimit({ - fetchParameters: ['/', {}], - response: { - headers: new Headers(), - ok: false, - redirected: false, - status: 0, - statusText: '', - type: 'basic', - url: '', - clone: function (): Response { - throw new Error('Function not implemented.'); - }, - body: null, - bodyUsed: false, - arrayBuffer: function (): Promise { - throw new Error('Function not implemented.'); - }, - blob: function (): Promise { - throw new Error('Function not implemented.'); - }, - formData: function (): Promise { - throw new Error('Function not implemented.'); - }, - json: function (): Promise { - throw new Error('Function not implemented.'); - }, - text: function (): Promise { - throw new Error('Function not implemented.'); - }, - }, - }), - ).rejects.toThrow(ApiError); -}); diff --git a/twitter-scraper/src/rate-limit.ts b/twitter-scraper/src/rate-limit.ts deleted file mode 100644 index 76c3a92..0000000 --- a/twitter-scraper/src/rate-limit.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { FetchParameters } from './api-types'; -import { ApiError } from './errors'; -import debug from 'debug'; - -const log = debug('twitter-scraper:rate-limit'); - -/** - * Information about a rate-limiting event. Both the request and response - * information are provided. - */ -export interface RateLimitEvent { - /** The complete arguments that were passed to the fetch function. */ - fetchParameters: FetchParameters; - /** The failing HTTP response. */ - response: Response; -} - -/** - * The public interface for all rate-limiting strategies. Library consumers are - * welcome to provide their own implementations of this interface in the Scraper - * constructor options. - * - * The {@link RateLimitEvent} object contains both the request and response - * information associated with the event. - * - * @example - * import { Scraper, RateLimitStrategy } from "@the-convocation/twitter-scraper"; - * - * // A custom rate-limiting implementation that just logs request/response information. - * class ConsoleLogRateLimitStrategy implements RateLimitStrategy { - * async onRateLimit(event: RateLimitEvent): Promise { - * console.log(event.fetchParameters, event.response); - * } - * } - * - * const scraper = new Scraper({ - * rateLimitStrategy: new ConsoleLogRateLimitStrategy(), - * }); - */ -export interface RateLimitStrategy { - /** - * Called when the scraper is rate limited. - * @param event The event information, including the request and response info. - */ - onRateLimit(event: RateLimitEvent): Promise; -} - -/** - * A rate-limiting strategy that simply waits for the current rate limit period to expire. - * This has been known to take up to 13 minutes, in some cases. - */ -export class WaitingRateLimitStrategy implements RateLimitStrategy { - async onRateLimit({ response: res }: RateLimitEvent): Promise { - /* - Known headers at this point: - - x-rate-limit-limit: Maximum number of requests per time period? - - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset. - - x-rate-limit-remaining: Number of requests remaining in current time period? - */ - const xRateLimitLimit = res.headers.get('x-rate-limit-limit'); - const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining'); - const xRateLimitReset = res.headers.get('x-rate-limit-reset'); - - log( - `Rate limit event: limit=${xRateLimitLimit}, remaining=${xRateLimitRemaining}, reset=${xRateLimitReset}`, - ); - - if (xRateLimitRemaining == '0' && xRateLimitReset) { - const currentTime = new Date().valueOf() / 1000; - const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime); - - // I have seen this block for 800s (~13 *minutes*) - await new Promise((resolve) => setTimeout(resolve, timeDeltaMs)); - } - } -} - -/** - * A rate-limiting strategy that throws an {@link ApiError} when a rate limiting event occurs. - */ -export class ErrorRateLimitStrategy implements RateLimitStrategy { - async onRateLimit({ response: res }: RateLimitEvent): Promise { - throw await ApiError.fromResponse(res); - } -} diff --git a/twitter-scraper/src/relationships.test.ts b/twitter-scraper/src/relationships.test.ts deleted file mode 100644 index 88a8c78..0000000 --- a/twitter-scraper/src/relationships.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { getScraper } from './test-utils'; - -test('scraper can get profile followers', async () => { - const scraper = await getScraper(); - - const seenProfiles = new Map(); - const maxProfiles = 50; - let nProfiles = 0; - - const profiles = await scraper.getFollowers( - '1425600122885394432', - maxProfiles, - ); - - for await (const profile of profiles) { - nProfiles++; - - const id = profile.userId; - expect(id).toBeTruthy(); - - if (id != null) { - expect(seenProfiles.has(id)).toBeFalsy(); - seenProfiles.set(id, true); - } - - expect(profile.username).toBeTruthy(); - } - - expect(nProfiles).toEqual(maxProfiles); -}); - -test('scraper can get profile following', async () => { - const scraper = await getScraper(); - - const seenProfiles = new Map(); - const maxProfiles = 50; - let nProfiles = 0; - - const profiles = await scraper.getFollowing( - '1425600122885394432', - maxProfiles, - ); - - for await (const profile of profiles) { - nProfiles++; - - const id = profile.userId; - expect(id).toBeTruthy(); - - if (id != null) { - expect(seenProfiles.has(id)).toBeFalsy(); - seenProfiles.set(id, true); - } - - expect(profile.username).toBeTruthy(); - } - - expect(nProfiles).toEqual(maxProfiles); -}); diff --git a/twitter-scraper/src/relationships.ts b/twitter-scraper/src/relationships.ts deleted file mode 100644 index 5ee0797..0000000 --- a/twitter-scraper/src/relationships.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { bearerToken2, requestApi } from './api'; -import { TwitterAuth } from './auth'; -import { Profile } from './profile'; -import { QueryProfilesResponse } from './timeline-v1'; -import { getUserTimeline } from './timeline-async'; -import { - RelationshipTimeline, - parseRelationshipTimeline, -} from './timeline-relationship'; -import { AuthenticationError } from './errors'; -import { apiRequestFactory } from './api-data'; - -export function getFollowing( - userId: string, - maxProfiles: number, - auth: TwitterAuth, -): AsyncGenerator { - return getUserTimeline(userId, maxProfiles, (q, mt, c) => { - return fetchProfileFollowing(q, mt, auth, c); - }); -} - -export function getFollowers( - userId: string, - maxProfiles: number, - auth: TwitterAuth, -): AsyncGenerator { - return getUserTimeline(userId, maxProfiles, (q, mt, c) => { - return fetchProfileFollowers(q, mt, auth, c); - }); -} - -export async function fetchProfileFollowing( - userId: string, - maxProfiles: number, - auth: TwitterAuth, - cursor?: string, -): Promise { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError( - 'Scraper is not logged-in for profile following.', - ); - } - - const timeline = await getFollowingTimeline( - userId, - maxProfiles, - auth, - cursor, - ); - - return parseRelationshipTimeline(timeline); -} - -export async function fetchProfileFollowers( - userId: string, - maxProfiles: number, - auth: TwitterAuth, - cursor?: string, -): Promise { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError( - 'Scraper is not logged-in for profile followers.', - ); - } - - const timeline = await getFollowersTimeline( - userId, - maxProfiles, - auth, - cursor, - ); - - return parseRelationshipTimeline(timeline); -} - -async function getFollowingTimeline( - userId: string, - maxItems: number, - auth: TwitterAuth, - cursor?: string, -): Promise { - if (!auth.isLoggedIn()) { - throw new AuthenticationError( - 'Scraper is not logged-in for profile following.', - ); - } - - if (maxItems > 50) { - maxItems = 50; - } - - const followingRequest = apiRequestFactory.createFollowingRequest(); - followingRequest.variables.userId = userId; - followingRequest.variables.count = maxItems; - followingRequest.variables.includePromotedContent = false; - - if (cursor != null && cursor != '') { - followingRequest.variables.cursor = cursor; - } - - const res = await requestApi( - followingRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return res.value; -} - -async function getFollowersTimeline( - userId: string, - maxItems: number, - auth: TwitterAuth, - cursor?: string, -): Promise { - if (!auth.isLoggedIn()) { - throw new AuthenticationError( - 'Scraper is not logged-in for profile followers.', - ); - } - - if (maxItems > 50) { - maxItems = 50; - } - - const followersRequest = apiRequestFactory.createFollowersRequest(); - followersRequest.variables.userId = userId; - followersRequest.variables.count = maxItems; - followersRequest.variables.includePromotedContent = false; - - if (cursor != null && cursor != '') { - followersRequest.variables.cursor = cursor; - } - - const res = await requestApi( - followersRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return res.value; -} diff --git a/twitter-scraper/src/requests.ts b/twitter-scraper/src/requests.ts deleted file mode 100644 index 3d0e268..0000000 --- a/twitter-scraper/src/requests.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Cookie, CookieJar } from 'tough-cookie'; -import setCookie from 'set-cookie-parser'; -import type { Headers as HeadersPolyfill } from 'headers-polyfill'; -import debug from 'debug'; - -const log = debug('twitter-scraper:requests'); - -/** - * Updates a cookie jar with the Set-Cookie headers from the provided Headers instance. - * @param cookieJar The cookie jar to update. - * @param headers The response headers to populate the cookie jar with. - */ -export async function updateCookieJar( - cookieJar: CookieJar, - headers: Headers | HeadersPolyfill, -) { - // Try to use getSetCookie() if available (proper way to get all set-cookie headers) - let setCookieHeaders: string[] = []; - - if (typeof headers.getSetCookie === 'function') { - setCookieHeaders = headers.getSetCookie(); - } else { - // Fallback: get the single set-cookie header - const setCookieHeader = headers.get('set-cookie'); - if (setCookieHeader) { - // Split combined set-cookie headers - setCookieHeaders = setCookie.splitCookiesString(setCookieHeader); - } - } - - if (setCookieHeaders.length > 0) { - for (const cookieStr of setCookieHeaders) { - const cookie = Cookie.parse(cookieStr); - if (!cookie) { - log(`Failed to parse cookie: ${cookieStr.substring(0, 100)}`); - continue; - } - - // Skip cookies that are being explicitly deleted (Max-Age=0 or expired) - // This prevents twitter from clearing important cookies like ct0 - if ( - cookie.maxAge === 0 || - (cookie.expires && cookie.expires < new Date()) - ) { - if (cookie.key === 'ct0') { - log(`Skipping deletion of ct0 cookie (Max-Age=0)`); - } - continue; - } - - try { - const url = `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${ - cookie.path - }`; - await cookieJar.setCookie(cookie, url); - if (cookie.key === 'ct0') { - log( - `Successfully set ct0 cookie with value: ${cookie.value.substring( - 0, - 20, - )}...`, - ); - } - } catch (err) { - // Log cookie setting errors - log(`Failed to set cookie ${cookie.key}: ${err}`); - if (cookie.key === 'ct0') { - log(`FAILED to set ct0 cookie! Error: ${err}`); - } - } - } - } else if (typeof document !== 'undefined') { - for (const cookie of document.cookie.split(';')) { - const hardCookie = Cookie.parse(cookie); - if (hardCookie) { - await cookieJar.setCookie(hardCookie, document.location.toString()); - } - } - } -} diff --git a/twitter-scraper/src/scraper.test.ts b/twitter-scraper/src/scraper.test.ts deleted file mode 100644 index e88fea9..0000000 --- a/twitter-scraper/src/scraper.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ErrorRateLimitStrategy } from './rate-limit'; -import { Scraper } from './scraper'; - -test('scraper uses request transform when provided', async () => { - const scraper = new Scraper({ - transform: { - // Should throw "TypeError: Only absolute URLs are supported" - request: () => [''], - }, - }); - - await expect(scraper.getLatestTweet('twitter')).rejects.toThrowError( - TypeError, - ); -}); - -test('scraper uses response transform when provided', async () => { - const scraper = new Scraper({ - transform: { - response: (response) => - new Proxy(response, { - get(target, p, receiver) { - if (p === 'status') { - return 400; - } - - if (p === 'ok') { - return false; - } - - return Reflect.get(target, p, receiver); - }, - }), - }, - }); - - await expect(scraper.getLatestTweet('twitter')).rejects.toThrowError(); -}); diff --git a/twitter-scraper/src/scraper.ts b/twitter-scraper/src/scraper.ts deleted file mode 100644 index 4b259d0..0000000 --- a/twitter-scraper/src/scraper.ts +++ /dev/null @@ -1,626 +0,0 @@ -import { Cookie } from 'tough-cookie'; -import { bearerToken, FetchTransformOptions, RequestApiResult } from './api'; -import { TwitterAuth, TwitterAuthOptions, TwitterGuestAuth } from './auth'; -import { FlowSubtaskHandler, TwitterUserAuth } from './auth-user'; -import { getProfile, getUserIdByScreenName, Profile } from './profile'; -import { - fetchSearchProfiles, - fetchSearchTweets, - SearchMode, - searchProfiles, - searchTweets, -} from './search'; -import { - fetchProfileFollowing, - fetchProfileFollowers, - getFollowing, - getFollowers, -} from './relationships'; -import { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1'; -import { getTrends } from './trends'; -import { - Tweet, - getTweetAnonymous, - getTweets, - getLatestTweet, - getLikedTweets, - getTweetWhere, - getTweetsWhere, - getTweetsByUserId, - TweetQuery, - getTweet, - fetchListTweets, - getTweetsAndRepliesByUserId, - getTweetsAndReplies, - fetchLikedTweets, -} from './tweets'; -import fetch from 'cross-fetch'; -import { RateLimitStrategy } from './rate-limit'; -import { - DmConversationTimeline, - DmInbox, - DmMessageEntry, - DmCursorOptions, - getDmConversation, - getDmMessages, - getDmInbox, - findDmConversationsByUserId, - DmConversation, -} from './direct-messages'; - -const twUrl = 'https://x.com'; - -export interface ScraperOptions { - /** - * An alternative fetch function to use instead of the default fetch function. This may be useful - * in nonstandard runtime environments, such as edge workers. - */ - fetch: typeof fetch; - - /** - * Additional options that control how requests and responses are processed. This can be used to - * proxy requests through other hosts, for example. - */ - transform: Partial; - - /** - * A handling strategy for rate limits (HTTP 429). - */ - rateLimitStrategy: RateLimitStrategy; - - /** - * Experimental features that may be added, changed, or removed at any time. Use with caution. - */ - experimental: { - /** - * Enables the generation of the `x-client-transaction-id` header on requests. This may resolve some errors. - */ - xClientTransactionId: boolean; - /** - * Enables the generation of the `x-xp-forwarded-for` header on requests. This may resolve some errors. - */ - xpff: boolean; - }; -} - -/** - * An interface to Twitter's undocumented API. - * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily. - */ -export class Scraper { - private auth!: TwitterAuth; - private authTrends!: TwitterAuth; - private token: string; - - /** - * Creates a new Scraper object. - * - Scrapers maintain their own guest tokens for Twitter's internal API. - * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily. - */ - constructor(private readonly options?: Partial) { - this.token = bearerToken; - this.useGuestAuth(); - } - - /** - * Registers a subtask handler for the given subtask ID. This - * will override any existing handler for the same subtask. - * @param subtaskId The ID of the subtask to register the handler for. - * @param subtaskHandler The handler function to register. - */ - public registerAuthSubtaskHandler( - subtaskId: string, - subtaskHandler: FlowSubtaskHandler, - ): void { - if (this.auth instanceof TwitterUserAuth) { - this.auth.registerSubtaskHandler(subtaskId, subtaskHandler); - } - - if (this.authTrends instanceof TwitterUserAuth) { - this.authTrends.registerSubtaskHandler(subtaskId, subtaskHandler); - } - } - - /** - * Initializes auth properties using a guest token. - * Used when creating a new instance of this class, and when logging out. - * @internal - */ - private useGuestAuth() { - this.auth = new TwitterGuestAuth(this.token, this.getAuthOptions()); - this.authTrends = new TwitterGuestAuth(this.token, this.getAuthOptions()); - } - - /** - * Fetches a Twitter profile. - * @param username The Twitter username of the profile to fetch, without an `@` at the beginning. - * @returns The requested {@link Profile}. - */ - public async getProfile(username: string): Promise { - const res = await getProfile(username, this.auth); - return this.handleResponse(res); - } - - /** - * Fetches the user ID corresponding to the provided screen name. - * @param screenName The Twitter screen name of the profile to fetch. - * @returns The ID of the corresponding account. - */ - public async getUserIdByScreenName(screenName: string): Promise { - const res = await getUserIdByScreenName(screenName, this.auth); - return this.handleResponse(res); - } - - /** - * Fetches tweets from Twitter. - * @param query The search query. Any Twitter-compatible query format can be used. - * @param maxTweets The maximum number of tweets to return. - * @param includeReplies Whether or not replies should be included in the response. - * @param searchMode The category filter to apply to the search. Defaults to `Top`. - * @returns An {@link AsyncGenerator} of tweets matching the provided filters. - */ - public searchTweets( - query: string, - maxTweets: number, - searchMode: SearchMode = SearchMode.Top, - ): AsyncGenerator { - return searchTweets(query, maxTweets, searchMode, this.auth); - } - - /** - * Fetches profiles from Twitter. - * @param query The search query. Any Twitter-compatible query format can be used. - * @param maxProfiles The maximum number of profiles to return. - * @returns An {@link AsyncGenerator} of tweets matching the provided filter(s). - */ - public searchProfiles( - query: string, - maxProfiles: number, - ): AsyncGenerator { - return searchProfiles(query, maxProfiles, this.auth); - } - - /** - * Fetches tweets from Twitter. - * @param query The search query. Any Twitter-compatible query format can be used. - * @param maxTweets The maximum number of tweets to return. - * @param includeReplies Whether or not replies should be included in the response. - * @param searchMode The category filter to apply to the search. Defaults to `Top`. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchSearchTweets( - query: string, - maxTweets: number, - searchMode: SearchMode, - cursor?: string, - ): Promise { - return fetchSearchTweets(query, maxTweets, searchMode, this.auth, cursor); - } - - /** - * Fetches profiles from Twitter. - * @param query The search query. Any Twitter-compatible query format can be used. - * @param maxProfiles The maximum number of profiles to return. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchSearchProfiles( - query: string, - maxProfiles: number, - cursor?: string, - ): Promise { - return fetchSearchProfiles(query, maxProfiles, this.auth, cursor); - } - - /** - * Fetches list tweets from Twitter. - * @param listId The list id - * @param maxTweets The maximum number of tweets to return. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchListTweets( - listId: string, - maxTweets: number, - cursor?: string, - ): Promise { - return fetchListTweets(listId, maxTweets, cursor, this.auth); - } - - /** - * Fetch the tweets a user has liked - * @param userId The user whose liked tweets should be returned - * @param maxTweets The maximum number of tweets to return. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchLikedTweets( - userId: string, - maxTweets: number, - cursor?: string, - ): Promise { - return fetchLikedTweets(userId, maxTweets, cursor, this.auth); - } - - /** - * Fetch the profiles a user is following - * @param userId The user whose following should be returned - * @param maxProfiles The maximum number of profiles to return. - * @returns An {@link AsyncGenerator} of following profiles for the provided user. - */ - public getFollowing( - userId: string, - maxProfiles: number, - ): AsyncGenerator { - return getFollowing(userId, maxProfiles, this.auth); - } - - /** - * Fetch the profiles that follow a user - * @param userId The user whose followers should be returned - * @param maxProfiles The maximum number of profiles to return. - * @returns An {@link AsyncGenerator} of profiles following the provided user. - */ - public getFollowers( - userId: string, - maxProfiles: number, - ): AsyncGenerator { - return getFollowers(userId, maxProfiles, this.auth); - } - - /** - * Fetches following profiles from Twitter. - * @param userId The user whose following should be returned - * @param maxProfiles The maximum number of profiles to return. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchProfileFollowing( - userId: string, - maxProfiles: number, - cursor?: string, - ): Promise { - return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor); - } - - /** - * Fetches profile followers from Twitter. - * @param userId The user whose following should be returned - * @param maxProfiles The maximum number of profiles to return. - * @param cursor The search cursor, which can be passed into further requests for more results. - * @returns A page of results, containing a cursor that can be used in further requests. - */ - public fetchProfileFollowers( - userId: string, - maxProfiles: number, - cursor?: string, - ): Promise { - return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor); - } - - /** - * Fetches the current trends from Twitter. - * @returns The current list of trends. - */ - public getTrends(): Promise { - return getTrends(this.authTrends); - } - - /** - * Fetches tweets from a Twitter user. - * @param user The user whose tweets should be returned. - * @param maxTweets The maximum number of tweets to return. Defaults to `200`. - * @returns An {@link AsyncGenerator} of tweets from the provided user. - */ - public getTweets(user: string, maxTweets = 200): AsyncGenerator { - return getTweets(user, maxTweets, this.auth); - } - - /** - * Fetches liked tweets from a Twitter user. Requires authentication. - * @param user The user whose likes should be returned. - * @param maxTweets The maximum number of tweets to return. Defaults to `200`. - * @returns An {@link AsyncGenerator} of liked tweets from the provided user. - */ - public getLikedTweets(user: string, maxTweets = 200): AsyncGenerator { - return getLikedTweets(user, maxTweets, this.auth); - } - - /** - * Fetches tweets from a Twitter user using their ID. - * @param userId The user whose tweets should be returned. - * @param maxTweets The maximum number of tweets to return. Defaults to `200`. - * @returns An {@link AsyncGenerator} of tweets from the provided user. - */ - public getTweetsByUserId( - userId: string, - maxTweets = 200, - ): AsyncGenerator { - return getTweetsByUserId(userId, maxTweets, this.auth); - } - - /** - * Fetches tweets and replies from a Twitter user. - * @param user The user whose tweets should be returned. - * @param maxTweets The maximum number of tweets to return. Defaults to `200`. - * @returns An {@link AsyncGenerator} of tweets from the provided user. - */ - public getTweetsAndReplies( - user: string, - maxTweets = 200, - ): AsyncGenerator { - return getTweetsAndReplies(user, maxTweets, this.auth); - } - - /** - * Fetches tweets and replies from a Twitter user using their ID. - * @param userId The user whose tweets should be returned. - * @param maxTweets The maximum number of tweets to return. Defaults to `200`. - * @returns An {@link AsyncGenerator} of tweets from the provided user. - */ - public getTweetsAndRepliesByUserId( - userId: string, - maxTweets = 200, - ): AsyncGenerator { - return getTweetsAndRepliesByUserId(userId, maxTweets, this.auth); - } - - /** - * Fetches the first tweet matching the given query. - * - * Example: - * ```js - * const timeline = scraper.getTweets('user', 200); - * const retweet = await scraper.getTweetWhere(timeline, { isRetweet: true }); - * ``` - * @param tweets The {@link AsyncIterable} of tweets to search through. - * @param query A query to test **all** tweets against. This may be either an - * object of key/value pairs or a predicate. If this query is an object, all - * key/value pairs must match a {@link Tweet} for it to be returned. If this query - * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned. - * - All keys are optional. - * - If specified, the key must be implemented by that of {@link Tweet}. - */ - public getTweetWhere( - tweets: AsyncIterable, - query: TweetQuery, - ): Promise { - return getTweetWhere(tweets, query); - } - - /** - * Fetches all tweets matching the given query. - * - * Example: - * ```js - * const timeline = scraper.getTweets('user', 200); - * const retweets = await scraper.getTweetsWhere(timeline, { isRetweet: true }); - * ``` - * @param tweets The {@link AsyncIterable} of tweets to search through. - * @param query A query to test **all** tweets against. This may be either an - * object of key/value pairs or a predicate. If this query is an object, all - * key/value pairs must match a {@link Tweet} for it to be returned. If this query - * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned. - * - All keys are optional. - * - If specified, the key must be implemented by that of {@link Tweet}. - */ - public getTweetsWhere( - tweets: AsyncIterable, - query: TweetQuery, - ): Promise { - return getTweetsWhere(tweets, query); - } - - /** - * Fetches the most recent tweet from a Twitter user. - * @param user The user whose latest tweet should be returned. - * @param includeRetweets Whether or not to include retweets. Defaults to `false`. - * @returns The {@link Tweet} object or `null`/`undefined` if it couldn't be fetched. - */ - public getLatestTweet( - user: string, - includeRetweets = false, - max = 200, - ): Promise { - return getLatestTweet(user, includeRetweets, max, this.auth); - } - - /** - * Fetches a single tweet. - * @param id The ID of the tweet to fetch. - * @returns The {@link Tweet} object, or `null` if it couldn't be fetched. - */ - public getTweet(id: string): Promise { - if (this.auth instanceof TwitterUserAuth) { - return getTweet(id, this.auth); - } else { - return getTweetAnonymous(id, this.auth); - } - } - - /** - * Retrieves the direct message inbox for the authenticated user. - * - * @return A promise that resolves to an object representing the direct message inbox. - */ - public getDmInbox(): Promise { - return getDmInbox(this.auth); - } - - /** - * Retrieves the direct message conversation for the specified conversation ID. - * - * @param conversationId - The unique identifier of the DM conversation to retrieve. - * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages). - * @return A promise that resolves to the timeline of the DM conversation. - */ - public getDmConversation( - conversationId: string, - cursor?: DmCursorOptions, - ): Promise { - return getDmConversation(conversationId, cursor, this.auth); - } - - /** - * Retrieves direct messages from a specific conversation. - * - * @param conversationId - The unique identifier of the conversation to fetch messages from. - * @param [maxMessages=20] - The maximum number of messages to retrieve per request. - * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages). - * @returns An {@link AsyncGenerator} of messages from the provided conversation. - */ - public getDmMessages( - conversationId: string, - maxMessages = 20, - cursor?: DmCursorOptions, - ): AsyncGenerator { - return getDmMessages(conversationId, maxMessages, cursor, this.auth); - } - - /** - * Retrieves a list of direct message conversations for a specific user based on their user ID. - * - * @param inbox - The DM inbox containing all available conversations. - * @param userId - The unique identifier of the user whose DM conversations are to be retrieved. - * @return An array of DM conversations associated with the specified user ID. - */ - public findDmConversationsByUserId( - inbox: DmInbox, - userId: string, - ): DmConversation[] { - return findDmConversationsByUserId(inbox, userId); - } - - /** - * Returns if the scraper has a guest token. The token may not be valid. - * @returns `true` if the scraper has a guest token; otherwise `false`. - */ - public hasGuestToken(): boolean { - return this.auth.hasToken() || this.authTrends.hasToken(); - } - - /** - * Returns if the scraper is logged in as a real user. - * @returns `true` if the scraper is logged in with a real user account; otherwise `false`. - */ - public async isLoggedIn(): Promise { - return ( - (await this.auth.isLoggedIn()) && (await this.authTrends.isLoggedIn()) - ); - } - - /** - * Login to Twitter as a real Twitter account. This enables running - * searches. - * @param username The username of the Twitter account to login with. - * @param password The password of the Twitter account to login with. - * @param email The email to log in with, if you have email confirmation enabled. - * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled. - */ - public async login( - username: string, - password: string, - email?: string, - twoFactorSecret?: string, - ): Promise { - // Swap in a real authorizer for all requests - const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions()); - await userAuth.login(username, password, email, twoFactorSecret); - this.auth = userAuth; - this.authTrends = userAuth; - } - - /** - * Log out of Twitter. - */ - public async logout(): Promise { - await this.auth.logout(); - await this.authTrends.logout(); - - // Swap in guest authorizers for all requests - this.useGuestAuth(); - } - - /** - * Retrieves all cookies for the current session. - * @returns All cookies for the current session. - */ - public async getCookies(): Promise { - return await this.authTrends - .cookieJar() - .getCookies( - typeof document !== 'undefined' ? document.location.toString() : twUrl, - ); - } - - /** - * Set cookies for the current session. - * @param cookies The cookies to set for the current session. - */ - public async setCookies(cookies: (string | Cookie)[]): Promise { - const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions()); - for (const cookie of cookies) { - await userAuth.cookieJar().setCookie(cookie, twUrl); - } - - this.auth = userAuth; - this.authTrends = userAuth; - } - - /** - * Clear all cookies for the current session. - */ - public async clearCookies(): Promise { - await this.auth.cookieJar().removeAllCookies(); - await this.authTrends.cookieJar().removeAllCookies(); - } - - /** - * Sets the optional cookie to be used in requests. - * @param _cookie The cookie to be used in requests. - * @deprecated This function no longer represents any part of Twitter's auth flow. - * @returns This scraper instance. - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public withCookie(_cookie: string): Scraper { - console.warn( - 'Warning: Scraper#withCookie is deprecated and will be removed in a later version. Use Scraper#login or Scraper#setCookies instead.', - ); - return this; - } - - /** - * Sets the optional CSRF token to be used in requests. - * @param _token The CSRF token to be used in requests. - * @deprecated This function no longer represents any part of Twitter's auth flow. - * @returns This scraper instance. - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public withXCsrfToken(_token: string): Scraper { - console.warn( - 'Warning: Scraper#withXCsrfToken is deprecated and will be removed in a later version.', - ); - return this; - } - - private getAuthOptions(): Partial { - return { - fetch: this.options?.fetch, - transform: this.options?.transform, - rateLimitStrategy: this.options?.rateLimitStrategy, - experimental: { - xClientTransactionId: this.options?.experimental?.xClientTransactionId, - xpff: this.options?.experimental?.xpff, - }, - }; - } - - private handleResponse(res: RequestApiResult): T { - if (!res.success) { - throw res.err; - } - - return res.value; - } -} diff --git a/twitter-scraper/src/search.test.ts b/twitter-scraper/src/search.test.ts deleted file mode 100644 index bf60fce..0000000 --- a/twitter-scraper/src/search.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { getScraper } from './test-utils'; -import { SearchMode } from './search'; -import { QueryTweetsResponse } from './timeline-v1'; - -test('scraper can process search cursor', async () => { - const scraper = await getScraper(); - - let cursor: string | undefined = undefined; - const maxTweets = 30; - let nTweets = 0; - while (nTweets < maxTweets) { - const res: QueryTweetsResponse = await scraper.fetchSearchTweets( - 'twitter', - maxTweets, - SearchMode.Top, - cursor, - ); - - expect(res.next).toBeTruthy(); - - nTweets += res.tweets.length; - cursor = res.next; - } -}, 30000); - -test('scraper can search profiles', async () => { - const scraper = await getScraper(); - - const seenProfiles = new Map(); - const maxProfiles = 150; - let nProfiles = 0; - - const profiles = scraper.searchProfiles('Twitter', maxProfiles); - for await (const profile of profiles) { - nProfiles++; - - const profileId = profile.userId; - expect(profileId).toBeTruthy(); - - if (profileId != null) { - expect(seenProfiles.has(profileId)).toBeFalsy(); - seenProfiles.set(profileId, true); - } - } - - expect(nProfiles).toEqual(maxProfiles); -}, 30000); - -test('scraper can search tweets', async () => { - const scraper = await getScraper(); - - const seenTweets = new Map(); - const maxTweets = 150; - let nTweets = 0; - - const profiles = scraper.searchTweets( - 'twitter', - maxTweets, - SearchMode.Latest, - ); - - for await (const tweet of profiles) { - nTweets++; - - const id = tweet.id; - expect(id).toBeTruthy(); - - if (id != null) { - expect(seenTweets.has(id)).toBeFalsy(); - seenTweets.set(id, true); - } - - expect(tweet.permanentUrl).toBeTruthy(); - expect(tweet.isRetweet).toBeFalsy(); - expect(tweet.text).toBeTruthy(); - } - - expect(nTweets).toEqual(maxTweets); -}, 30000); diff --git a/twitter-scraper/src/search.ts b/twitter-scraper/src/search.ts deleted file mode 100644 index 2c06670..0000000 --- a/twitter-scraper/src/search.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { bearerToken2, requestApi } from './api'; -import { TwitterAuth } from './auth'; -import { Profile } from './profile'; -import { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1'; -import { getTweetTimeline, getUserTimeline } from './timeline-async'; -import { Tweet } from './tweets'; -import { - SearchTimeline, - parseSearchTimelineTweets, - parseSearchTimelineUsers, -} from './timeline-search'; -import { AuthenticationError } from './errors'; -import { apiRequestFactory } from './api-data'; - -/** - * The categories that can be used in Twitter searches. - */ -export enum SearchMode { - Top, - Latest, - Photos, - Videos, - Users, -} - -export function searchTweets( - query: string, - maxTweets: number, - searchMode: SearchMode, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(query, maxTweets, (q, mt, c) => { - return fetchSearchTweets(q, mt, searchMode, auth, c); - }); -} - -export function searchProfiles( - query: string, - maxProfiles: number, - auth: TwitterAuth, -): AsyncGenerator { - return getUserTimeline(query, maxProfiles, (q, mt, c) => { - return fetchSearchProfiles(q, mt, auth, c); - }); -} - -export async function fetchSearchTweets( - query: string, - maxTweets: number, - searchMode: SearchMode, - auth: TwitterAuth, - cursor?: string, -): Promise { - const timeline = await getSearchTimeline( - query, - maxTweets, - searchMode, - auth, - cursor, - ); - - return parseSearchTimelineTweets(timeline); -} - -export async function fetchSearchProfiles( - query: string, - maxProfiles: number, - auth: TwitterAuth, - cursor?: string, -): Promise { - const timeline = await getSearchTimeline( - query, - maxProfiles, - SearchMode.Users, - auth, - cursor, - ); - - return parseSearchTimelineUsers(timeline); -} - -async function getSearchTimeline( - query: string, - maxItems: number, - searchMode: SearchMode, - auth: TwitterAuth, - cursor?: string, -): Promise { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError('Scraper is not logged-in for search.'); - } - - if (maxItems > 50) { - maxItems = 50; - } - - const searchTimelineRequest = apiRequestFactory.createSearchTimelineRequest(); - searchTimelineRequest.variables.rawQuery = query; - searchTimelineRequest.variables.count = maxItems; - searchTimelineRequest.variables.querySource = 'typed_query'; - searchTimelineRequest.variables.product = 'Top'; - - if (cursor != null && cursor != '') { - searchTimelineRequest.variables['cursor'] = cursor; - } - - switch (searchMode) { - case SearchMode.Latest: - searchTimelineRequest.variables.product = 'Latest'; - break; - case SearchMode.Photos: - searchTimelineRequest.variables.product = 'Photos'; - break; - case SearchMode.Videos: - searchTimelineRequest.variables.product = 'Videos'; - break; - case SearchMode.Users: - searchTimelineRequest.variables.product = 'People'; - break; - default: - break; - } - - const res = await requestApi( - searchTimelineRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return res.value; -} diff --git a/twitter-scraper/src/test-utils.ts b/twitter-scraper/src/test-utils.ts deleted file mode 100644 index ba76f03..0000000 --- a/twitter-scraper/src/test-utils.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { HttpsProxyAgent } from 'https-proxy-agent'; -import { Scraper } from './scraper'; -import { Cookie } from 'tough-cookie'; -import dotenv from 'dotenv'; -import { cycleTLSFetch } from './cycletls-fetch'; - -dotenv.config({ path: '.env.local' }); - -export interface ScraperTestOptions { - /** - * Force the scraper to use username/password to authenticate instead of cookies. Only used - * by this file for testing auth, but very unreliable. Should always use cookies to resume - * session when possible. - */ - authMethod: 'password' | 'cookies' | 'anonymous'; -} - -export async function getScraper( - options: Partial = { authMethod: 'cookies' }, -) { - const username = process.env['TWITTER_USERNAME']; - const password = process.env['TWITTER_PASSWORD']; - const email = process.env['TWITTER_EMAIL']; - const twoFactorSecret = process.env['TWITTER_2FA_SECRET']; - const cookies = process.env['TWITTER_COOKIES']; - const proxyUrl = process.env['PROXY_URL']; - let agent: any; - - if (options.authMethod === 'cookies' && !cookies) { - console.warn( - 'TWITTER_COOKIES variable is not defined, reverting to password auth (not recommended)', - ); - options.authMethod = 'password'; - } - - if (options.authMethod === 'password' && !(username && password)) { - throw new Error( - 'TWITTER_USERNAME and TWITTER_PASSWORD variables must be defined.', - ); - } - - if (proxyUrl) { - agent = new HttpsProxyAgent(proxyUrl, { - rejectUnauthorized: false, - }); - } - - const scraper = new Scraper({ - fetch: cycleTLSFetch, - transform: { - request: (input, init) => { - if (agent) { - return [input, { ...init, agent }]; - } - return [input, init]; - }, - }, - experimental: { - xClientTransactionId: true, - xpff: true, - }, - }); - - if (options.authMethod === 'password') { - await scraper.login(username!, password!, email, twoFactorSecret); - } else if (options.authMethod === 'cookies') { - await scraper.setCookies( - JSON.parse(cookies!).map((c: string) => Cookie.fromJSON(c)), - ); - } - - return scraper; -} diff --git a/twitter-scraper/src/timeline-async.ts b/twitter-scraper/src/timeline-async.ts deleted file mode 100644 index fa0d874..0000000 --- a/twitter-scraper/src/timeline-async.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { jitter } from './api'; -import { Profile } from './profile'; -import { Tweet } from './tweets'; - -export interface FetchProfilesResponse { - profiles: Profile[]; - next?: string; -} - -export type FetchProfiles = ( - query: string, - maxProfiles: number, - cursor: string | undefined, -) => Promise; - -export interface FetchTweetsResponse { - tweets: Tweet[]; - next?: string; -} - -export type FetchTweets = ( - query: string, - maxTweets: number, - cursor: string | undefined, -) => Promise; - -export async function* getUserTimeline( - query: string, - maxProfiles: number, - fetchFunc: FetchProfiles, -): AsyncGenerator { - let nProfiles = 0; - let cursor: string | undefined = undefined; - let consecutiveEmptyBatches = 0; - while (nProfiles < maxProfiles) { - const batch: FetchProfilesResponse = await fetchFunc( - query, - maxProfiles, - cursor, - ); - - const { profiles, next } = batch; - cursor = next; - - if (profiles.length === 0) { - consecutiveEmptyBatches++; - if (consecutiveEmptyBatches > 5) break; - } else consecutiveEmptyBatches = 0; - - for (const profile of profiles) { - if (nProfiles < maxProfiles) yield profile; - else break; - nProfiles++; - } - - if (!next) break; - - await jitter(1000); - } -} - -export async function* getTweetTimeline( - query: string, - maxTweets: number, - fetchFunc: FetchTweets, -): AsyncGenerator { - let nTweets = 0; - let cursor: string | undefined = undefined; - while (nTweets < maxTweets) { - const batch: FetchTweetsResponse = await fetchFunc( - query, - maxTweets, - cursor, - ); - - const { tweets, next } = batch; - - if (tweets.length === 0) { - break; - } - - for (const tweet of tweets) { - if (nTweets < maxTweets) { - cursor = next; - yield tweet; - } else { - break; - } - - nTweets++; - } - - await jitter(1000); - } -} diff --git a/twitter-scraper/src/timeline-list.ts b/twitter-scraper/src/timeline-list.ts deleted file mode 100644 index 6b7b0cd..0000000 --- a/twitter-scraper/src/timeline-list.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { QueryTweetsResponse } from './timeline-v1'; -import { parseAndPush, TimelineEntryRaw } from './timeline-v2'; -import { Tweet } from './tweets'; - -export interface ListTimeline { - data?: { - list?: { - tweets_timeline?: { - timeline?: { - instructions?: { - entries?: TimelineEntryRaw[]; - entry?: TimelineEntryRaw; - type?: string; - }[]; - }; - }; - }; - }; -} - -export function parseListTimelineTweets( - timeline: ListTimeline, -): QueryTweetsResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const tweets: Tweet[] = []; - const instructions = - timeline.data?.list?.tweets_timeline?.timeline?.instructions ?? []; - for (const instruction of instructions) { - const entries = instruction.entries ?? []; - - for (const entry of entries) { - const entryContent = entry.content; - if (!entryContent) continue; - - if (entryContent.cursorType === 'Bottom') { - bottomCursor = entryContent.value; - continue; - } else if (entryContent.cursorType === 'Top') { - topCursor = entryContent.value; - continue; - } - - const idStr = entry.entryId; - if ( - !idStr.startsWith('tweet') && - !idStr.startsWith('list-conversation') - ) { - continue; - } - - if (entryContent.itemContent) { - parseAndPush(tweets, entryContent.itemContent, idStr); - } else if (entryContent.items) { - for (const contentItem of entryContent.items) { - if ( - contentItem.item && - contentItem.item.itemContent && - contentItem.entryId - ) { - parseAndPush( - tweets, - contentItem.item.itemContent, - contentItem.entryId.split('tweet-')[1], - ); - } - } - } - } - } - - return { tweets, next: bottomCursor, previous: topCursor }; -} diff --git a/twitter-scraper/src/timeline-relationship.ts b/twitter-scraper/src/timeline-relationship.ts deleted file mode 100644 index ed5a7db..0000000 --- a/twitter-scraper/src/timeline-relationship.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Profile, parseProfile } from './profile'; -import { QueryProfilesResponse } from './timeline-v1'; -import { TimelineUserResultRaw } from './timeline-v2'; - -export interface RelationshipEntryItemContentRaw { - itemType?: string; - userDisplayType?: string; - user_results?: { - result?: TimelineUserResultRaw; - }; -} - -export interface RelationshipEntryRaw { - entryId: string; - sortIndex: string; - content?: { - cursorType?: string; - entryType?: string; - __typename?: string; - value?: string; - itemContent?: RelationshipEntryItemContentRaw; - }; -} - -export interface RelationshipTimeline { - data?: { - user?: { - result?: { - timeline?: { - timeline?: { - instructions?: { - entries?: RelationshipEntryRaw[]; - entry?: RelationshipEntryRaw; - type?: string; - }[]; - }; - }; - }; - }; - }; -} - -export function parseRelationshipTimeline( - timeline: RelationshipTimeline, -): QueryProfilesResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const profiles: Profile[] = []; - const instructions = - timeline.data?.user?.result?.timeline?.timeline?.instructions ?? []; - - for (const instruction of instructions) { - if ( - instruction.type === 'TimelineAddEntries' || - instruction.type === 'TimelineReplaceEntry' - ) { - if (instruction.entry?.content?.cursorType === 'Bottom') { - bottomCursor = instruction.entry.content.value; - continue; - } - - if (instruction.entry?.content?.cursorType === 'Top') { - topCursor = instruction.entry.content.value; - continue; - } - - const entries = instruction.entries ?? []; - for (const entry of entries) { - const itemContent = entry.content?.itemContent; - if (itemContent?.userDisplayType === 'User') { - const userResultRaw = itemContent.user_results?.result; - - if (userResultRaw?.legacy) { - const profile = parseProfile( - userResultRaw.legacy, - userResultRaw.is_blue_verified, - ); - - if (!profile.userId) { - profile.userId = userResultRaw.rest_id; - } - - profiles.push(profile); - } - } else if (entry.content?.cursorType === 'Bottom') { - bottomCursor = entry.content.value; - } else if (entry.content?.cursorType === 'Top') { - topCursor = entry.content.value; - } - } - } - } - - return { profiles, next: bottomCursor, previous: topCursor }; -} diff --git a/twitter-scraper/src/timeline-search.ts b/twitter-scraper/src/timeline-search.ts deleted file mode 100644 index 990b170..0000000 --- a/twitter-scraper/src/timeline-search.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Profile, parseProfile } from './profile'; -import { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1'; -import { SearchEntryRaw, parseLegacyTweet } from './timeline-v2'; -import { Tweet } from './tweets'; - -export interface SearchTimeline { - data?: { - search_by_raw_query?: { - search_timeline?: { - timeline?: { - instructions?: { - entries?: SearchEntryRaw[]; - entry?: SearchEntryRaw; - type?: string; - }[]; - }; - }; - }; - }; -} - -export function parseSearchTimelineTweets( - timeline: SearchTimeline, -): QueryTweetsResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const tweets: Tweet[] = []; - const instructions = - timeline.data?.search_by_raw_query?.search_timeline?.timeline - ?.instructions ?? []; - for (const instruction of instructions) { - if ( - instruction.type === 'TimelineAddEntries' || - instruction.type === 'TimelineReplaceEntry' - ) { - if (instruction.entry?.content?.cursorType === 'Bottom') { - bottomCursor = instruction.entry.content.value; - continue; - } else if (instruction.entry?.content?.cursorType === 'Top') { - topCursor = instruction.entry.content.value; - continue; - } - - const entries = instruction.entries ?? []; - for (const entry of entries) { - const itemContent = entry.content?.itemContent; - if (itemContent?.tweetDisplayType === 'Tweet') { - const tweetResultRaw = itemContent.tweet_results?.result; - const tweetResult = parseLegacyTweet( - tweetResultRaw?.core?.user_results?.result?.core, - tweetResultRaw?.core?.user_results?.result?.legacy, - tweetResultRaw?.legacy, - tweetResultRaw?.edit_control?.edit_control_initial, - ); - - if (tweetResult.success) { - if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) { - const views = parseInt(tweetResultRaw.views.count); - if (!isNaN(views)) { - tweetResult.tweet.views = views; - } - } - - tweets.push(tweetResult.tweet); - } - } else if (entry.content?.cursorType === 'Bottom') { - bottomCursor = entry.content.value; - } else if (entry.content?.cursorType === 'Top') { - topCursor = entry.content.value; - } - } - } - } - - return { tweets, next: bottomCursor, previous: topCursor }; -} - -export function parseSearchTimelineUsers( - timeline: SearchTimeline, -): QueryProfilesResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const profiles: Profile[] = []; - const instructions = - timeline.data?.search_by_raw_query?.search_timeline?.timeline - ?.instructions ?? []; - - for (const instruction of instructions) { - if ( - instruction.type === 'TimelineAddEntries' || - instruction.type === 'TimelineReplaceEntry' - ) { - if (instruction.entry?.content?.cursorType === 'Bottom') { - bottomCursor = instruction.entry.content.value; - continue; - } else if (instruction.entry?.content?.cursorType === 'Top') { - topCursor = instruction.entry.content.value; - continue; - } - - const entries = instruction.entries ?? []; - for (const entry of entries) { - const itemContent = entry.content?.itemContent; - if (itemContent?.userDisplayType === 'User') { - const userResultRaw = itemContent.user_results?.result; - - if (userResultRaw?.legacy) { - const profile = parseProfile( - userResultRaw.legacy, - userResultRaw.is_blue_verified, - ); - - if (!profile.userId) { - profile.userId = userResultRaw.rest_id; - } - - profiles.push(profile); - } - } else if (entry.content?.cursorType === 'Bottom') { - bottomCursor = entry.content.value; - } else if (entry.content?.cursorType === 'Top') { - topCursor = entry.content.value; - } - } - } - } - - return { profiles, next: bottomCursor, previous: topCursor }; -} diff --git a/twitter-scraper/src/timeline-tweet-util.ts b/twitter-scraper/src/timeline-tweet-util.ts deleted file mode 100644 index 97cab23..0000000 --- a/twitter-scraper/src/timeline-tweet-util.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1'; -import { Photo, Video } from './tweets'; -import { isFieldDefined, NonNullableField } from './type-util'; - -const reHashtag = /\B(\#\S+\b)/g; -const reCashtag = /\B(\$\S+\b)/g; -const reTwitterUrl = /https:(\/\/t\.co\/([A-Za-z0-9]|[A-Za-z]){10})/g; -const reUsername = /\B(\@\S{1,15}\b)/g; - -export function parseMediaGroups(media: TimelineMediaExtendedRaw[]): { - sensitiveContent?: boolean; - photos: Photo[]; - videos: Video[]; -} { - const photos: Photo[] = []; - const videos: Video[] = []; - let sensitiveContent: boolean | undefined = undefined; - - for (const m of media - .filter(isFieldDefined('id_str')) - .filter(isFieldDefined('media_url_https'))) { - if (m.type === 'photo') { - photos.push({ - id: m.id_str, - url: m.media_url_https, - alt_text: m.ext_alt_text, - }); - } else if (m.type === 'video') { - videos.push(parseVideo(m)); - } else if (m.type === 'animated_gif') { - videos.push(parseGif(m)); - } - - const sensitive = m.ext_sensitive_media_warning; - if (sensitive != null) { - sensitiveContent = - sensitive.adult_content || - sensitive.graphic_violence || - sensitive.other; - } - } - - return { sensitiveContent, photos, videos }; -} - -function parseGif( - m: NonNullableField, -): Video { - const gif: Video = { - id: m.id_str, - preview: m.media_url_https, - }; - - const variants = m.video_info?.variants ?? []; - - const url = variants.find((v) => v.content_type === 'video/mp4')?.url; - - if (url) { - gif.preview = url; - gif.url = url; - } - - return gif; -} - -function parseVideo( - m: NonNullableField, -): Video { - const video: Video = { - id: m.id_str, - preview: m.media_url_https, - }; - - let maxBitrate = 0; - const variants = m.video_info?.variants ?? []; - for (const variant of variants) { - const bitrate = variant.bitrate; - if (bitrate != null && bitrate > maxBitrate && variant.url != null) { - let variantUrl = variant.url; - const stringStart = 0; - const tagSuffixIdx = variantUrl.indexOf('?tag=10'); - if (tagSuffixIdx !== -1) { - variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1); - } - - video.url = variantUrl; - maxBitrate = bitrate; - } - } - - return video; -} - -export function reconstructTweetHtml( - tweet: LegacyTweetRaw, - photos: Photo[], - videos: Video[], -): string { - const media: string[] = []; - - // HTML parsing with regex :) - let html = tweet.full_text ?? ''; - - html = html.replace(reHashtag, linkHashtagHtml); - html = html.replace(reCashtag, linkCashtagHtml); - html = html.replace(reUsername, linkUsernameHtml); - html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media)); - - for (const { url } of photos) { - if (media.indexOf(url) !== -1) { - continue; - } - - html += `
`; - } - - for (const { preview: url } of videos) { - if (media.indexOf(url) !== -1) { - continue; - } - - html += `
`; - } - - html = html.replace(/\n/g, '
'); - - return html; -} - -function linkHashtagHtml(hashtag: string) { - return `${hashtag}`; -} - -function linkCashtagHtml(cashtag: string) { - return `${cashtag}`; -} - -function linkUsernameHtml(username: string) { - return `${username}`; -} - -function unwrapTcoUrlHtml(tweet: LegacyTweetRaw, foundedMedia: string[]) { - return function (tco: string) { - for (const entity of tweet.entities?.urls ?? []) { - if (tco === entity.url && entity.expanded_url != null) { - return `${tco}`; - } - } - - for (const entity of tweet.extended_entities?.media ?? []) { - if (tco === entity.url && entity.media_url_https != null) { - foundedMedia.push(entity.media_url_https); - return `
`; - } - } - - return tco; - }; -} diff --git a/twitter-scraper/src/timeline-v1.ts b/twitter-scraper/src/timeline-v1.ts deleted file mode 100644 index 629523d..0000000 --- a/twitter-scraper/src/timeline-v1.ts +++ /dev/null @@ -1,499 +0,0 @@ -import { CoreUserRaw, LegacyUserRaw, parseProfile, Profile } from './profile'; -import { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util'; -import { PlaceRaw, Tweet } from './tweets'; -import { isFieldDefined } from './type-util'; - -export interface Hashtag { - text?: string; -} - -export interface TimelineUserMentionBasicRaw { - id_str?: string; - name?: string; - screen_name?: string; -} - -export interface TimelineMediaBasicRaw { - media_url_https?: string; - type?: string; - url?: string; -} - -export interface TimelineUrlBasicRaw { - expanded_url?: string; - url?: string; -} - -export interface ExtSensitiveMediaWarningRaw { - adult_content?: boolean; - graphic_violence?: boolean; - other?: boolean; -} - -export interface VideoVariant { - bitrate?: number; - content_type?: string; - url?: string; -} - -export interface VideoInfo { - variants?: VideoVariant[]; -} - -export interface TimelineMediaExtendedRaw { - id_str?: string; - media_url_https?: string; - ext_sensitive_media_warning?: ExtSensitiveMediaWarningRaw; - type?: string; - url?: string; - video_info?: VideoInfo; - ext_alt_text: string | undefined; -} - -export interface EditControlInitialRaw { - edit_tweet_ids?: string[]; - editable_until_msecs?: `${number}`; - edits_remaining?: `${number}`; - is_edit_eligible?: boolean; -} - -export interface SearchResultRaw { - rest_id?: string; - __typename?: string; - core?: { - user_results?: { - result?: { - is_blue_verified?: boolean; - core?: CoreUserRaw; - legacy?: LegacyUserRaw; - }; - }; - }; - edit_control?: { - edit_control_initial?: EditControlInitialRaw; - }; - views?: { - count?: string; - }; - note_tweet?: { - note_tweet_results?: { - result?: { - text?: string; - }; - }; - }; - quoted_status_result?: { - result?: SearchResultRaw; - }; - legacy?: LegacyTweetRaw; -} - -export interface TimelineResultRaw { - rest_id?: string; - __typename?: string; - edit_control?: { - edit_control_initial?: EditControlInitialRaw; - }; - core?: { - user_results?: { - result?: { - __typename?: string; - is_blue_verified?: boolean; - core?: CoreUserRaw; - legacy?: LegacyUserRaw; - }; - }; - }; - views?: { - count?: string; - }; - note_tweet?: { - note_tweet_results?: { - result?: { - text?: string; - }; - }; - }; - quoted_status_result?: { - result?: TimelineResultRaw; - }; - legacy?: LegacyTweetRaw; - tweet?: TimelineResultRaw; -} - -export interface LegacyTweetRaw { - bookmark_count?: number; - conversation_id_str?: string; - created_at?: string; - favorite_count?: number; - full_text?: string; - entities?: { - hashtags?: Hashtag[]; - media?: TimelineMediaBasicRaw[]; - urls?: TimelineUrlBasicRaw[]; - user_mentions?: TimelineUserMentionBasicRaw[]; - }; - extended_entities?: { - media?: TimelineMediaExtendedRaw[]; - }; - id_str?: string; - in_reply_to_status_id_str?: string; - place?: PlaceRaw; - reply_count?: number; - retweet_count?: number; - retweeted_status_id_str?: string; - retweeted_status_result?: { - result?: TimelineResultRaw; - }; - quoted_status_id_str?: string; - time?: string; - user_id_str?: string; - ext_views?: { - state?: string; - count?: string; - }; -} - -export interface TimelineGlobalObjectsRaw { - tweets?: { [key: string]: LegacyTweetRaw | undefined }; - users?: { [key: string]: LegacyUserRaw | undefined }; -} - -export interface TimelineDataRawCursor { - value?: string; - cursorType?: string; -} - -export interface TimelineDataRawEntity { - id?: string; -} - -export interface TimelineDataRawModuleItem { - clientEventInfo?: { - details?: { - guideDetails?: { - transparentGuideDetails?: { - trendMetadata?: { - trendName?: string; - }; - }; - }; - }; - }; -} - -export interface TimelineDataRawAddEntry { - content?: { - item?: { - content?: { - tweet?: TimelineDataRawEntity; - user?: TimelineDataRawEntity; - }; - }; - operation?: { - cursor?: TimelineDataRawCursor; - }; - timelineModule?: { - items?: { - item?: TimelineDataRawModuleItem; - }[]; - }; - }; -} - -export interface TimelineDataRawPinEntry { - content?: { - item?: { - content?: { - tweet?: TimelineDataRawEntity; - }; - }; - }; -} - -export interface TimelineDataRawReplaceEntry { - content?: { - operation?: { - cursor?: TimelineDataRawCursor; - }; - }; -} - -export interface TimelineDataRawInstruction { - addEntries?: { - entries?: TimelineDataRawAddEntry[]; - }; - pinEntry?: { - entry?: TimelineDataRawPinEntry; - }; - replaceEntry?: { - entry?: TimelineDataRawReplaceEntry; - }; -} - -export interface TimelineDataRaw { - instructions?: TimelineDataRawInstruction[]; -} - -export interface TimelineV1 { - globalObjects?: TimelineGlobalObjectsRaw; - timeline?: TimelineDataRaw; -} - -export type ParseTweetResult = - | { success: true; tweet: Tweet } - | { success: false; err: Error }; - -function parseTimelineTweet( - timeline: TimelineV1, - tweetId: string, -): ParseTweetResult { - const tweets = timeline.globalObjects?.tweets ?? {}; - const tweet: Readonly | undefined = tweets[tweetId]; - if (tweet?.user_id_str == null) { - return { - success: false, - err: new Error( - `Tweet "${tweetId}" was not found in the timeline object.`, - ), - }; - } - - const users = timeline.globalObjects?.users ?? {}; - const user: Readonly | undefined = users[tweet.user_id_str]; - if (user?.screen_name == null) { - return { - success: false, - err: new Error(`User "${tweet.user_id_str}" has no username data.`), - }; - } - - const hashtags = tweet.entities?.hashtags ?? []; - const mentions = tweet.entities?.user_mentions ?? []; - const media = tweet.extended_entities?.media ?? []; - const pinnedTweets = new Set( - user.pinned_tweet_ids_str ?? [], - ); - const urls = tweet.entities?.urls ?? []; - const { photos, videos, sensitiveContent } = parseMediaGroups(media); - - const tw: Tweet = { - __raw_UNSTABLE: tweet, - conversationId: tweet.conversation_id_str, - id: tweetId, - hashtags: hashtags - .filter(isFieldDefined('text')) - .map((hashtag) => hashtag.text), - likes: tweet.favorite_count, - mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({ - id: mention.id_str, - username: mention.screen_name, - name: mention.name, - })), - name: user.name, - permanentUrl: `https://x.com/${user.screen_name}/status/${tweetId}`, - photos, - replies: tweet.reply_count, - retweets: tweet.retweet_count, - text: tweet.full_text, - thread: [], - urls: urls - .filter(isFieldDefined('expanded_url')) - .map((url) => url.expanded_url), - userId: tweet.user_id_str, - username: user.screen_name, - videos, - }; - - if (tweet.created_at) { - tw.timeParsed = new Date(Date.parse(tweet.created_at)); - tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000); - } - - if (tweet.place?.id) { - tw.place = tweet.place; - } - - if (tweet.quoted_status_id_str) { - tw.isQuoted = true; - tw.quotedStatusId = tweet.quoted_status_id_str; - - const quotedStatusResult = parseTimelineTweet( - timeline, - tweet.quoted_status_id_str, - ); - if (quotedStatusResult.success) { - tw.quotedStatus = quotedStatusResult.tweet; - } - } - - if (tweet.in_reply_to_status_id_str) { - tw.isReply = true; - tw.inReplyToStatusId = tweet.in_reply_to_status_id_str; - - const replyStatusResult = parseTimelineTweet( - timeline, - tweet.in_reply_to_status_id_str, - ); - if (replyStatusResult.success) { - tw.inReplyToStatus = replyStatusResult.tweet; - } - } - - if (tweet.retweeted_status_id_str != null) { - tw.isRetweet = true; - tw.retweetedStatusId = tweet.retweeted_status_id_str; - - const retweetedStatusResult = parseTimelineTweet( - timeline, - tweet.retweeted_status_id_str, - ); - if (retweetedStatusResult.success) { - tw.retweetedStatus = retweetedStatusResult.tweet; - } - } - - const views = parseInt(tweet.ext_views?.count ?? ''); - if (!isNaN(views)) { - tw.views = views; - } - - if (pinnedTweets.has(tweet.id_str)) { - // TODO: Update tests so this can be assigned at the tweet declaration - tw.isPin = true; - } - - if (sensitiveContent) { - // TODO: Update tests so this can be assigned at the tweet declaration - tw.sensitiveContent = true; - } - - tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos); - - return { success: true, tweet: tw }; -} - -/** - * A paginated tweets API response. The `next` field can be used to fetch the next page of results, - * and the `previous` can be used to fetch the previous results (or results created after the - * inital request) - */ -export interface QueryTweetsResponse { - tweets: Tweet[]; - next?: string; - previous?: string; -} - -export function parseTimelineTweetsV1( - timeline: TimelineV1, -): QueryTweetsResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - let pinnedTweet: Tweet | undefined; - let orderedTweets: Tweet[] = []; - for (const instruction of timeline.timeline?.instructions ?? []) { - const { pinEntry, addEntries, replaceEntry } = instruction; - - // Handle pin instruction - const pinnedTweetId = pinEntry?.entry?.content?.item?.content?.tweet?.id; - if (pinnedTweetId != null) { - const tweetResult = parseTimelineTweet(timeline, pinnedTweetId); - if (tweetResult.success) { - pinnedTweet = tweetResult.tweet; - } - } - - // Handle add instructions - for (const { content } of addEntries?.entries ?? []) { - const tweetId = content?.item?.content?.tweet?.id; - if (tweetId != null) { - const tweetResult = parseTimelineTweet(timeline, tweetId); - if (tweetResult.success) { - orderedTweets.push(tweetResult.tweet); - } - } - - const operation = content?.operation; - if (operation?.cursor?.cursorType === 'Bottom') { - bottomCursor = operation?.cursor?.value; - } else if (operation?.cursor?.cursorType === 'Top') { - topCursor = operation?.cursor?.value; - } - } - - // Handle replace instruction - const operation = replaceEntry?.entry?.content?.operation; - if (operation?.cursor?.cursorType === 'Bottom') { - bottomCursor = operation.cursor.value; - } else if (operation?.cursor?.cursorType === 'Top') { - topCursor = operation.cursor.value; - } - } - - if (pinnedTweet != null && orderedTweets.length > 0) { - orderedTweets = [pinnedTweet, ...orderedTweets]; - } - - return { - tweets: orderedTweets, - next: bottomCursor, - previous: topCursor, - }; -} - -/** - * A paginated profiles API response. The `next` field can be used to fetch the next page of results. - */ -export interface QueryProfilesResponse { - profiles: Profile[]; - next?: string; - previous?: string; -} - -export function parseUsers(timeline: TimelineV1): QueryProfilesResponse { - const users = new Map(); - - const userObjects = timeline.globalObjects?.users ?? {}; - for (const id in userObjects) { - const legacy = userObjects[id]; - if (legacy == null) { - continue; - } - - const user = parseProfile(legacy); - users.set(id, user); - } - - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const orderedProfiles: Profile[] = []; - for (const instruction of timeline.timeline?.instructions ?? []) { - for (const entry of instruction.addEntries?.entries ?? []) { - const userId = entry.content?.item?.content?.user?.id; - const profile = users.get(userId); - if (profile != null) { - orderedProfiles.push(profile); - } - - const operation = entry.content?.operation; - if (operation?.cursor?.cursorType === 'Bottom') { - bottomCursor = operation?.cursor?.value; - } else if (operation?.cursor?.cursorType === 'Top') { - topCursor = operation?.cursor?.value; - } - } - - const operation = instruction.replaceEntry?.entry?.content?.operation; - if (operation?.cursor?.cursorType === 'Bottom') { - bottomCursor = operation.cursor.value; - } else if (operation?.cursor?.cursorType === 'Top') { - topCursor = operation.cursor.value; - } - } - - return { - profiles: orderedProfiles, - next: bottomCursor, - previous: topCursor, - }; -} diff --git a/twitter-scraper/src/timeline-v2.test.ts b/twitter-scraper/src/timeline-v2.test.ts deleted file mode 100644 index 609b564..0000000 --- a/twitter-scraper/src/timeline-v2.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { TimelineV2, parseTimelineTweetsV2 } from './timeline-v2'; - -test('parseTimelineTweetsV2 handles pinned tweets correctly', async () => { - const data: TimelineV2 = { - data: { - user: { - result: { - __typename: 'User', - timeline: { - timeline: { - instructions: [ - { - type: 'TimelinePinEntry', - entry: { - entryId: 'tweet-1', - content: { - entryType: 'TimelineTimelineItem', - __typename: 'TimelineTimelineItem', - itemContent: { - itemType: 'TimelineTweet', - __typename: 'TimelineTweet', - tweet_results: { - result: { - __typename: 'Tweet', - rest_id: '1', - core: { - user_results: { - result: { - core: { - created_at: - 'Tue Oct 13 15:48:33 +0000 2015', - name: 'DOFUS Touch', - screen_name: 'DofusTouch', - }, - legacy: { - pinned_tweet_ids_str: ['1'], - }, - }, - }, - }, - legacy: { - created_at: 'Mon Jan 1 12:00:00 +0000 2025', - conversation_id_str: '1', - entities: {}, - favorite_count: 32, - full_text: 'test', - reply_count: 21, - retweet_count: 4, - user_id_str: '1', - id_str: '1', - }, - }, - }, - tweetDisplayType: 'Tweet', - }, - }, - }, - }, - { - type: 'TimelineAddEntries', - entries: [ - { - entryId: 'cursor-top-2', - content: { - entryType: 'TimelineTimelineCursor', - __typename: 'TimelineTimelineCursor', - value: 'A', - cursorType: 'Top', - }, - }, - { - entryId: 'cursor-bottom-3', - content: { - entryType: 'TimelineTimelineCursor', - __typename: 'TimelineTimelineCursor', - value: 'B', - cursorType: 'Bottom', - }, - }, - ], - }, - ], - }, - }, - }, - }, - }, - }; - - const result = parseTimelineTweetsV2(data); - expect(result.tweets.length).toBe(1); - expect(result.tweets[0].id).toBe('1'); - expect(result.tweets[0].isPin).toBe(true); - expect(result.previous).toBe('A'); - expect(result.next).toBe('B'); - expect(result.tweets[0].text).toBe('test'); -}); diff --git a/twitter-scraper/src/timeline-v2.ts b/twitter-scraper/src/timeline-v2.ts deleted file mode 100644 index 213661c..0000000 --- a/twitter-scraper/src/timeline-v2.ts +++ /dev/null @@ -1,458 +0,0 @@ -import { CoreUserRaw, LegacyUserRaw } from './profile'; -import { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util'; -import { - EditControlInitialRaw, - LegacyTweetRaw, - ParseTweetResult, - QueryTweetsResponse, - SearchResultRaw, - TimelineResultRaw, -} from './timeline-v1'; -import { Tweet } from './tweets'; -import { isFieldDefined } from './type-util'; - -export interface TimelineUserResultRaw { - rest_id?: string; - legacy?: LegacyUserRaw; - is_blue_verified?: boolean; -} - -export interface TimelineEntryItemContentRaw { - itemType?: string; - __typename?: string; - tweetDisplayType?: string; - tweetResult?: { - result?: TimelineResultRaw; - }; - tweet_results?: { - result?: TimelineResultRaw; - }; - userDisplayType?: string; - user_results?: { - result?: TimelineUserResultRaw; - }; -} - -export interface TimelineEntryRaw { - entryId: string; - content?: { - entryType?: string; - __typename?: string; - cursorType?: string; - value?: string; - items?: { - entryId?: string; - item?: { - content?: TimelineEntryItemContentRaw; - itemContent?: SearchEntryItemContentRaw; - }; - }[]; - itemContent?: TimelineEntryItemContentRaw; - }; -} - -export interface SearchEntryItemContentRaw { - tweetDisplayType?: string; - tweet_results?: { - result?: SearchResultRaw; - }; - userDisplayType?: string; - user_results?: { - result?: TimelineUserResultRaw; - }; -} - -export interface SearchEntryRaw { - entryId: string; - sortIndex: string; - content?: { - cursorType?: string; - entryType?: string; - __typename?: string; - value?: string; - items?: { - item?: { - content?: SearchEntryItemContentRaw; - }; - }[]; - itemContent?: SearchEntryItemContentRaw; - }; -} - -export interface TimelineInstruction { - entries?: TimelineEntryRaw[]; - entry?: TimelineEntryRaw; - type?: string; -} - -export interface TimelineV2 { - data?: { - user?: { - result?: { - __typename?: string; - timeline?: { - timeline?: { - instructions?: TimelineInstruction[]; - }; - }; - }; - }; - }; -} - -export interface ThreadedConversation { - data?: { - threaded_conversation_with_injections_v2?: { - instructions?: TimelineInstruction[]; - }; - }; -} - -function getLegacyTweetId(tweet: Readonly): string | undefined { - if (tweet.id_str) { - return tweet.id_str; - } - - return tweet.conversation_id_str; -} - -export function parseLegacyTweet( - coreUser?: Readonly, - user?: Readonly, - tweet?: Readonly, - editControl?: Readonly, -): ParseTweetResult { - if (tweet == null) { - return { - success: false, - err: new Error('Tweet was not found in the timeline object.'), - }; - } - - if (user == null) { - return { - success: false, - err: new Error('User was not found in the timeline object.'), - }; - } - - const tweetId = getLegacyTweetId(tweet); - if (!tweetId) { - return { - success: false, - err: new Error('Tweet ID was not found in object.'), - }; - } - - const hashtags = tweet.entities?.hashtags ?? []; - const mentions = tweet.entities?.user_mentions ?? []; - const media = tweet.extended_entities?.media ?? []; - const pinnedTweets = new Set( - user.pinned_tweet_ids_str ?? [], - ); - const urls = tweet.entities?.urls ?? []; - const { photos, videos, sensitiveContent } = parseMediaGroups(media); - - // The edit tweets array always contains the original tweet, even if it has not been edited - const tweetVersions = editControl?.edit_tweet_ids ?? [tweetId]; - - const name = user.name ?? coreUser?.name; - const username = user.screen_name ?? coreUser?.screen_name; - const tw: Tweet = { - __raw_UNSTABLE: tweet, - bookmarkCount: tweet.bookmark_count, - conversationId: tweet.conversation_id_str, - id: tweetId, - hashtags: hashtags - .filter(isFieldDefined('text')) - .map((hashtag) => hashtag.text), - likes: tweet.favorite_count, - mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({ - id: mention.id_str, - username: mention.screen_name, - name: mention.name, - })), - name: name, - permanentUrl: `https://x.com/${username}/status/${tweetId}`, - photos, - replies: tweet.reply_count, - retweets: tweet.retweet_count, - text: tweet.full_text, - thread: [], - urls: urls - .filter(isFieldDefined('expanded_url')) - .map((url) => url.expanded_url), - userId: tweet.user_id_str, - username: username, - videos, - isQuoted: false, - isReply: false, - isEdited: tweetVersions.length > 1, - versions: tweetVersions, - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - if (tweet.created_at) { - tw.timeParsed = new Date(Date.parse(tweet.created_at)); - tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000); - } - - if (tweet.place?.id) { - tw.place = tweet.place; - } - - const quotedStatusIdStr = tweet.quoted_status_id_str; - const inReplyToStatusIdStr = tweet.in_reply_to_status_id_str; - const retweetedStatusIdStr = tweet.retweeted_status_id_str; - const retweetedStatusResult = tweet.retweeted_status_result?.result; - - if (quotedStatusIdStr) { - tw.isQuoted = true; - tw.quotedStatusId = quotedStatusIdStr; - } - - if (inReplyToStatusIdStr) { - tw.isReply = true; - tw.inReplyToStatusId = inReplyToStatusIdStr; - } - - if (retweetedStatusIdStr || retweetedStatusResult) { - tw.isRetweet = true; - tw.retweetedStatusId = retweetedStatusIdStr; - - if (retweetedStatusResult) { - const parsedResult = parseLegacyTweet( - retweetedStatusResult?.core?.user_results?.result?.core, - retweetedStatusResult?.core?.user_results?.result?.legacy, - retweetedStatusResult?.legacy, - retweetedStatusResult?.edit_control?.edit_control_initial, - ); - - if (parsedResult.success) { - tw.retweetedStatus = parsedResult.tweet; - } - } - } - - const views = parseInt(tweet.ext_views?.count ?? ''); - if (!isNaN(views)) { - tw.views = views; - } - - if (pinnedTweets.has(tweetId)) { - // TODO: Update tests so this can be assigned at the tweet declaration - tw.isPin = true; - } - - if (sensitiveContent) { - // TODO: Update tests so this can be assigned at the tweet declaration - tw.sensitiveContent = true; - } - - tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos); - - return { success: true, tweet: tw }; -} - -function parseResult(result?: TimelineResultRaw): ParseTweetResult { - const noteTweetResultText = - result?.note_tweet?.note_tweet_results?.result?.text; - - if (result?.legacy && noteTweetResultText) { - result.legacy.full_text = noteTweetResultText; - } - - const tweetResult = parseLegacyTweet( - result?.core?.user_results?.result?.core, - result?.core?.user_results?.result?.legacy, - result?.legacy, - result?.edit_control?.edit_control_initial, - ); - if (!tweetResult.success) { - return tweetResult; - } - - if (!tweetResult.tweet.views && result?.views?.count) { - const views = parseInt(result.views.count); - if (!isNaN(views)) { - tweetResult.tweet.views = views; - } - } - - const quotedResult = result?.quoted_status_result?.result; - if (quotedResult) { - if (quotedResult.legacy && quotedResult.rest_id) { - quotedResult.legacy.id_str = quotedResult.rest_id; - } - - const quotedTweetResult = parseResult(quotedResult); - if (quotedTweetResult.success) { - tweetResult.tweet.quotedStatus = quotedTweetResult.tweet; - } - } - - return tweetResult; -} - -const expectedEntryTypes = ['tweet', 'profile-conversation']; - -function getTimelineInstructionEntries( - instruction: TimelineInstruction, -): TimelineEntryRaw[] { - const entries = instruction.entries ?? []; - if (instruction.entry) { - entries.push(instruction.entry); - } - return entries; -} - -export function parseTimelineTweetsV2( - timeline: TimelineV2, -): QueryTweetsResponse { - let bottomCursor: string | undefined; - let topCursor: string | undefined; - const tweets: Tweet[] = []; - const instructions = - timeline.data?.user?.result?.timeline?.timeline?.instructions ?? []; - for (const instruction of instructions) { - const entries = getTimelineInstructionEntries(instruction); - for (const entry of entries) { - const entryContent = entry.content; - if (!entryContent) continue; - - // Handle pagination - if (entryContent.cursorType === 'Bottom') { - bottomCursor = entryContent.value; - continue; - } else if (entryContent.cursorType === 'Top') { - topCursor = entryContent.value; - continue; - } - - const idStr = entry.entryId; - if ( - !expectedEntryTypes.some((entryType) => idStr.startsWith(entryType)) - ) { - continue; - } - - if (entryContent.itemContent) { - // Typically TimelineTimelineTweet entries - parseAndPush(tweets, entryContent.itemContent, idStr); - } else if (entryContent.items) { - // Typically TimelineTimelineModule entries - for (const item of entryContent.items) { - if (item.item?.itemContent) { - parseAndPush(tweets, item.item.itemContent, idStr); - } - } - } - } - } - - return { tweets, next: bottomCursor, previous: topCursor }; -} - -export function parseTimelineEntryItemContentRaw( - content: TimelineEntryItemContentRaw, - entryId: string, - isConversation = false, -) { - let result = content.tweet_results?.result ?? content.tweetResult?.result; - if ( - result?.__typename === 'Tweet' || - (result?.__typename === 'TweetWithVisibilityResults' && result?.tweet) - ) { - if (result?.__typename === 'TweetWithVisibilityResults') - result = result.tweet; - - if (result?.legacy) { - result.legacy.id_str = - result.rest_id ?? - entryId.replace('conversation-', '').replace('tweet-', ''); - } - - const tweetResult = parseResult(result); - if (tweetResult.success) { - if (isConversation) { - if (content?.tweetDisplayType === 'SelfThread') { - tweetResult.tweet.isSelfThread = true; - } - } - - return tweetResult.tweet; - } - } - - return null; -} - -export function parseAndPush( - tweets: Tweet[], - content: TimelineEntryItemContentRaw, - entryId: string, - isConversation = false, -) { - const tweet = parseTimelineEntryItemContentRaw( - content, - entryId, - isConversation, - ); - - if (tweet) { - tweets.push(tweet); - } -} - -export function parseThreadedConversation( - conversation: ThreadedConversation, -): Tweet[] { - const tweets: Tweet[] = []; - const instructions = - conversation.data?.threaded_conversation_with_injections_v2?.instructions ?? - []; - - for (const instruction of instructions) { - const entries = getTimelineInstructionEntries(instruction); - for (const entry of entries) { - const entryContent = entry.content?.itemContent; - if (entryContent) { - parseAndPush(tweets, entryContent, entry.entryId, true); - } - - for (const item of entry.content?.items ?? []) { - const itemContent = item.item?.itemContent; - if (itemContent) { - parseAndPush(tweets, itemContent, entry.entryId, true); - } - } - } - } - - for (const tweet of tweets) { - if (tweet.inReplyToStatusId) { - for (const parentTweet of tweets) { - if (parentTweet.id === tweet.inReplyToStatusId) { - tweet.inReplyToStatus = parentTweet; - break; - } - } - } - - if (tweet.isSelfThread && tweet.conversationId === tweet.id) { - for (const childTweet of tweets) { - if (childTweet.isSelfThread && childTweet.id !== tweet.id) { - tweet.thread.push(childTweet); - } - } - - if (tweet.thread.length === 0) { - tweet.isSelfThread = false; - } - } - } - - return tweets; -} diff --git a/twitter-scraper/src/trends.test.ts b/twitter-scraper/src/trends.test.ts deleted file mode 100644 index 1e54fe3..0000000 --- a/twitter-scraper/src/trends.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getScraper } from './test-utils'; - -test('scraper can get trends', async () => { - const scraper = await getScraper(); - const trends = await scraper.getTrends(); - expect(trends).toHaveLength(20); - trends.forEach((trend) => expect(trend).not.toBeFalsy()); -}, 15000); diff --git a/twitter-scraper/src/trends.ts b/twitter-scraper/src/trends.ts deleted file mode 100644 index db1b022..0000000 --- a/twitter-scraper/src/trends.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { addApiParams, requestApi, bearerToken2 } from './api'; -import { TwitterAuth } from './auth'; -import { TimelineV1 } from './timeline-v1'; - -export async function getTrends(auth: TwitterAuth): Promise { - const params = new URLSearchParams(); - addApiParams(params, false); - - params.set('count', '20'); - params.set('candidate_source', 'trends'); - params.set('include_page_configuration', 'false'); - params.set('entity_tokens', 'false'); - - // Use bearerToken2 for trends endpoint - const res = await requestApi( - `https://api.x.com/2/guide.json?${params.toString()}`, - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - if (!res.success) { - throw res.err; - } - - const instructions = res.value.timeline?.instructions ?? []; - if (instructions.length < 2) { - throw new Error('No trend entries found.'); - } - - // Some of this is silly, but for now we're assuming we know nothing about the - // data, and that anything can be missing. Go has non-nilable strings and empty - // slices are nil, so it largely doesn't need to worry about this. - const entries = instructions[1].addEntries?.entries ?? []; - if (entries.length < 2) { - throw new Error('No trend entries found.'); - } - - const items = entries[1].content?.timelineModule?.items ?? []; - const trends: string[] = []; - for (const item of items) { - const trend = - item.item?.clientEventInfo?.details?.guideDetails?.transparentGuideDetails - ?.trendMetadata?.trendName; - if (trend != null) { - trends.push(trend); - } - } - - return trends; -} diff --git a/twitter-scraper/src/tweets.test.ts b/twitter-scraper/src/tweets.test.ts deleted file mode 100644 index 0718ca8..0000000 --- a/twitter-scraper/src/tweets.test.ts +++ /dev/null @@ -1,408 +0,0 @@ -import { getScraper } from './test-utils'; -import { Mention, Tweet } from './tweets'; -import { QueryTweetsResponse } from './timeline-v1'; - -test('scraper can get tweet', async () => { - const expected: Tweet = { - conversationId: '1585338303800578049', - html: `We’re updating Twitter’s sounds to help make them pleasing to more people, including those with sensory sensitivities. Here’s more on how we did it:
https://t.co/7FKWk7NzHM`, - id: '1585338303800578049', - hashtags: [], - mentions: [], - name: 'A11y', - permanentUrl: 'https://x.com/XA11y/status/1585338303800578049', - photos: [], - text: 'We’re updating Twitter’s sounds to help make them pleasing to more people, including those with sensory sensitivities. Here’s more on how we did it:\nhttps://t.co/7FKWk7NzHM', - thread: [], - timeParsed: new Date(Date.UTC(2022, 9, 26, 18, 31, 20, 0)), - timestamp: 1666809080, - urls: [ - 'https://blog.twitter.com/en_us/topics/product/2022/designing-accessible-sounds-story-behind-our-new-chirps', - ], - userId: '1631299117', - username: 'XA11y', - videos: [], - isQuoted: false, - isReply: false, - isEdited: false, - versions: ['1585338303800578049'], - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - const scraper = await getScraper(); - const actual = await scraper.getTweet('1585338303800578049'); - delete actual?.__raw_UNSTABLE; - delete actual?.likes; - delete actual?.replies; - delete actual?.retweets; - delete actual?.views; - delete actual?.bookmarkCount; - expect(actual).toEqual(expected); -}); - -test('scraper can get tweets without logging in', async () => { - const scraper = await getScraper({ authMethod: 'anonymous' }); - - let counter = 0; - for await (const tweet of scraper.getTweets('elonmusk', 10)) { - if (tweet) { - counter++; - } - } - - expect(counter).toBeGreaterThanOrEqual(1); -}); - -test('scraper can get tweets by user', async () => { - const scraper = await getScraper(); - - let counter = 0; - for await (const tweet of scraper.getTweets('GeminiApp', 10)) { - if (tweet) { - counter++; - } - } - - expect(counter).toBeGreaterThanOrEqual(1); -}); - -test('scraper can get tweets by user ID', async () => { - const scraper = await getScraper(); - - let counter = 0; - for await (const tweet of scraper.getTweetsByUserId( - '1016333328083910656', - 10, - )) { - if (tweet) { - counter++; - } - } - - expect(counter).toBeGreaterThanOrEqual(1); -}); - -test('scraper can get tweets and replies by user', async () => { - const scraper = await getScraper(); - - let counter = 0; - for await (const tweet of scraper.getTweetsAndReplies('GeminiApp', 10)) { - if (tweet) { - counter++; - } - } - - expect(counter).toBeGreaterThanOrEqual(1); -}); - -test('scraper can get tweets and replies by user ID', async () => { - const scraper = await getScraper(); - - let counter = 0; - for await (const tweet of scraper.getTweetsAndRepliesByUserId( - '1016333328083910656', - 10, - )) { - if (tweet) { - counter++; - } - } - - expect(counter).toBeGreaterThanOrEqual(1); -}); - -test('scraper can get tweets from list', async () => { - const scraper = await getScraper(); - - let cursor: string | undefined = undefined; - const maxTweets = 30; - let nTweets = 0; - while (nTweets < maxTweets) { - const res: QueryTweetsResponse = await scraper.fetchListTweets( - '1736495155002106192', - maxTweets, - cursor, - ); - - expect(res.next).toBeTruthy(); - - nTweets += res.tweets.length; - cursor = res.next; - } -}); - -test('scraper can get first tweet matching query', async () => { - const scraper = await getScraper(); - - const timeline = scraper.getTweets('elonmusk'); - const latestQuote = await scraper.getTweetWhere(timeline, { isQuoted: true }); - - expect(latestQuote?.isQuoted).toBeTruthy(); -}); - -test('scraper can get all tweets matching query', async () => { - const scraper = await getScraper(); - - // Sample size of 20 should be enough without taking long. - const timeline = scraper.getTweets('elonmusk', 20); - const retweets = await scraper.getTweetsWhere( - timeline, - (tweet) => tweet.isRetweet === true, - ); - - expect(retweets).toBeTruthy(); - - for (const tweet of retweets) { - expect(tweet.isRetweet).toBe(true); - } -}, 20000); - -test('scraper can get latest tweet', async () => { - const scraper = await getScraper(); - - // OLD APPROACH (without retweet filtering) - const tweets = scraper.getTweets('elonmusk', 1); - const expected = (await tweets.next()).value; - - // NEW APPROACH - const latest = (await scraper.getLatestTweet( - 'elonmusk', - expected?.isRetweet || false, - )) as Tweet; - - expect(latest?.permanentUrl).toEqual(expected?.permanentUrl); -}, 30000); - -test('scraper can get user mentions in tweets', async () => { - const expected: Mention[] = [ - { - id: '7018222', - username: 'davidmcraney', - name: 'David McRaney', - }, - ]; - - const scraper = await getScraper(); - const tweet = await scraper.getTweet('1554522888904101890'); - expect(tweet?.mentions).toEqual(expected); -}); - -test('scraper can get tweet quotes without logging in', async () => { - const expected: Tweet = { - conversationId: '1237110546383724547', - html: `The Easiest Problem Everyone Gets Wrong

[new video] --> https://t.co/YdaeDYmPAU
`, - id: '1237110546383724547', - hashtags: [], - mentions: [], - name: 'Vsauce2', - permanentUrl: 'https://x.com/VsauceTwo/status/1237110546383724547', - photos: [ - { - id: '1237110473486729218', - url: 'https://pbs.twimg.com/media/ESsZa9AXgAIAYnF.jpg', - alt_text: undefined, - }, - ], - text: 'The Easiest Problem Everyone Gets Wrong \n\n[new video] --> https://t.co/YdaeDYmPAU https://t.co/iKu4Xs6o2V', - thread: [], - timeParsed: new Date(Date.UTC(2020, 2, 9, 20, 18, 33, 0)), - timestamp: 1583785113, - urls: ['https://youtu.be/ytfCdqWhmdg'], - userId: '978944851', - username: 'VsauceTwo', - videos: [], - isQuoted: false, - isReply: false, - isEdited: false, - versions: ['1237110546383724547'], - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - const scraper = await getScraper({ authMethod: 'anonymous' }); - const quote = await scraper.getTweet('1237110897597976576'); - expect(quote?.isQuoted).toBeTruthy(); - delete quote?.quotedStatus?.__raw_UNSTABLE; - delete quote?.quotedStatus?.likes; - delete quote?.quotedStatus?.replies; - delete quote?.quotedStatus?.retweets; - delete quote?.quotedStatus?.views; - delete quote?.quotedStatus?.bookmarkCount; - expect(quote?.quotedStatus).toEqual(expected); -}); - -test('scraper can get tweet quotes and replies', async () => { - const expected: Tweet = { - conversationId: '1237110546383724547', - html: `The Easiest Problem Everyone Gets Wrong

[new video] --> https://t.co/YdaeDYmPAU
`, - id: '1237110546383724547', - hashtags: [], - mentions: [], - name: 'Vsauce2', - permanentUrl: 'https://x.com/VsauceTwo/status/1237110546383724547', - photos: [ - { - id: '1237110473486729218', - url: 'https://pbs.twimg.com/media/ESsZa9AXgAIAYnF.jpg', - alt_text: undefined, - }, - ], - text: 'The Easiest Problem Everyone Gets Wrong \n\n[new video] --> https://t.co/YdaeDYmPAU https://t.co/iKu4Xs6o2V', - thread: [], - timeParsed: new Date(Date.UTC(2020, 2, 9, 20, 18, 33, 0)), - timestamp: 1583785113, - urls: ['https://youtu.be/ytfCdqWhmdg'], - userId: '978944851', - username: 'VsauceTwo', - videos: [], - isQuoted: false, - isReply: false, - isEdited: false, - versions: ['1237110546383724547'], - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - const scraper = await getScraper(); - const quote = await scraper.getTweet('1237110897597976576'); - expect(quote?.isQuoted).toBeTruthy(); - delete quote?.quotedStatus?.__raw_UNSTABLE; - delete quote?.quotedStatus?.likes; - delete quote?.quotedStatus?.replies; - delete quote?.quotedStatus?.retweets; - delete quote?.quotedStatus?.views; - delete quote?.quotedStatus?.bookmarkCount; - expect(quote?.quotedStatus).toEqual(expected); - - const reply = await scraper.getTweet('1237111868445134850'); - expect(reply?.isReply).toBeTruthy(); - if (reply != null) { - reply.isReply = false; - } - delete reply?.inReplyToStatus?.__raw_UNSTABLE; - delete reply?.inReplyToStatus?.likes; - delete reply?.inReplyToStatus?.replies; - delete reply?.inReplyToStatus?.retweets; - delete reply?.inReplyToStatus?.views; - delete reply?.inReplyToStatus?.bookmarkCount; - expect(reply?.inReplyToStatus).toEqual(expected); -}); - -test('scraper can get retweet', async () => { - const expected: Tweet = { - conversationId: '1776276954435481937', - html: `
`, - id: '1776276954435481937', - hashtags: [], - mentions: [], - name: 'federico.', - permanentUrl: 'https://x.com/federicosmos/status/1776276954435481937', - photos: [], - text: 'https://t.co/qqiu5ntffp', - thread: [], - timeParsed: new Date(Date.UTC(2024, 3, 5, 15, 53, 22, 0)), - timestamp: 1712332402, - urls: [], - userId: '2376017065', - username: 'federicosmos', - videos: [ - { - id: '1776276900580622336', - preview: - 'https://pbs.twimg.com/amplify_video_thumb/1776276900580622336/img/UknAtyWSZ286nCD3.jpg', - url: 'https://video.twimg.com/amplify_video/1776276900580622336/vid/avc1/640x360/uACt_egp_hmvPOZF.mp4?tag=14', - }, - ], - isQuoted: false, - isReply: false, - isEdited: false, - versions: ['1776276954435481937'], - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - const scraper = await getScraper(); - const retweet = await scraper.getTweet('1776285549566808397'); - expect(retweet?.isRetweet).toBeTruthy(); - delete retweet?.retweetedStatus?.__raw_UNSTABLE; - delete retweet?.retweetedStatus?.likes; - delete retweet?.retweetedStatus?.replies; - delete retweet?.retweetedStatus?.retweets; - delete retweet?.retweetedStatus?.views; - delete retweet?.retweetedStatus?.bookmarkCount; - expect(retweet?.retweetedStatus).toEqual(expected); -}); - -test('scraper can get tweet views', async () => { - const expected: Tweet = { - conversationId: '1606055187348688896', - html: `Replies and likes don’t tell the whole story. We’re making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.

https://t.co/hrlMQyXJfx`, - id: '1606055187348688896', - hashtags: [], - mentions: [], - name: 'Support', - permanentUrl: 'https://x.com/Support/status/1606055187348688896', - photos: [], - text: 'Replies and likes don’t tell the whole story. We’re making it easier to tell *just* how many people have seen your Tweets with the addition of view counts, shown right next to likes. Now on iOS and Android, web coming soon.\n\nhttps://t.co/hrlMQyXJfx', - thread: [], - timeParsed: new Date(Date.UTC(2022, 11, 22, 22, 32, 50, 0)), - timestamp: 1671748370, - urls: ['https://help.twitter.com/using-twitter/view-counts'], - userId: '17874544', - username: 'Support', - videos: [], - isQuoted: false, - isReply: false, - isEdited: false, - versions: ['1606055187348688896'], - isRetweet: false, - isPin: false, - sensitiveContent: false, - }; - - const scraper = await getScraper(); - const actual = await scraper.getTweet('1606055187348688896'); - expect(actual?.views).toBeTruthy(); - delete actual?.__raw_UNSTABLE; - delete actual?.likes; - delete actual?.replies; - delete actual?.retweets; - delete actual?.views; - delete actual?.bookmarkCount; - expect(actual).toEqual(expected); -}); - -test('scraper can get tweet thread', async () => { - const scraper = await getScraper(); - const tweet = await scraper.getTweet('1665602315745673217'); - expect(tweet).not.toBeNull(); - expect(tweet?.isSelfThread).toBeTruthy(); - expect(tweet?.thread.length).toStrictEqual(7); -}); - -test('scraper can get liked tweets', async () => { - const scraper = await getScraper(); - const liked = scraper.getLikedTweets('elonmusk', 10); - const tweet = await liked.next(); - expect(tweet.value).not.toBeUndefined(); - expect(tweet.done).toBeFalsy(); - expect(tweet.value?.id).not.toBeUndefined(); -}); - -test('scraper can get animated image as video', async () => { - const scraper = await getScraper({ authMethod: 'anonymous' }); - const tweet = await scraper.getTweet('1947627689285673423'); - - const expectedURL = 'https://video.twimg.com/tweet_video/GwdbuOGX0AEuVrj.mp4'; - - expect(tweet?.videos).toContainEqual({ - id: '1947626213477961729', - preview: expectedURL, - url: expectedURL, - }); -}); diff --git a/twitter-scraper/src/tweets.ts b/twitter-scraper/src/tweets.ts deleted file mode 100644 index aee1f33..0000000 --- a/twitter-scraper/src/tweets.ts +++ /dev/null @@ -1,449 +0,0 @@ -import { addApiFeatures, requestApi, bearerToken2 } from './api'; -import { TwitterAuth } from './auth'; -import { getUserIdByScreenName } from './profile'; -import { LegacyTweetRaw, QueryTweetsResponse } from './timeline-v1'; -import { - parseTimelineTweetsV2, - TimelineV2, - TimelineEntryItemContentRaw, - parseTimelineEntryItemContentRaw, - ThreadedConversation, - parseThreadedConversation, -} from './timeline-v2'; -import { getTweetTimeline } from './timeline-async'; -import { apiRequestFactory } from './api-data'; -import { ListTimeline, parseListTimelineTweets } from './timeline-list'; -import { AuthenticationError } from './errors'; - -export interface Mention { - id: string; - username?: string; - name?: string; -} - -export interface Photo { - id: string; - url: string; - alt_text: string | undefined; -} - -export interface Video { - id: string; - preview: string; - url?: string; -} - -export interface PlaceRaw { - id?: string; - place_type?: string; - name?: string; - full_name?: string; - country_code?: string; - country?: string; - bounding_box?: { - type?: string; - coordinates?: number[][][]; - }; -} - -/** - * A parsed Tweet object. - */ -export interface Tweet { - __raw_UNSTABLE?: LegacyTweetRaw; - bookmarkCount?: number; - conversationId?: string; - hashtags: string[]; - html?: string; - id?: string; - inReplyToStatus?: Tweet; - inReplyToStatusId?: string; - isEdited?: boolean; - versions?: string[]; - isQuoted?: boolean; - isPin?: boolean; - isReply?: boolean; - isRetweet?: boolean; - isSelfThread?: boolean; - likes?: number; - name?: string; - mentions: Mention[]; - permanentUrl?: string; - photos: Photo[]; - place?: PlaceRaw; - quotedStatus?: Tweet; - quotedStatusId?: string; - replies?: number; - retweets?: number; - retweetedStatus?: Tweet; - retweetedStatusId?: string; - text?: string; - thread: Tweet[]; - timeParsed?: Date; - timestamp?: number; - urls: string[]; - userId?: string; - username?: string; - videos: Video[]; - views?: number; - sensitiveContent?: boolean; -} - -export type TweetQuery = - | Partial - | ((tweet: Tweet) => boolean | Promise); - -export const features = addApiFeatures({ - interactive_text_enabled: true, - longform_notetweets_inline_media_enabled: false, - responsive_web_text_conversations_enabled: false, - tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: - false, - vibe_api_enabled: false, -}); - -export async function fetchTweets( - userId: string, - maxTweets: number, - cursor: string | undefined, - auth: TwitterAuth, -): Promise { - if (maxTweets > 200) { - maxTweets = 200; - } - - const userTweetsRequest = apiRequestFactory.createUserTweetsRequest(); - userTweetsRequest.variables.userId = userId; - userTweetsRequest.variables.count = maxTweets; - userTweetsRequest.variables.includePromotedContent = false; // true on the website - - if (cursor != null && cursor != '') { - userTweetsRequest.variables['cursor'] = cursor; - } - - // Use bearerToken2 for UserTweets endpoint - const res = await requestApi( - userTweetsRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return parseTimelineTweetsV2(res.value); -} - -export async function fetchTweetsAndReplies( - userId: string, - maxTweets: number, - cursor: string | undefined, - auth: TwitterAuth, -): Promise { - if (maxTweets > 40) { - maxTweets = 40; - } - - const userTweetsRequest = - apiRequestFactory.createUserTweetsAndRepliesRequest(); - userTweetsRequest.variables.userId = userId; - userTweetsRequest.variables.count = maxTweets; - userTweetsRequest.variables.includePromotedContent = false; // true on the website - - if (cursor != null && cursor != '') { - userTweetsRequest.variables['cursor'] = cursor; - } - - // Use bearerToken2 for UserTweetsAndReplies endpoint - const res = await requestApi( - userTweetsRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return parseTimelineTweetsV2(res.value); -} - -export async function fetchListTweets( - listId: string, - maxTweets: number, - cursor: string | undefined, - auth: TwitterAuth, -): Promise { - if (maxTweets > 200) { - maxTweets = 200; - } - - const listTweetsRequest = apiRequestFactory.createListTweetsRequest(); - listTweetsRequest.variables.listId = listId; - listTweetsRequest.variables.count = maxTweets; - - if (cursor != null && cursor != '') { - listTweetsRequest.variables['cursor'] = cursor; - } - - // Use bearerToken2 for ListTweet endpoint - const res = await requestApi( - listTweetsRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return parseListTimelineTweets(res.value); -} - -export function getTweets( - user: string, - maxTweets: number, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(user, maxTweets, async (q, mt, c) => { - const userIdRes = await getUserIdByScreenName(q, auth); - - if (!userIdRes.success) { - throw userIdRes.err; - } - - const { value: userId } = userIdRes; - - return fetchTweets(userId, mt, c, auth); - }); -} - -export function getTweetsByUserId( - userId: string, - maxTweets: number, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(userId, maxTweets, (q, mt, c) => { - return fetchTweets(q, mt, c, auth); - }); -} - -export function getTweetsAndReplies( - user: string, - maxTweets: number, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(user, maxTweets, async (q, mt, c) => { - const userIdRes = await getUserIdByScreenName(q, auth); - - if (!userIdRes.success) { - throw userIdRes.err; - } - - const { value: userId } = userIdRes; - - return fetchTweetsAndReplies(userId, mt, c, auth); - }); -} - -export function getTweetsAndRepliesByUserId( - userId: string, - maxTweets: number, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(userId, maxTweets, (q, mt, c) => { - return fetchTweetsAndReplies(q, mt, c, auth); - }); -} - -export async function fetchLikedTweets( - userId: string, - maxTweets: number, - cursor: string | undefined, - auth: TwitterAuth, -): Promise { - if (!(await auth.isLoggedIn())) { - throw new AuthenticationError( - 'Scraper is not logged-in for fetching liked tweets.', - ); - } - - if (maxTweets > 200) { - maxTweets = 200; - } - - const userTweetsRequest = apiRequestFactory.createUserLikedTweetsRequest(); - userTweetsRequest.variables.userId = userId; - userTweetsRequest.variables.count = maxTweets; - userTweetsRequest.variables.includePromotedContent = false; // true on the website - - if (cursor != null && cursor != '') { - userTweetsRequest.variables['cursor'] = cursor; - } - - // Use bearerToken2 for UserLikedTweets endpoint - const res = await requestApi( - userTweetsRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - return parseTimelineTweetsV2(res.value); -} - -export function getLikedTweets( - user: string, - maxTweets: number, - auth: TwitterAuth, -): AsyncGenerator { - return getTweetTimeline(user, maxTweets, async (q, mt, c) => { - const userIdRes = await getUserIdByScreenName(q, auth); - - if (!userIdRes.success) { - throw userIdRes.err; - } - - const { value: userId } = userIdRes; - - return fetchLikedTweets(userId, mt, c, auth); - }); -} - -export async function getTweetWhere( - tweets: AsyncIterable, - query: TweetQuery, -): Promise { - const isCallback = typeof query === 'function'; - - for await (const tweet of tweets) { - const matches = isCallback - ? await query(tweet) - : checkTweetMatches(tweet, query); - - if (matches) { - return tweet; - } - } - - return null; -} - -export async function getTweetsWhere( - tweets: AsyncIterable, - query: TweetQuery, -): Promise { - const isCallback = typeof query === 'function'; - const filtered = []; - - for await (const tweet of tweets) { - const matches = isCallback ? query(tweet) : checkTweetMatches(tweet, query); - - if (!matches) continue; - filtered.push(tweet); - } - - return filtered; -} - -function checkTweetMatches(tweet: Tweet, options: Partial): boolean { - return Object.keys(options).every((k) => { - const key = k as keyof Tweet; - return tweet[key] === options[key]; - }); -} - -export async function getLatestTweet( - user: string, - includeRetweets: boolean, - max: number, - auth: TwitterAuth, -): Promise { - const timeline = getTweets(user, max, auth); - - // No point looping if max is 1, just use first entry. - return max === 1 - ? (await timeline.next()).value - : await getTweetWhere(timeline, { isRetweet: includeRetweets }); -} - -export interface TweetResultByRestId { - data?: TimelineEntryItemContentRaw; -} - -export async function getTweet( - id: string, - auth: TwitterAuth, -): Promise { - const tweetDetailRequest = apiRequestFactory.createTweetDetailRequest(); - tweetDetailRequest.variables.focalTweetId = id; - - // Use bearerToken2 for this specific endpoint (TweetDetail) - // This is required for animated GIFs to appear in tweets with mixed media - const res = await requestApi( - tweetDetailRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - if (!res.value) { - return null; - } - - const tweets = parseThreadedConversation(res.value); - return tweets.find((tweet) => tweet.id === id) ?? null; -} - -export async function getTweetAnonymous( - id: string, - auth: TwitterAuth, -): Promise { - const tweetResultByRestIdRequest = - apiRequestFactory.createTweetResultByRestIdRequest(); - tweetResultByRestIdRequest.variables.tweetId = id; - - // Use bearerToken2 for this specific endpoint (TweetResultByRestId) - // This matches the behavior observed in the Twitter web client and Go library - // We pass it as an override to avoid mutating shared state (concurrency-safe) - const res = await requestApi( - tweetResultByRestIdRequest.toRequestUrl(), - auth, - 'GET', - undefined, - undefined, - bearerToken2, - ); - - if (!res.success) { - throw res.err; - } - - if (!res.value.data) { - return null; - } - - return parseTimelineEntryItemContentRaw(res.value.data, id); -} diff --git a/twitter-scraper/src/type-util.ts b/twitter-scraper/src/type-util.ts deleted file mode 100644 index f987a4c..0000000 --- a/twitter-scraper/src/type-util.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type NonNullableField = { - [P in K]-?: T[P]; -} & T; - -export function isFieldDefined(key: K) { - return function (value: T): value is NonNullableField { - return isDefined(value[key]); - }; -} - -export function isDefined(value: T | null | undefined): value is T { - return value != null; -} diff --git a/twitter-scraper/src/xctxid.ts b/twitter-scraper/src/xctxid.ts deleted file mode 100644 index c99fda5..0000000 --- a/twitter-scraper/src/xctxid.ts +++ /dev/null @@ -1,176 +0,0 @@ -import fetch from 'cross-fetch'; -import debug from 'debug'; - -const log = debug('twitter-scraper:xctxid'); - -// @ts-expect-error import type annotation ("the current file is a CommonJS module") -type LinkeDOM = typeof import('linkedom'); - -let linkedom: LinkeDOM | null = null; -async function linkedomImport(): Promise { - if (!linkedom) { - const mod = await import('linkedom'); - linkedom = mod; - return mod; - } - return linkedom; -} - -async function parseHTML(html: string): Promise { - if (typeof window !== 'undefined') { - const { defaultView } = new DOMParser().parseFromString(html, 'text/html'); - if (!defaultView) { - throw new Error('Failed to get defaultView from parsed HTML.'); - } - return defaultView; - } else { - const { DOMParser } = await linkedomImport(); - return new DOMParser().parseFromString(html, 'text/html').defaultView; - } -} - -// Copied from https://github.com/Lqm1/x-client-transaction-id/blob/main/utils.ts with minor tweaks to support us passing a custom fetch function -async function handleXMigration(fetchFn: typeof fetch): Promise { - // Set headers to mimic a browser request - const headers = { - accept: - 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'accept-language': 'ja', - 'cache-control': 'no-cache', - pragma: 'no-cache', - priority: 'u=0, i', - 'sec-ch-ua': - '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-site': 'none', - 'sec-fetch-user': '?1', - 'upgrade-insecure-requests': '1', - 'user-agent': - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', - }; - - // Fetch X.com homepage - const response = await fetchFn('https://x.com', { - headers, - }); - - if (!response.ok) { - throw new Error(`Failed to fetch X homepage: ${response.statusText}`); - } - - const htmlText = await response.text(); - - // Parse HTML using linkedom - let dom = await parseHTML(htmlText); - let document = dom.window.document; - - // Check for migration redirection links - const migrationRedirectionRegex = new RegExp( - '(http(?:s)?://(?:www\\.)?(twitter|x){1}\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\-_]+)+', - 'i', - ); - - const metaRefresh = document.querySelector("meta[http-equiv='refresh']"); - const metaContent = metaRefresh - ? metaRefresh.getAttribute('content') || '' - : ''; - - const migrationRedirectionUrl = - migrationRedirectionRegex.exec(metaContent) || - migrationRedirectionRegex.exec(htmlText); - - if (migrationRedirectionUrl) { - // Follow redirection URL - const redirectResponse = await fetch(migrationRedirectionUrl[0]); - - if (!redirectResponse.ok) { - throw new Error( - `Failed to follow migration redirection: ${redirectResponse.statusText}`, - ); - } - - const redirectHtml = await redirectResponse.text(); - dom = await parseHTML(redirectHtml); - document = dom.window.document; - } - - // Handle migration form if present - const migrationForm = - document.querySelector("form[name='f']") || - document.querySelector("form[action='https://x.com/x/migrate']"); - - if (migrationForm) { - const url = - migrationForm.getAttribute('action') || 'https://x.com/x/migrate'; - const method = migrationForm.getAttribute('method') || 'POST'; - - // Collect form input fields - const requestPayload = new FormData(); - - const inputFields = migrationForm.querySelectorAll('input'); - for (const element of Array.from(inputFields)) { - const name = element.getAttribute('name'); - const value = element.getAttribute('value'); - if (name && value) { - requestPayload.append(name, value); - } - } - - // Submit form using POST request - const formResponse = await fetch(url, { - method: method, - body: requestPayload, - headers, - }); - - if (!formResponse.ok) { - throw new Error( - `Failed to submit migration form: ${formResponse.statusText}`, - ); - } - - const formHtml = await formResponse.text(); - dom = await parseHTML(formHtml); - document = dom.window.document; - } - - // Return final DOM document - return document; -} - -let ClientTransaction: - | typeof import('x-client-transaction-id')['ClientTransaction'] - | null = null; -async function clientTransaction(): Promise< - typeof import('x-client-transaction-id')['ClientTransaction'] -> { - if (!ClientTransaction) { - const mod = await import('x-client-transaction-id'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ClientTransaction = mod.ClientTransaction as any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return mod.ClientTransaction as any; - } - return ClientTransaction; -} - -export async function generateTransactionId( - url: string, - fetchFn: typeof fetch, - method: 'GET' | 'POST', -) { - const parsedUrl = new URL(url); - const path = parsedUrl.pathname; - - log(`Generating transaction ID for ${method} ${path}`); - const document = await handleXMigration(fetchFn); - const ClientTransactionClass = await clientTransaction(); - const transaction = await ClientTransactionClass.create(document); - const transactionId = await transaction.generateTransactionId(method, path); - log(`Transaction ID: ${transactionId}`); - - return transactionId; -} diff --git a/twitter-scraper/src/xpff.ts b/twitter-scraper/src/xpff.ts deleted file mode 100644 index 5342249..0000000 --- a/twitter-scraper/src/xpff.ts +++ /dev/null @@ -1,103 +0,0 @@ -import debug from 'debug'; - -const log = debug('twitter-scraper:xpff'); - -let isoCrypto: Crypto | null = null; - -async function getCrypto(): Promise { - if (isoCrypto != null) { - return isoCrypto; - } - - // In Node.js, the global `crypto` object is only available from v19.0.0 onwards. - // For earlier versions, we need to import the 'crypto' module. - if (typeof crypto === 'undefined') { - log('Global crypto is undefined, importing from crypto module...'); - const { webcrypto } = await import('crypto'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - isoCrypto = webcrypto as any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return webcrypto as any; - } - isoCrypto = crypto; - return crypto; -} - -async function sha256(message: string): Promise { - const msgBuffer = new TextEncoder().encode(message); - const crypto = await getCrypto(); - const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); - return new Uint8Array(hashBuffer); -} - -// https://stackoverflow.com/a/40031979 -function buf2hex(buffer: ArrayBuffer): string { - return [...new Uint8Array(buffer)] - .map((x) => x.toString(16).padStart(2, '0')) - .join(''); -} - -// Adapted from https://github.com/dsekz/twitter-x-xp-forwarded-for-header -export class XPFFHeaderGenerator { - constructor(private readonly seed: string) {} - - private async deriveKey(guestId: string): Promise { - const combined = `${this.seed}${guestId}`; - const result = await sha256(combined); - return result; - } - - async generateHeader(plaintext: string, guestId: string): Promise { - log(`Generating XPFF key for guest ID: ${guestId}`); - const key = await this.deriveKey(guestId); - const crypto = await getCrypto(); - const nonce = crypto.getRandomValues(new Uint8Array(12)); - const cipher = await crypto.subtle.importKey( - 'raw', - key as BufferSource, - { name: 'AES-GCM' }, - false, - ['encrypt'], - ); - const encrypted = await crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: nonce, - }, - cipher, - new TextEncoder().encode(plaintext), - ); - - // Combine nonce and encrypted data - const combined = new Uint8Array(nonce.length + encrypted.byteLength); - combined.set(nonce); - combined.set(new Uint8Array(encrypted), nonce.length); - const result = buf2hex(combined.buffer); - - log(`XPFF header generated for guest ID ${guestId}: ${result}`); - - return result; - } -} - -const xpffBaseKey = - '0e6be1f1e21ffc33590b888fd4dc81b19713e570e805d4e5df80a493c9571a05'; - -function xpffPlain(): string { - const timestamp = Date.now(); - return JSON.stringify({ - navigator_properties: { - hasBeenActive: 'true', - userAgent: - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', - webdriver: 'false', - }, - created_at: timestamp, - }); -} - -export async function generateXPFFHeader(guestId: string): Promise { - const generator = new XPFFHeaderGenerator(xpffBaseKey); - const plaintext = xpffPlain(); - return generator.generateHeader(plaintext, guestId); -} diff --git a/twitter-scraper/test-setup.js b/twitter-scraper/test-setup.js deleted file mode 100644 index 49c5517..0000000 --- a/twitter-scraper/test-setup.js +++ /dev/null @@ -1 +0,0 @@ -globalThis.PLATFORM_NODE = true; diff --git a/twitter-scraper/tsconfig.json b/twitter-scraper/tsconfig.json deleted file mode 100644 index ea9ff20..0000000 --- a/twitter-scraper/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "@tsconfig/node16/tsconfig.json", - "exclude": ["node_modules", "dist", "examples", "**/*.test.ts", "src/test-utils.ts"], - "compilerOptions": { - // TODO: Remove "dom" from this when support for Node 16 is dropped - "lib": ["es2021", "dom"], - "outDir": "./dist", - "rootDir": "./src", - "sourceMap": true, - "declaration": true, - "declarationMap": true, - "declarationDir": "./dist", - "strict": true, - "noImplicitAny": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "stripInternal": true, - "isolatedModules": true, - "types": ["jest"] - } -} diff --git a/twitter-scraper/typedoc.json b/twitter-scraper/typedoc.json deleted file mode 100644 index 3de2587..0000000 --- a/twitter-scraper/typedoc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "entryPointStrategy": "expand", - "entryPoints": ["src/_module.ts"], - "exclude": ["**/*.test.ts"], - "hideGenerator": true -} \ No newline at end of file diff --git a/twitter-scraper/yarn.lock b/twitter-scraper/yarn.lock deleted file mode 100644 index 9f1cd61..0000000 --- a/twitter-scraper/yarn.lock +++ /dev/null @@ -1,5223 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.27.2": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz" - integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== - -"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz" - integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.4" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.4" - "@babel/types" "^7.28.4" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.28.3", "@babel/generator@^7.7.2": - version "7.28.3" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz" - integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== - dependencies: - "@babel/parser" "^7.28.3" - "@babel/types" "^7.28.2" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== - dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helpers@^7.28.4": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" - integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz" - integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== - dependencies: - "@babel/types" "^7.28.4" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/template@^7.27.2", "@babel/template@^7.3.3": - version "7.27.2" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz" - integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.4" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.3.3": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz" - integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@commitlint/cli@^17.6.3": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.1.tgz" - integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== - dependencies: - "@commitlint/format" "^17.8.1" - "@commitlint/lint" "^17.8.1" - "@commitlint/load" "^17.8.1" - "@commitlint/read" "^17.8.1" - "@commitlint/types" "^17.8.1" - execa "^5.0.0" - lodash.isfunction "^3.0.9" - resolve-from "5.0.0" - resolve-global "1.0.0" - yargs "^17.0.0" - -"@commitlint/config-conventional@^17.6.3": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz" - integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== - dependencies: - conventional-changelog-conventionalcommits "^6.1.0" - -"@commitlint/config-validator@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz" - integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== - dependencies: - "@commitlint/types" "^17.8.1" - ajv "^8.11.0" - -"@commitlint/ensure@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz" - integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== - dependencies: - "@commitlint/types" "^17.8.1" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.upperfirst "^4.3.1" - -"@commitlint/execute-rule@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz" - integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== - -"@commitlint/format@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz" - integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== - dependencies: - "@commitlint/types" "^17.8.1" - chalk "^4.1.0" - -"@commitlint/is-ignored@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz" - integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== - dependencies: - "@commitlint/types" "^17.8.1" - semver "7.5.4" - -"@commitlint/lint@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz" - integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== - dependencies: - "@commitlint/is-ignored" "^17.8.1" - "@commitlint/parse" "^17.8.1" - "@commitlint/rules" "^17.8.1" - "@commitlint/types" "^17.8.1" - -"@commitlint/load@^17.8.1", "@commitlint/load@>6.1.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz" - integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== - dependencies: - "@commitlint/config-validator" "^17.8.1" - "@commitlint/execute-rule" "^17.8.1" - "@commitlint/resolve-extends" "^17.8.1" - "@commitlint/types" "^17.8.1" - "@types/node" "20.5.1" - chalk "^4.1.0" - cosmiconfig "^8.0.0" - cosmiconfig-typescript-loader "^4.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - resolve-from "^5.0.0" - ts-node "^10.8.1" - typescript "^4.6.4 || ^5.2.2" - -"@commitlint/message@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz" - integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== - -"@commitlint/parse@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz" - integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== - dependencies: - "@commitlint/types" "^17.8.1" - conventional-changelog-angular "^6.0.0" - conventional-commits-parser "^4.0.0" - -"@commitlint/read@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz" - integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== - dependencies: - "@commitlint/top-level" "^17.8.1" - "@commitlint/types" "^17.8.1" - fs-extra "^11.0.0" - git-raw-commits "^2.0.11" - minimist "^1.2.6" - -"@commitlint/resolve-extends@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz" - integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== - dependencies: - "@commitlint/config-validator" "^17.8.1" - "@commitlint/types" "^17.8.1" - import-fresh "^3.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/rules@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz" - integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== - dependencies: - "@commitlint/ensure" "^17.8.1" - "@commitlint/message" "^17.8.1" - "@commitlint/to-lines" "^17.8.1" - "@commitlint/types" "^17.8.1" - execa "^5.0.0" - -"@commitlint/to-lines@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz" - integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== - -"@commitlint/top-level@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz" - integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== - dependencies: - find-up "^5.0.0" - -"@commitlint/types@^17.8.1": - version "17.8.1" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz" - integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== - dependencies: - chalk "^4.1.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@gerrit0/mini-shiki@^1.24.0": - version "1.27.2" - resolved "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz" - integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== - dependencies: - "@shikijs/engine-oniguruma" "^1.27.2" - "@shikijs/types" "^1.27.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.0.0", "@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.0.0", "@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@noble/hashes@1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@rollup/pluginutils@^5.0.5": - version "5.1.0" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@shikijs/engine-oniguruma@^1.27.2": - version "1.27.2" - resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.2.tgz" - integrity sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ== - dependencies: - "@shikijs/types" "1.27.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/types@^1.27.2", "@shikijs/types@1.27.2": - version "1.27.2" - resolved "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz" - integrity sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinclair/typebox@^0.32.20": - version "0.32.32" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.32.32.tgz" - integrity sha512-m+A3zFSI87TCtoz6vQCSnd+t/kDKL78JmzhKYkON+7SnHSa+794qraIVpm6ozFGK+5svnVOt1LJ7BUEhGkIvgg== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@tsconfig/node16@^16.1.0": - version "16.1.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.3.tgz" - integrity sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/debug@^4.1.12": - version "4.1.12" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/estree@^1.0.0", "@types/estree@1.0.5": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.1": - version "29.5.12" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json-stable-stringify@^1.0.34": - version "1.0.36" - resolved "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz" - integrity sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw== - -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - -"@types/ms@*": - version "2.1.0" - resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" - integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== - -"@types/node@*", "@types/node@20.5.1": - version "20.5.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz" - integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== - -"@types/node@^20.14.0": - version "20.19.18" - resolved "https://registry.npmjs.org/@types/node/-/node-20.19.18.tgz" - integrity sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg== - dependencies: - undici-types "~6.21.0" - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/set-cookie-parser@^2.4.2": - version "2.4.9" - resolved "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.9.tgz" - integrity sha512-bCorlULvl0xTdjj4BPUHX4cqs9I+go2TfW/7Do1nnFYWS0CPP429Qr1AY42kiFhCwLpvAkWFr1XIBHd8j6/MCQ== - dependencies: - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/tough-cookie@^4.0.2": - version "4.0.5" - resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" - integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== - -"@types/unist@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.59.7": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.59.7": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== - dependencies: - acorn "^8.11.0" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== - -agent-base@^7.0.2: - version "7.1.1" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.11.0: - version "8.16.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async-generator-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/async-generator-function/-/async-generator-function-1.0.0.tgz" - integrity sha512-+NAXNqgCrB95ya4Sr66i1CL2hqLVckAk7xwRYWdcm39/ELQ6YNn1aw5r0bdQtqNZgQpEWzc5yc/igXc7aL5SLA== - -async@^3.2.4: - version "3.2.5" - resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -babel-jest@^29.0.0, babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz" - integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -baseline-browser-mapping@^2.8.3: - version "2.8.9" - resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz" - integrity sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, "browserslist@>= 4.21.0": - version "4.26.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz" - integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== - dependencies: - baseline-browser-mapping "^2.8.3" - caniuse-lite "^1.0.30001741" - electron-to-chromium "^1.5.218" - node-releases "^2.0.21" - update-browserslist-db "^1.1.3" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -cachedir@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001741: - version "1.0.30001745" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz" - integrity sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ== - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.18.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - -commitizen@^4.0.3: - version "4.3.0" - resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz" - integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== - dependencies: - cachedir "2.3.0" - cz-conventional-changelog "3.3.0" - dedent "0.7.0" - detect-indent "6.1.0" - find-node-modules "^2.1.2" - find-root "1.1.0" - fs-extra "9.1.0" - glob "7.2.3" - inquirer "8.2.5" - is-utf8 "^0.2.1" - lodash "4.17.21" - minimist "1.2.7" - strip-bom "4.0.0" - strip-json-comments "3.1.1" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -conventional-changelog-angular@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz" - integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-conventionalcommits@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz" - integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== - dependencies: - compare-func "^2.0.0" - -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - -conventional-commits-parser@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz" - integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== - dependencies: - is-text-path "^1.0.1" - JSONStream "^1.3.5" - meow "^8.1.2" - split2 "^3.2.2" - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cosmiconfig-typescript-loader@^4.0.0: - version "4.4.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz" - integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== - -cosmiconfig@^8.0.0, cosmiconfig@>=7: - version "8.3.6" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^4.0.0-alpha.5: - version "4.0.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-select@^5.1.0: - version "5.2.2" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz" - integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.2.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz" - integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cycletls@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/cycletls/-/cycletls-2.0.4.tgz" - integrity sha512-kyQewFdaKa+IiUd4sR0PmNP0+xXPTx+7eC8LPTmR0/F5Txv40Z7OSI46cQqWM8cgiCwOf6GsB3s9QK9TLizYog== - dependencies: - "@types/node" "^20.14.0" - form-data "^4.0.0" - ws "^8.17.0" - -cz-conventional-changelog@^3.3.0, cz-conventional-changelog@3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@4: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -dedent@^1.0.0: - version "1.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz" - integrity sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ== - -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1, domutils@^3.2.1: - version "3.2.2" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@^16.3.1: - version "16.6.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.5.218: - version "1.5.227" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz" - integrity sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA== - -email-addresses@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz" - integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz" - integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.3.1: - version "1.5.3" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz" - integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -esbuild@^0.21.5, esbuild@>=0.18.0: - version "0.21.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.8.0: - version "8.10.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.41.0, eslint@>=7.0.0, eslint@>=7.28.0: - version "8.57.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz" - integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== - -filenamify@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-node-modules@^2.1.2: - version "2.1.3" - resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz" - integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== - dependencies: - findup-sync "^4.0.0" - merge "^2.1.1" - -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -findup-sync@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" - integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^4.0.2" - resolve-dir "^1.0.1" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -fs-extra@^11.0.0: - version "11.2.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -generator-function@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.0.tgz" - integrity sha512-xPypGGincdfyl/AiSGa7GjXLkvld9V7GjZlowup9SHIJnQnHLFiLODCd/DqKOp0PBagbHJ68r1KJI9Mut7m4sA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.6: - version "1.3.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.1.tgz" - integrity sha512-fk1ZVEeOX9hVZ6QzoBNEC55+Ucqg4sTVwrVuigZhuRPESVFpMyXnd3sbXvPOwp7Y9riVyANiqhEuRF0G1aVSeQ== - dependencies: - async-function "^1.0.0" - async-generator-function "^1.0.0" - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - generator-function "^2.0.0" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-tsconfig@^4.7.2: - version "4.7.5" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== - dependencies: - resolve-pkg-maps "^1.0.0" - -gh-pages@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/gh-pages/-/gh-pages-5.0.0.tgz" - integrity sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ== - dependencies: - async "^3.2.4" - commander "^2.18.0" - email-addresses "^5.0.0" - filenamify "^4.3.0" - find-cache-dir "^3.3.1" - fs-extra "^8.1.0" - globby "^6.1.0" - -git-raw-commits@^2.0.11: - version "2.0.11" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.7: - version "10.4.1" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - path-scurry "^1.11.1" - -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@7.2.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" - integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -headers-polyfill@^3.1.2: - version "3.3.0" - resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.3.0.tgz" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-escaper@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz" - integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== - -htmlparser2@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz" - integrity sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.2.1" - entities "^6.0.0" - -https-proxy-agent@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.3, inherits@^2.0.4, inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.16.0, is-core-module@^2.5.0: - version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== - dependencies: - text-extensions "^1.0.0" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@*, jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.0.0, jest@^29.5.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.2: - version "1.1.1" - resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkedom@^0.18.12, linkedom@^0.18.9: - version "0.18.12" - resolved "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz" - integrity sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q== - dependencies: - css-select "^5.1.0" - cssom "^0.5.0" - html-escaper "^3.0.3" - htmlparser2 "^10.0.0" - uhyphen "^0.2.0" - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -lint-staged@^13.2.2: - version "13.3.0" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz" - integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash@^4.17.15, lodash@^4.17.21, lodash@4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" - integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== - -lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -magic-string@^0.30.10: - version "0.30.10" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1, make-error@1.x: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -markdown-it@^14.1.0: - version "14.1.0" - resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" - integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -meow@^8.0.0, meow@^8.1.2: - version "8.1.2" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" - integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -micromatch@4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minimist@1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.21: - version "2.0.21" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz" - integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -otpauth@^9.2.2: - version "9.3.1" - resolved "https://registry.npmjs.org/otpauth/-/otpauth-9.3.1.tgz" - integrity sha512-E6d2tMxPofHNk4sRFp+kqW7vQ+WJGO9VLI2N/W00DnI+ThskU12Qa10kyNSGklrzhN5c+wRUsN4GijVgCU2N9w== - dependencies: - "@noble/hashes" "1.4.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pirates@^4.0.4: - version "4.0.7" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.8.8, prettier@>=2.0.0: - version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@3: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0, resolve-from@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-global@^1.0.0, resolve-global@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.10.0, resolve@^1.20.0: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^5.0.7: - version "5.0.7" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz" - integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== - dependencies: - glob "^10.3.7" - -rollup-plugin-dts@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz" - integrity sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA== - dependencies: - magic-string "^0.30.10" - optionalDependencies: - "@babel/code-frame" "^7.24.2" - -rollup-plugin-esbuild@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.1.1.tgz" - integrity sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw== - dependencies: - "@rollup/pluginutils" "^5.0.5" - debug "^4.3.4" - es-module-lexer "^1.3.1" - get-tsconfig "^4.7.2" - -"rollup@^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, "rollup@^3.29.4 || ^4", rollup@^4.18.0: - version "4.18.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" - fsevents "~2.3.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^6.0.0: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.0: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@7.5.4: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -set-cookie-parser@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.18" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz" - integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== - -split2@^3.0.0, split2@^3.2.2: - version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^4.0.0, strip-bom@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1, strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through@^2.3.6, "through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" - integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== - dependencies: - escape-string-regexp "^1.0.2" - -ts-jest@^29.1.0: - version "29.1.5" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz" - integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" - -ts-node@^10.8.1, ts-node@>=10, ts-node@>=9.0.0: - version "10.9.2" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.5.2: - version "2.6.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -typedoc@^0.27.6: - version "0.27.6" - resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.27.6.tgz" - integrity sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw== - dependencies: - "@gerrit0/mini-shiki" "^1.24.0" - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - yaml "^2.6.1" - -"typescript@^4.5 || ^5.0", "typescript@^4.6.4 || ^5.2.2", typescript@^5.0.4, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4, "typescript@>=4.3 <6", typescript@>=4.9.5, "typescript@5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x": - version "5.4.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -uhyphen@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz" - integrity sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA== - -undici-types@~6.21.0: - version "6.21.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" - integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2, uri-js@^4.4.1: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.2.14: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.0.3, word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^8.17.0: - version "8.18.3" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== - -x-client-transaction-id@^0.1.9: - version "0.1.9" - resolved "https://registry.npmjs.org/x-client-transaction-id/-/x-client-transaction-id-0.1.9.tgz" - integrity sha512-CES4zgkJ0wbfFWm0qgdKphthyb+L7lVHymgOY15v6ivcWSx5p9lp5kzAed+BuqJSP7bS0GbQyJ16ONkRthgsUw== - dependencies: - linkedom "^0.18.9" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.6.1: - version "2.7.0" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== - -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.0.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.0.0, yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -- 2.51.2