diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d297e8d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +* text eol=lf + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mp4 binary +*.mp3 binary +*.gz binary +*.zip binary +*.ttf binary +*.woff binary diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 4db57c5..0000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,30 +0,0 @@ -# Contributing - -## Requiered knowledge - -- JavaScript -- html5 -- NodeJS - -Additional: - -- CSS -- [VueJS](https://vuejs.org/) -- [ElectronJS](https://electronjs.org/) -- [NPMjs](https://www.npmjs.com/) - -A source code editor is also requiered. We recommend [Visual Studio Code](https://code.visualstudio.com/). - -### Installing the components - -1. Install [Git](https://git-scm.com/) -2. Install [Node](https://nodejs.org/en/) - -### Cloning the project - -1. Fork the [repository](https://github.com/PreMiD/PreMiD) -2. Open a terminal and type `git clone https://github.com/PreMiD/PreMiD` - -### Coding your vision - -Please keep the structure. We don't want to disorganize our project. Chaotic files may not be accepted. diff --git a/.github/Electron/Chrome_bsp.png b/.github/Electron/Chrome_bsp.png deleted file mode 100644 index a825887..0000000 Binary files a/.github/Electron/Chrome_bsp.png and /dev/null differ diff --git a/.github/Electron/PMD_Banner.png b/.github/Electron/PMD_Banner.png deleted file mode 100644 index ffcb7de..0000000 Binary files a/.github/Electron/PMD_Banner.png and /dev/null differ diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 231e04b..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: Timeraa -patreon: Timeraa -ko_fi: Timeraa diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index c3870f2..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve ---- - - - - - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. -2. -3. - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index d13ab83..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for PreMiD ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/Logo.png b/.github/Logo.png deleted file mode 100644 index c5948d3..0000000 Binary files a/.github/Logo.png and /dev/null differ diff --git a/.github/Patreon.png b/.github/Patreon.png deleted file mode 100644 index f9d8ca0..0000000 Binary files a/.github/Patreon.png and /dev/null differ diff --git a/.github/PayPal.svg b/.github/PayPal.svg deleted file mode 100644 index 07abe62..0000000 --- a/.github/PayPal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md deleted file mode 100644 index 285c3ef..0000000 --- a/.github/SUPPORT.md +++ /dev/null @@ -1,13 +0,0 @@ -# How to get support - -## Take a look at the [wiki](https://wiki.premid.app) -Our GitHub wiki is full of information around PreMiD.
-Take a look and feel free to contribute if you want to add something new. - -## [Open a issue](https://github.com/PreMiD/PreMiD/issues/new/choose) on [GitHub](https://github.com/PreMiD/PreMiD) -Simply open a issue if you don't feel allright.
-*Aand there he goes...* - -## Ask a staff member in [#support](https://discord.premid.app) -The team is ready to tell you the secrets of the underworld.
-Join our [Discord server](https://discord.premid.app) and find out what we're hiding. diff --git a/.github/TwitterButton.png b/.github/TwitterButton.png deleted file mode 100644 index 3e5799b..0000000 Binary files a/.github/TwitterButton.png and /dev/null differ diff --git a/.github/example.png b/.github/example.png deleted file mode 100644 index a825887..0000000 Binary files a/.github/example.png and /dev/null differ diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 63b5e37..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: DePloY -on: - release: - types: [published] -env: - NODE_ENV: DePloY -jobs: - package: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macOS-latest, windows-latest] - steps: - - uses: actions/checkout@master - - uses: actions/setup-node@master - - name: Install Dependencies - run: | - npm i - npm i -g typescript rimraf - - name: Prepare to package - run: npm run init - - name: Package - run: | - npm run pkg - rimraf dist/app - node util/zip dist ${{ matrix.os }}.zip --zip - - name: Upload bundle - env: - SSHHOST: ${{ secrets.MAIN_HOST }} - SSH_USERNAME: ${{ secrets.SSH_USERNAME }} - SSH_KEY: ${{ secrets.SSH_KEY }} - run: | - tsc util/uploadFile util/zip - node util/uploadFile ${{ matrix.os }}.zip /home/PreMiD/download/util/${{ matrix.os }}.zip - createInstallers: - runs-on: "ubuntu-latest" - needs: package - steps: - - uses: actions/checkout@master - - uses: actions/setup-node@master - - name: Install dependencies - run: | - sudo npm i - sudo npm i -g typescript - - name: Download InstallBuilder - run: | - wget https://clients.bitrock.com/installbuilder/installbuilder-enterprise-20.12.0-linux-x64-installer.run - chmod u+x installbuilder-enterprise-20.12.0-linux-x64-installer.run - - name: Install InstallBuilder - run: | - ./installbuilder-enterprise-20.12.0-linux-x64-installer.run --installer-language en --prefix ./installbuilder --mode unattended - echo "${{ secrets.IBLICENSE }}" > ./installbuilder/license.xml - - name: Prepare Upgrade Installer - run: | - tsc util/prepare - node util/prepare - - name: Create Upgrade Installer (MacOS 64bit) - run: | - installbuilder/bin/builder build installer_assets/PreMiD-Upgrade.xml osx - - name: Create Upgrade Installer (Windows) - run: | - installbuilder/bin/builder build installer_assets/PreMiD-Upgrade.xml windows - - name: Upload files - env: - SSHHOST: ${{ secrets.MAIN_HOST }} - SSH_USERNAME: ${{ secrets.SSH_USERNAME }} - SSH_KEY: ${{ secrets.SSH_KEY }} - run: | - tsc util/uploadFile util/zip - node util/uploadFile dist/installer/upgrader.exe /home/PreMiD/download/upgrader.exe - node util/uploadFile dist/installer/upgrader.app.zip /home/PreMiD/download/util/upgrader.app.zip - - name: Finalize build - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.MAIN_HOST }} - username: ${{ secrets.SSH_USERNAME }} - key: ${{ secrets.SSH_KEY }} - script: | - cd /home/PreMiD/download/util - unzip upgrader.app.zip - tar -czvf upgrader.app.tgz upgrader.app - mv upgrader.app.tgz ../ - rm -rf upgrader.app upgrader.app.zip - unzip windows-latest.zip - cd windows-latest/PreMiD-win32-x64/ - zip -r ../../PreMiD-win32-x64.zip . - mv ../../PreMiD-win32-x64.zip /home/PreMiD/download/ - cd ../PreMiD-win32-ia32/ - zip -r ../../PreMiD-win32-x86.zip . - mv ../../PreMiD-win32-x86.zip /home/PreMiD/download/ - cd ../.. - rm -rf windows-latest windows-latest.zip - unzip macOS-latest.zip - cd macOS-latest/PreMiD-darwin-x64/ - zip -r ../../PreMiD-darwin-x64.zip . - mv ../../PreMiD-darwin-x64.zip /home/PreMiD/download/ - cd ../.. - rm -rf macOS-latest macOS-latest.zip diff --git a/.gitignore b/.gitignore index 30a7e50..865d8a4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ node_modules out dist tmp +lib +data .vscode .env @@ -18,3 +20,9 @@ src/update.ini *.app *.xml.backup *.js +!*.config.js + +coverage +*.tsbuildinfo +.DS_Store +*.log \ No newline at end of file diff --git a/@types/PreMiD/ExtensionSettings.d.ts b/@types/PreMiD/ExtensionSettings.d.ts deleted file mode 100644 index 9ca74c9..0000000 --- a/@types/PreMiD/ExtensionSettings.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -export default interface ExtensionSettings { - /** - * If extension is enabled - */ - enabled: boolean; - /** - * Autolaunch enabled - */ - autoLaunch: boolean; - /** - * Media keys enabled - */ - mediaKeys: boolean; - /** - * title menubar (TrayTitle) - */ - titleMenubar: boolean; - /** - * language of extension - */ - language: string; -} diff --git a/@types/PreMiD/Presence.d.ts b/@types/PreMiD/Presence.d.ts deleted file mode 100644 index 3157b7d..0000000 --- a/@types/PreMiD/Presence.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as Discord from "discord-rpc"; - -export default interface Presence { - /** - * Client ID of presence - */ - clientId: string; - /** - * Rich Procedual call connection - */ - rpc: Discord.Client; - /** - * Connection ready? - */ - ready: Boolean; -} diff --git a/@types/PreMiD/PresenceData.d.ts b/@types/PreMiD/PresenceData.d.ts deleted file mode 100644 index 2a5c4e5..0000000 --- a/@types/PreMiD/PresenceData.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as Discord from "discord-rpc"; - -export default interface PresenceData { - /** - * Client ID of presence - */ - clientId: string; - /** - * Tray title to be shown in Mac OS tray - */ - trayTitle: string; - /** - * service name of presence - * @deprecated - */ - service: string; - /** - * Determines if the service is currently playing something back or not, if false it will automatically hide after 1 minute - */ - playback: boolean; - /** - * Discord Presence which gets sent directly to Discord app - */ - presenceData: Discord.Presence; - /** - * Determines if the service should be hidden (clearActivity) - */ - hidden: boolean; - /** - * Determines if the service is mediaKey able / uses them - */ - mediaKeys: boolean; -} diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 1caef05..0000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @Timeraa diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 9978e55..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,66 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at contact@premid.app or by contacting a staff member on our [Discord server](https://discord.premid.app). All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. diff --git a/README.md b/README.md index 1cf0007..e292c56 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,44 @@ -
+Chrome Global Screenshots -
+# PreMiD -# PreMiD +[![Crowdin](https://badges.crowdin.net/premid/localized.svg)](https://crowdin.com/project/premid) -## Your Rich Presence for web services! +PreMiD is a simple, configurable utility that lets you show what you're doing on the web in your Discord profile. Whether you're watching videos, listening to music, browsing your favorite sites, or playing browser games, PreMiD helps you share your online activities with your friends through Discord's Rich Presence feature. -![GitHub](https://img.shields.io/github/license/PreMiD/PreMiD?style=for-the-badge) -![GitHub release (latest by date)](https://img.shields.io/github/v/release/premid/premid?label=Application&style=for-the-badge) -![Chrome Web Store](https://img.shields.io/chrome-web-store/v/agjnjboanicjcpenljmaaigopkgdnihi?label=Extension&style=for-the-badge) -[![Chrome Web Store](https://img.shields.io/chrome-web-store/d/agjnjboanicjcpenljmaaigopkgdnihi.svg?label=Chrome&logo=google%20chrome&logoColor=white&colorA=4285F4&style=for-the-badge)](https://chrome.google.com/webstore/detail/premid/agjnjboanicjcpenljmaaigopkgdnihi) -![Website](https://img.shields.io/website?down_message=offline&label=PreMiD.app&style=for-the-badge&up_message=online&url=https%3A%2F%2Fpremid.app) -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FPreMiD%2FPreMiD.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FPreMiD%2FPreMiD?ref=badge_shield) +## Getting Started -
+**Looking to use PreMiD?** Head over to our [official website](https://premid.app) to add the browser extension! -# About +**Want to create your own Activity?** All of our community-created activities are open source and available at [github.com/PreMiD/Activities](https://github.com/PreMiD/Activities). We'd love to see what you create! -**PreMiD** is a simple, configurable utility that allows you to show what you're doing on the web in your Discord **now playing status**. It supports many different websites, and will support multiple users watching the same content simultaneously in an upcoming update. +## Features -# Features +- 🎵 Show what you're listening to on YouTube and more (Spotify has native Discord support) +- 📺 Display what you're watching on Netflix, Disney+, Twitch, and hundreds of other sites +- 🎮 Share your browser game activity with friends +- ✨ Fully customizable with thousands of user-created Activities +- 🌍 Available in multiple languages thanks to our amazing community translators -· Displays your current web service in Discord as your status.
-· Grants full control over Presences.
-· Supports over 1,000 web services, still rising!
-· _Watch parties and more are coming soon!_ +## Community -# Installation/Troubleshooting +PreMiD is built by the community, for the community. Join us and help make PreMiD even better! -### Installation instructions, Troubleshooting guides etc. can be located at our [**docs**](https://docs.premid.app). +- **Activities Repository**: [github.com/PreMiD/Activities](https://github.com/PreMiD/Activities) +- **Documentation**: [docs.premid.app](https://docs.premid.app) +- **Discord Server**: [discord.premid.app](https://discord.premid.app) +- **Feedback & Bug Reports**: [feedback.premid.app](https://feedback.premid.app) -# Support us +## Contributing -
- - - - - Join our Discord! - -
+We love community contributions! While **PreMiD's Activities are fully open source** (the code that makes websites show up on your profile), the PreMiD extension is not currently open source. This decision allows our small team to move fast and iterate quickly to deliver the best experience possible. + +You can contribute by: +- Creating new Activities at [github.com/PreMiD/Activities](https://github.com/PreMiD/Activities) +- Helping translate PreMiD on [Crowdin](https://crowdin.com/project/premid) +- Reporting bugs and suggesting features at [feedback.premid.app](https://feedback.premid.app) +- Supporting the project and spreading the word! ## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FPreMiD%2FPreMiD.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FPreMiD%2FPreMiD?ref=badge_large) +This project is licensed under the [MPL-2.0 License](LICENSE). diff --git a/apps/pd/README.md b/apps/pd/README.md new file mode 100644 index 0000000..0ba246e --- /dev/null +++ b/apps/pd/README.md @@ -0,0 +1,3 @@ +# @premid/pd + +A simple url shortener service to shorten urls longer than 256 characters. diff --git a/apps/pd/environment.d.ts b/apps/pd/environment.d.ts new file mode 100644 index 0000000..368b296 --- /dev/null +++ b/apps/pd/environment.d.ts @@ -0,0 +1,12 @@ +declare namespace NodeJS { + export interface ProcessEnv { + NODE_ENV?: "development" | "production" | "test"; + REDIS_URL?: string; + MAX_FILE_SIZE?: string; + PORT?: string; + HOST?: string; + RATELIMIT_MAX?: string; + RATELIMIT_WINDOW?: string; + BASE_URL?: string; + } +} diff --git a/apps/pd/fixtures/1x1.png b/apps/pd/fixtures/1x1.png new file mode 100644 index 0000000..1914264 Binary files /dev/null and b/apps/pd/fixtures/1x1.png differ diff --git a/apps/pd/fixtures/test.mp4 b/apps/pd/fixtures/test.mp4 new file mode 100644 index 0000000..572f9ce Binary files /dev/null and b/apps/pd/fixtures/test.mp4 differ diff --git a/apps/pd/package-lock.json b/apps/pd/package-lock.json new file mode 100644 index 0000000..a332b7a --- /dev/null +++ b/apps/pd/package-lock.json @@ -0,0 +1,1499 @@ +{ + "name": "@premid/pd", + "version": "1.2.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@premid/pd", + "version": "1.2.4", + "license": "MPL-2.0", + "dependencies": { + "@fastify/cors": "^9.0.1", + "@fastify/multipart": "^8.1.0", + "@fastify/rate-limit": "^9.1.0", + "@keyv/redis": "^2.8.4", + "fastify": "^4.26.0", + "file-type": "^19.0.0", + "got": "^14.2.0", + "ioredis": "^5.3.2", + "ipaddr.js": "^2.1.0", + "keyv": "^4.5.4", + "mime-types": "^2.1.35", + "nanoid": "^5.0.5" + }, + "devDependencies": { + "@types/mime-types": "^2.1.4", + "@types/node": "^24.10.1", + "form-data": "^4.0.0", + "typescript": "^5.9.3" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", + "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "license": "MIT" + }, + "node_modules/@fastify/cors": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-9.0.1.tgz", + "integrity": "sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==", + "license": "MIT", + "dependencies": { + "fastify-plugin": "^4.0.0", + "mnemonist": "0.39.6" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-2.0.2.tgz", + "integrity": "sha512-3wuLdX5iiiYeZWP6bQrjqhrcvBIf0NHbQH1Ur1WbHvoiuTYUEItgygea3zs8aHpiitn0lOB8gX20u1qO+FDm7Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@fastify/multipart": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@fastify/multipart/-/multipart-8.3.1.tgz", + "integrity": "sha512-pncbnG28S6MIskFSVRtzTKE9dK+GrKAJl0NbaQ/CG8ded80okWFsYKzSlP9haaLNQhNRDOoHqmGQNvgbiPVpWQ==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.0.0", + "@fastify/deepmerge": "^2.0.0", + "@fastify/error": "^4.0.0", + "fastify-plugin": "^4.0.0", + "secure-json-parse": "^2.4.0", + "stream-wormhole": "^1.1.0" + } + }, + "node_modules/@fastify/rate-limit": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@fastify/rate-limit/-/rate-limit-9.1.0.tgz", + "integrity": "sha512-h5dZWCkuZXN0PxwqaFQLxeln8/LNwQwH9popywmDCFdKfgpi4b/HoMH1lluy6P+30CG9yzzpSpwTCIPNB9T1JA==", + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "fastify-plugin": "^4.0.0", + "toad-cache": "^3.3.1" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", + "license": "MIT" + }, + "node_modules/@keyv/redis": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-2.8.5.tgz", + "integrity": "sha512-e9W1faN32A1Wy5726qtorAvPu1Xffh75ngfQQtETQ0hIN/FQtK0RcBTz/OH/vwDvLX8zrzdu0sWq/KoSHDYfVw==", + "license": "MIT", + "dependencies": { + "ioredis": "^5.4.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "license": "MIT" + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.1.1.tgz", + "integrity": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", + "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/avvio/node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" + }, + "node_modules/byte-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", + "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "13.0.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.14.tgz", + "integrity": "sha512-2hjaCKFHLKCpzhNLjmOr5ODlbAypwpZqh3c2UusxzxKfQ899y0SvFHQJRYMYbefOYak3njSNBS5PmqCJjrmaBg==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.2.0", + "keyv": "^5.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.1.0", + "responselike": "^4.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacheable-request/node_modules/keyv": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/call-bind-apply-helpers": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", + "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", + "license": "MIT", + "dependencies": { + "mimic-response": "^4.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "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==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" + }, + "node_modules/fastify": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.29.1.tgz", + "integrity": "sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" + }, + "node_modules/fastify/node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-type": { + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", + "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", + "license": "MIT", + "dependencies": { + "get-stream": "^9.0.1", + "strtok3": "^9.0.1", + "token-types": "^6.0.0", + "uint8array-extras": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/find-my-way": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz", + "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "14.6.4", + "resolved": "https://registry.npmjs.org/got/-/got-14.6.4.tgz", + "integrity": "sha512-DjsLab39NUMf5iYlK9asVCkHMhaA2hEhrlmf+qXRhjEivuuBHWYbjmty9DA3OORUwZgENTB+6vSmY2ZW8gFHVw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^7.0.1", + "byte-counter": "^0.1.0", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^13.0.12", + "decompress-response": "^10.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "keyv": "^5.5.3", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^4.0.2", + "type-fest": "^4.26.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/keyv": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ioredis": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", + "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.4.0", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/light-my-request": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", + "integrity": "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==", + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mnemonist": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.6.tgz", + "integrity": "sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/normalize-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/p-cancelable": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/peek-readable": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.4.2.tgz", + "integrity": "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-from-string": { + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", + "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "license": "MIT", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/strtok3": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.1.1.tgz", + "integrity": "sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.3.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/token-types": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", + "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.1.0", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/apps/pd/package.json b/apps/pd/package.json new file mode 100644 index 0000000..f69f737 --- /dev/null +++ b/apps/pd/package.json @@ -0,0 +1,36 @@ +{ + "name": "@premid/pd", + "type": "module", + "version": "1.2.4", + "private": true, + "description": "A small service to shorten image urls to get around Discord's 256 character limit", + "license": "MPL-2.0", + "main": "dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "start": "node --enable-source-maps .", + "dev": "node --watch --enable-source-maps ." + }, + "dependencies": { + "@fastify/cors": "^9.0.1", + "@fastify/multipart": "^8.1.0", + "@fastify/rate-limit": "^9.1.0", + "@keyv/redis": "^2.8.4", + "fastify": "^4.26.0", + "file-type": "^19.0.0", + "got": "^14.2.0", + "ioredis": "^5.3.2", + "ipaddr.js": "^2.1.0", + "keyv": "^4.5.4", + "mime-types": "^2.1.35", + "nanoid": "^5.0.5" + }, + "devDependencies": { + "@types/mime-types": "^2.1.4", + "@types/node": "^24.10.1", + "form-data": "^4.0.0", + "typescript": "^5.9.3" + } +} diff --git a/apps/pd/src/functions/createKeyv.test.ts b/apps/pd/src/functions/createKeyv.test.ts new file mode 100644 index 0000000..c4b82c5 --- /dev/null +++ b/apps/pd/src/functions/createKeyv.test.ts @@ -0,0 +1,9 @@ +import { expect, it } from "vitest"; + +import createKeyv from "./createKeyv.js"; + +it("should return keyv instance", () => { + const keyv = createKeyv(); + + expect(keyv).toStrictEqual(expect.any(Object)); +}); diff --git a/apps/pd/src/functions/createKeyv.ts b/apps/pd/src/functions/createKeyv.ts new file mode 100644 index 0000000..ad43232 --- /dev/null +++ b/apps/pd/src/functions/createKeyv.ts @@ -0,0 +1,28 @@ +import process from "node:process"; +import KeyvRedis from "@keyv/redis"; +import Keyv from "keyv"; + +import redis from "../redis.js"; + +export default function createKeyv() { + let options: Keyv.Options | undefined; + + /* c8 ignore next 8 */ + if (process.env.REDIS_SENTINELS) { + options = { + namespace: "pd", + store: new KeyvRedis(redis), + }; + } + + const keyv = new Keyv( + options, + ); + + /* c8 ignore next 3 */ + keyv.on("error", (error) => { + console.error("Keyv connection error:", error); + }); + + return keyv; +} diff --git a/apps/pd/src/functions/createRedis.ts b/apps/pd/src/functions/createRedis.ts new file mode 100644 index 0000000..6dd8647 --- /dev/null +++ b/apps/pd/src/functions/createRedis.ts @@ -0,0 +1,30 @@ +/* eslint-disable no-console */ +import { hostname } from "node:os"; + +import process from "node:process"; +import { Redis } from "ioredis"; + +/* c8 ignore start */ +export default function createRedis(): Redis { + const redis = new Redis({ + connectionName: `pd-${hostname()}-${process.pid.toString()}`, + lazyConnect: true, + name: "mymaster", + sentinels: process.env.REDIS_SENTINELS?.split(",").map(s => ({ + host: s, + port: 26_379, + })), + }); + + /* c8 ignore next 3 */ + redis.on("error", (error) => { + console.error("Redis error", error); + }); + + /* c8 ignore next 3 */ + redis.on("connect", () => { + console.log("Redis connected"); + }); + + return redis; +} diff --git a/apps/pd/src/functions/createServer.test.ts b/apps/pd/src/functions/createServer.test.ts new file mode 100644 index 0000000..9cfa047 --- /dev/null +++ b/apps/pd/src/functions/createServer.test.ts @@ -0,0 +1,10 @@ +import { describe, expect, it } from "vitest"; + +import { createServer } from "../functions/createServer.js"; + +describe("createServer", () => { + it("should return a fastify instance", async () => { + const server = await createServer(); + expect(server).toBeDefined(); + }); +}); diff --git a/apps/pd/src/functions/createServer.ts b/apps/pd/src/functions/createServer.ts new file mode 100644 index 0000000..b4ec367 --- /dev/null +++ b/apps/pd/src/functions/createServer.ts @@ -0,0 +1,62 @@ +import process from "node:process"; +import cors from "@fastify/cors"; +import fastifyMultipart from "@fastify/multipart"; +import ratelimit from "@fastify/rate-limit"; +import fastify from "fastify"; +import type { Redis } from "ioredis"; + +import createFromBase64 from "../routes/createFromBase64.js"; +import createFromImage from "../routes/createFromImage.js"; +import createShortenedLink from "../routes/createShortenedLink.js"; +import getFullLink from "../routes/getFullLink.js"; + +export async function createServer(redis?: Redis) { + const server = fastify({ + trustProxy: true, + }); + + await server.register(cors, { + methods: ["GET"], + origin: "*", + }); + + await server.register(ratelimit, { + max: Number.parseInt(process.env.RATELIMIT_MAX ?? "25"), + nameSpace: "pd-ratelimit-", + redis, + timeWindow: process.env.RATELIMIT_WINDOW ?? "1 minute", + }); + + await server.register(fastifyMultipart, { + limits: { + fileSize: Number.parseInt(process.env.MAX_FILE_SIZE ?? (5 * 1024 * 1024).toString()), + files: 1, + }, + }); + + server.post("/create/image", createFromImage); + server.post("/create/base64", createFromBase64); + server.get("/create/*", createShortenedLink); + + server.get( + "/*", + { + config: { + rateLimit: false, + }, + }, + getFullLink, + ); + + server.get( + "/health", + { + config: { + rateLimit: false, + }, + }, + (_, reply) => reply.status(204).send(), + ); + + return server; +} diff --git a/apps/pd/src/functions/getGoogleAddresses.test.ts b/apps/pd/src/functions/getGoogleAddresses.test.ts new file mode 100644 index 0000000..b959327 --- /dev/null +++ b/apps/pd/src/functions/getGoogleAddresses.test.ts @@ -0,0 +1,30 @@ +import got from "got"; +import { describe, expect, it, vi } from "vitest"; + +describe.concurrent("getGoogleAddresses", () => { + it("should return an array of CIDR objects", async () => { + const { default: getGoogleAddresses } = await import("./getGoogleAddresses.js"); + + vi.spyOn(got, "get").mockResolvedValue({ + body: JSON.stringify({ + prefixes: [ + { ipv4Prefix: "0.0.0.0" }, + { ipv6Prefix: "0000:0000:0000::/16" }, + ], + }), + }); + + const result = await getGoogleAddresses(); + + expect(result).toMatchInlineSnapshot(` + [ + { + "ipv4Prefix": "0.0.0.0", + }, + { + "ipv6Prefix": "0000:0000:0000::/16", + }, + ] + `); + }); +}); diff --git a/apps/pd/src/functions/getGoogleAddresses.ts b/apps/pd/src/functions/getGoogleAddresses.ts new file mode 100644 index 0000000..182f689 --- /dev/null +++ b/apps/pd/src/functions/getGoogleAddresses.ts @@ -0,0 +1,24 @@ +import got from "got"; + +import type { CIDR } from "./isInCidRange.js"; + +export default async function getGoogleAddresses(): Promise { + const { body } = await got.get("https://www.gstatic.com/ipranges/cloud.json"); + const result = JSON.parse(body) as GoogleResult; + return result.prefixes.map(({ ipv4Prefix, ipv6Prefix }) => { + return ipv6Prefix ? { ipv6Prefix } : { ipv4Prefix }; + }); +} + +interface GoogleResult { + syncToken: string; + creationTime: string; + prefixes: GoogleIP[]; +} + +interface GoogleIP { + ipv6Prefix: string; + ipv4Prefix: string; + service: string; + scope: string; +} diff --git a/apps/pd/src/functions/isInCidRange.test.ts b/apps/pd/src/functions/isInCidRange.test.ts new file mode 100644 index 0000000..0a5a68b --- /dev/null +++ b/apps/pd/src/functions/isInCidRange.test.ts @@ -0,0 +1,31 @@ +import { expect, it } from "vitest"; + +import isInCIDRRange from "./isInCidRange.js"; + +it("isInCIDRRange - IPv4 - in range", () => { + const CIDRs = [{ ipv4Prefix: "192.0.2.0/24" }]; + const ip = "192.0.2.123"; + const result = isInCIDRRange(CIDRs, ip); + expect(result).toBe(true); +}); + +it("isInCIDRRange - IPv4 - not in range", () => { + const CIDRs = [{ ipv4Prefix: "192.0.2.0/24" }]; + const ip = "192.0.3.123"; + const result = isInCIDRRange(CIDRs, ip); + expect(result).toBe(false); +}); + +it("isInCIDRRange - IPv6 - in range", () => { + const CIDRs = [{ ipv6Prefix: "2001:db8::/32" }]; + const ip = "2001:db8::1234"; + const result = isInCIDRRange(CIDRs, ip); + expect(result).toBe(true); +}); + +it("isInCIDRRange - IPv6 - not in range", () => { + const CIDRs = [{ ipv6Prefix: "2001:db8::/32" }]; + const ip = "2001:db9::1234"; + const result = isInCIDRRange(CIDRs, ip); + expect(result).toBe(false); +}); diff --git a/apps/pd/src/functions/isInCidRange.ts b/apps/pd/src/functions/isInCidRange.ts new file mode 100644 index 0000000..553bc49 --- /dev/null +++ b/apps/pd/src/functions/isInCidRange.ts @@ -0,0 +1,29 @@ +import ipaddr from "ipaddr.js"; + +export default function isInCIDRRange(CIDRs: CIDR, ip: string) { + const parsed = ipaddr.parse(ip); + + for (const CIDR of CIDRs.filter((c) => { + if (parsed.kind() === "ipv4" && "ipv4Prefix" in c) + return true; + else if (parsed.kind() === "ipv6" && "ipv6Prefix" in c) + return true; + else return false; + })) { + const check = parsed.match(ipaddr.parseCIDR("ipv4Prefix" in CIDR ? CIDR.ipv4Prefix : CIDR.ipv6Prefix)); + + if (check) + return check; + } + + return false; +} + +export type CIDR = ( + | { + ipv4Prefix: string; + } + | { + ipv6Prefix: string; + } +)[]; diff --git a/apps/pd/src/googleCIDRs.ts b/apps/pd/src/googleCIDRs.ts new file mode 100644 index 0000000..68984ab --- /dev/null +++ b/apps/pd/src/googleCIDRs.ts @@ -0,0 +1,3 @@ +import getGoogleAddresses from "./functions/getGoogleAddresses.js"; + +export default await getGoogleAddresses(); diff --git a/apps/pd/src/index.test.ts b/apps/pd/src/index.test.ts new file mode 100644 index 0000000..f94a591 --- /dev/null +++ b/apps/pd/src/index.test.ts @@ -0,0 +1,14 @@ +import { expect, it } from "vitest"; + +import { createServer } from "./functions/createServer.js"; + +it("/health", async () => { + const server = await createServer(); + const result = await server.inject({ + method: "GET", + url: "/health", + }); + + expect(result.statusCode).toBe(204); + expect(result.body).toBe(""); +}); diff --git a/apps/pd/src/index.ts b/apps/pd/src/index.ts new file mode 100644 index 0000000..54f156d --- /dev/null +++ b/apps/pd/src/index.ts @@ -0,0 +1,20 @@ +/* eslint-disable no-console */ +/* c8 ignore start */ +import process from "node:process"; +import { createServer } from "./functions/createServer.js"; +import redis from "./redis.js"; + +if (!process.env.REDIS_SENTINELS) + console.log("WARNING: No REDIS_SENTINELS environment variable set"); +if (process.env.NODE_ENV === "production" && !process.env.BASE_URL) + throw new Error("BASE_URL environment variable is required in production"); + +export const server = await createServer(redis); + +const url = await server.listen({ + host: process.env.HOST ?? "0.0.0.0", + port: Number.parseInt(process.env.PORT ?? "80"), +}); + +console.log(`Server listening at ${url}`); +// TODO Make proper error codes & json responses diff --git a/apps/pd/src/keyv.ts b/apps/pd/src/keyv.ts new file mode 100644 index 0000000..2312d9a --- /dev/null +++ b/apps/pd/src/keyv.ts @@ -0,0 +1,5 @@ +import createKeyv from "./functions/createKeyv.js"; + +export const keyv = createKeyv(); + +export const ttl = 30 * 60 * 1000; diff --git a/apps/pd/src/redis.ts b/apps/pd/src/redis.ts new file mode 100644 index 0000000..47b0f15 --- /dev/null +++ b/apps/pd/src/redis.ts @@ -0,0 +1,3 @@ +import createRedis from "./functions/createRedis.js"; + +export default createRedis(); diff --git a/apps/pd/src/routes/createFromBase64.test.ts b/apps/pd/src/routes/createFromBase64.test.ts new file mode 100644 index 0000000..938de76 --- /dev/null +++ b/apps/pd/src/routes/createFromBase64.test.ts @@ -0,0 +1,94 @@ +import { describe, it } from "vitest"; + +import { createServer } from "../functions/createServer.js"; + +describe.concurrent("createFromBase64", async () => { + const server = await createServer(); + + it("should return a 400 when the body is not present", async ({ expect }) => { + const result = await server.inject({ + method: "POST", + url: "/create/base64", + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid body\""); + }); + + it("should return a 400 when the body is not a string", async ({ expect }) => { + const result = await server.inject({ + method: "POST", + payload: new Blob([]), + url: "/create/base64", + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid body\""); + }); + + it("should return a 400 when the body is not a valid base64 string", async ({ expect }) => { + const result = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: "data:image/png;base64t", + url: "/create/base64", + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid base64 string\""); + }); + + it("should return a 400 when the base64 string is not a valid image", async ({ expect }) => { + const result = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: "data:image/sv;base64,a", + url: "/create/base64", + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid base64 string\""); + + const result2 = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: "data:image/svg+xml;base64,s", + url: "/create/base64", + }); + + expect(result2.statusCode).toBe(400); + expect(result2.body).toMatchInlineSnapshot("\"Supported types: png, jpeg, jpg, gif, webp\""); + }); + + it("should return a 200 when the base64 string is valid", async ({ expect }) => { + const result = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: "data:image/png;base64,s", + url: "/create/base64", + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + + const result2 = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: "data:image/png;base64,s", + url: "/create/base64", + }); + + expect(result2.statusCode).toBe(200); + expect(result2.body).toStrictEqual(expect.any(String)); + }); +}); diff --git a/apps/pd/src/routes/createFromBase64.ts b/apps/pd/src/routes/createFromBase64.ts new file mode 100644 index 0000000..266ae30 --- /dev/null +++ b/apps/pd/src/routes/createFromBase64.ts @@ -0,0 +1,47 @@ +import crypto from "node:crypto"; + +import process from "node:process"; +import mime from "mime-types"; +import { nanoid } from "nanoid"; +import type { RouteHandlerMethod } from "fastify"; + +import { keyv, ttl } from "../keyv.js"; + +const handler: RouteHandlerMethod = async (request, reply) => { + const { body } = request; + + if (!body) + return reply.status(400).send("Invalid body"); + + if (typeof body !== "string") + return reply.status(400).send("Invalid body"); + + const matches = body.match(/^data:(.+);base64,(.+)/); + + if (!matches || matches.length === 0) + return reply.status(400).send("Invalid base64 string"); + + const type = mime.extension(matches.at(1)!); + + if (!type) + return reply.status(400).send("Invalid base64 string"); + + if (!["png", "jpeg", "jpg", "gif", "webp"].includes(type)) + return reply.status(400).send("Supported types: png, jpeg, jpg, gif, webp"); + + const hash = crypto.createHash("sha256").update(body).digest("hex"); + const existingUrl = await keyv.get(hash); + + if (existingUrl) { + return reply.send(process.env.BASE_URL! + existingUrl); + } + + const uniqueId = `${nanoid(10)}.${type}`; + + await keyv.set(hash, uniqueId, ttl); + await keyv.set(uniqueId, body, ttl); + + return reply.send(process.env.BASE_URL! + uniqueId); +}; + +export default handler; diff --git a/apps/pd/src/routes/createFromImage.test.ts b/apps/pd/src/routes/createFromImage.test.ts new file mode 100644 index 0000000..c111e7f --- /dev/null +++ b/apps/pd/src/routes/createFromImage.test.ts @@ -0,0 +1,106 @@ +import { Buffer } from "node:buffer"; +import { readFile } from "node:fs/promises"; + +import type { RequestOptions } from "node:http"; +import type { AddressInfo } from "node:net"; +import { afterAll, beforeAll, describe, it } from "vitest"; + +import { createServer } from "../functions/createServer.js"; + +describe.concurrent("createFromImage", async () => { + const server = await createServer(); + const form = new FormData(); + const defaultRequestOptions: RequestOptions = { + hostname: "localhost", + method: "POST", + path: "/create/image", + protocol: "http:", + }; + + let url: string; + + beforeAll(async () => { + url = await server.listen(); + defaultRequestOptions.port = (server.server.address() as AddressInfo).port; + }); + + afterAll(() => { + void server.close(); + }); + + it("should return a 400 when request is not multipart", async ({ expect }) => { + const result = await fetch(`${url}/create/image`, { + method: "POST", + }); + + expect(result.status).toBe(400); + expect(await result.text()).toMatchInlineSnapshot("\"Request is not multipart\""); + }); + + it("should return a 400 status code when no file is provided", async ({ expect }) => { + const result = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result.status).toBe(400); + expect(await result.text()).toMatchInlineSnapshot("\"Invalid file\""); + }); + it("should return a 400 status code when the file is invalid", async ({ expect }) => { + form.set("file", Buffer.alloc(1024 * 1024 * 2)); + + const result = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result.status).toBe(400); + expect(await result.text()).toMatchInlineSnapshot("\"Invalid file\""); + + form.set("file", new Blob([new Uint8Array(1024 * 1024 * 2)])); + + const result2 = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result2.status).toBe(400); + expect(await result2.text()).toMatchInlineSnapshot("\"Invalid file\""); + }); + + it("should return a 400 status code when the file is not an image", async ({ expect }) => { + form.set("file", new Blob([await readFile(new URL("../../fixtures/test.mp4", import.meta.url))])); + + const result = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result.status).toBe(400); + expect(await result.text()).toMatchInlineSnapshot("\"Only png, jpeg, jpg, gif and webp are supported\""); + }); + + it("should return a 200 status code when the file is valid", async ({ expect }) => { + form.set("file", new Blob([await readFile(new URL("../../fixtures/1x1.png", import.meta.url))])); + + const result = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result.status).toBe(200); + expect(await result.text()).toStrictEqual(expect.any(String)); + }); + + it("should return a 200 status code when the file is valid and the same file is uploaded again", async ({ expect }) => { + form.set("file", new Blob([await readFile(new URL("../../fixtures/1x1.png", import.meta.url))])); + + const result = await fetch(`${url}/create/image`, { + body: form, + method: "POST", + }); + + expect(result.status).toBe(200); + expect(await result.text()).toStrictEqual(expect.any(String)); + }); +}); diff --git a/apps/pd/src/routes/createFromImage.ts b/apps/pd/src/routes/createFromImage.ts new file mode 100644 index 0000000..68daf5e --- /dev/null +++ b/apps/pd/src/routes/createFromImage.ts @@ -0,0 +1,53 @@ +import crypto from "node:crypto"; + +import process from "node:process"; +import { fileTypeFromBuffer } from "file-type"; +import { nanoid } from "nanoid"; +import type { RouteHandlerMethod } from "fastify"; + +import { keyv, ttl } from "../keyv.js"; + +const handler: RouteHandlerMethod = async (request, reply) => { + if (!request.isMultipart()) + return reply.status(400).send("Request is not multipart"); + + const file = await request.file(); + + if (!file) + return reply.status(400).send("Invalid file"); + + const type = await fileTypeFromBuffer(await file.toBuffer()); + + if (!type) + return reply.status(400).send("Invalid file"); + + if (![ + "image/png", + "image/jpeg", + "image/jpg", + "image/gif", + "image/webp", + ].includes(type.mime)) { + return reply.status(400).send("Only png, jpeg, jpg, gif and webp are supported"); + } + + const buffer = await file.toBuffer(); + const body = `data:${type.mime};base64,${buffer.toString("base64")}`; + const hash = crypto.createHash("sha256").update(body).digest("hex"); + const existingUrl = await keyv.get(hash); + + if (existingUrl) { + return reply.send(process.env.BASE_URL! + existingUrl); + } + + const uniqueId = `${nanoid(10)}.${type.ext}`; + + await Promise.all([ + keyv.set(hash, uniqueId, ttl), + keyv.set(uniqueId, body, ttl), + ]); + + return reply.send(process.env.BASE_URL! + uniqueId); +}; + +export default handler; diff --git a/apps/pd/src/routes/createShortenedLink.test.ts b/apps/pd/src/routes/createShortenedLink.test.ts new file mode 100644 index 0000000..1a02a33 --- /dev/null +++ b/apps/pd/src/routes/createShortenedLink.test.ts @@ -0,0 +1,152 @@ +import { describe, expect, it } from "vitest"; + +import { createServer } from "../functions/createServer.js"; + +describe.concurrent("/create", async () => { + const server = await createServer(); + + it("should return a 400 status code when no URL is provided", async () => { + const result = await server.inject({ + method: "GET", + url: "/create/", + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid URL\""); + }); + + it("should return a 400 status code when the URL is too short", async () => { + const result = await server.inject({ + method: "GET", + url: "/create/https://www.google.com", + }); + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"URL is too short\""); + }); + + it("should return a 400 status code when the URL is invalid", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/file://www.googl${"e".repeat(256)}`, + }); + + expect(result.statusCode).toBe(400); + expect(result.body).toMatchInlineSnapshot("\"Invalid URL\""); + }); + + it("should return a 200 status code when the URL is valid", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.googl${"e".repeat(256)}.com`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + }); + + it("should return a 200 status code when the URL is valid and already exists", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.googl${"d".repeat(256)}.com`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + const { body } = result; + const result2 = await server.inject({ + method: "GET", + url: `/create/https://www.googl${"d".repeat(256)}.com`, + }); + + expect(result2.statusCode).toBe(200); + expect(result2.body).toStrictEqual(body); + }); + + it("should preserve file extension when URL has a valid image extension", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/image.png`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.png$/); + }); + + it("should preserve file extension when URL has .jpg extension", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/photo.jpg`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.jpg$/); + }); + + it("should preserve file extension when URL has .webp extension", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/image.webp`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.webp$/); + }); + + it("should preserve file extension when URL has .png with query parameters", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/image.png?ref=example`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.png$/); + }); + + it("should preserve file extension when URL has .gif with complex query parameters", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/animated.gif?size=large&quality=high`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.gif$/); + }); + + it("should not preserve file extension when URL has invalid extension", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/document.pdf`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).not.toMatch(/\.pdf$/); + }); + + it("should work normally when URL has no file extension", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/page`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).not.toMatch(/\.\w+$/); + }); + + it("should handle case-insensitive extensions", async () => { + const result = await server.inject({ + method: "GET", + url: `/create/https://www.exampl${"e".repeat(256)}.com/image.PNG`, + }); + + expect(result.statusCode).toBe(200); + expect(result.body).toStrictEqual(expect.any(String)); + expect(result.body).toMatch(/\.png$/); //* Should be lowercase in result + }); +}); diff --git a/apps/pd/src/routes/createShortenedLink.ts b/apps/pd/src/routes/createShortenedLink.ts new file mode 100644 index 0000000..67d58b2 --- /dev/null +++ b/apps/pd/src/routes/createShortenedLink.ts @@ -0,0 +1,47 @@ +import crypto from "node:crypto"; + +import process from "node:process"; +import { nanoid } from "nanoid"; +import type { RouteHandlerMethod } from "fastify"; + +import { keyv, ttl } from "../keyv.js"; + +const handler: RouteHandlerMethod = async (request, reply) => { + const url = request.url.replace("/create/", "").trim(); + + if (url.length === 0) + return reply.status(400).send("Invalid URL"); + + if (url.length < 256) + return reply.status(400).send("URL is too short"); + + const urlObject = new URL(url); + if (!["http:", "https:"].includes(urlObject.protocol)) + return reply.status(400).send("Invalid URL"); + + //* Extract file extension from URL pathname + const pathname = urlObject.pathname; + const extensionMatch = pathname.match(/\.([^./]+)$/); + const extension = extensionMatch?.[1]?.toLowerCase() ?? null; + + //* Check if extension is in allowed list + const allowedExtensions = ["png", "jpeg", "jpg", "gif", "webp"]; + const hasValidExtension = extension && allowedExtensions.includes(extension); + + const hash = crypto.createHash("sha256").update(url).digest("hex"); + const existingShortenedUrl = await keyv.get(hash); + + if (existingShortenedUrl) { + await Promise.all([keyv.set(hash, existingShortenedUrl, ttl), keyv.set(existingShortenedUrl, url, ttl)]); + return reply.send(process.env.BASE_URL! + existingShortenedUrl); + } + + //* Create unique ID with extension if valid, otherwise without extension + const uniqueId = hasValidExtension ? `${nanoid(10)}.${extension}` : nanoid(10); + + await Promise.all([keyv.set(hash, uniqueId, ttl), keyv.set(uniqueId, url, ttl)]); + + return reply.send(process.env.BASE_URL! + uniqueId); +}; + +export default handler; diff --git a/apps/pd/src/routes/getFullLink.test.ts b/apps/pd/src/routes/getFullLink.test.ts new file mode 100644 index 0000000..9f646a0 --- /dev/null +++ b/apps/pd/src/routes/getFullLink.test.ts @@ -0,0 +1,128 @@ +import { Buffer } from "node:buffer"; + +import { readFile } from "node:fs/promises"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; + +import { createServer } from "../functions/createServer.js"; +import * as isInCIDRRange from "../functions/isInCidRange.js"; + +describe("getFullLink", async () => { + const server = await createServer(); + let url: string; + + beforeAll(async () => { + url = await server.listen(); + }); + + afterAll(async () => { + await server.close(); + }); + + it("should fail if not a Google Cloud IP", async () => { + const result = await server.inject({ + headers: { + "cf-connecting-ip": "", + }, + url: "/1234567890", + }); + + expect(result.statusCode).toBe(401); + }); + + it("should fail if not a valid ID", async () => { + vi.spyOn(isInCIDRRange, "default").mockReturnValueOnce(true); + + const result = await server.inject({ + headers: { + "cf-connecting-ip": "", + }, + url: "/123", + }); + + vi.spyOn(isInCIDRRange, "default").mockReturnValueOnce(true); + const result2 = await server.inject({ + headers: { + "cf-connecting-ip": "", + }, + url: "/1234567890.", + }); + + expect(result.statusCode).toBe(404); + expect(result2.statusCode).toBe(404); + }); + + it("should redirect to the correct URL", async () => { + vi.spyOn(isInCIDRRange, "default").mockReturnValueOnce(true); + + const { body } = await server.inject({ + url: `/create/https://${"a".repeat(256)}`, + }); + + expect(body).toStrictEqual(expect.any(String)); + + const result = await server.inject({ + headers: { + "cf-connecting-ip": "", + }, + url: body, + }); + + expect(result.statusCode).toBe(302); + expect(result.headers.location).toBe(`https://${"a".repeat(256)}`); + }); + + it("should return the correct image", async () => { + const imageBuffer = await readFile(new URL("../../fixtures/test.mp4", import.meta.url)); + const imageBase64 = `data:image/png;base64,${imageBuffer.toString("base64")}`; + + const { body } = await server.inject({ + headers: { + "Content-Type": "text/plain", + }, + method: "POST", + payload: imageBase64, + url: "/create/base64", + }); + + expect(body).toStrictEqual(expect.any(String)); + + vi.spyOn(isInCIDRRange, "default").mockReturnValueOnce(true); + + const result = await fetch(`${url}${body}`, { + headers: { + "cf-connecting-ip": "", + }, + }); + + expect(result.status).toBe(200); + expect(result.headers.get("content-type")).toBe("image/png"); + expect(Buffer.from(await result.arrayBuffer())).toStrictEqual(imageBuffer); + }); + + it("should fetch and return PNG image instead of redirecting for URLs with .png extension", async () => { + const testUrl = `https://cdn.rcd.gg/PreMiD/resources/reading.png?v=${"a".repeat(250)}`; + + const { body } = await server.inject({ + url: `/create/${testUrl}`, + }); + + expect(body).toStrictEqual(expect.any(String)); + + vi.spyOn(isInCIDRRange, "default").mockReturnValueOnce(true); + + const result = await fetch(`${url}${body}`, { + headers: { + "cf-connecting-ip": "", + }, + }); + + expect(result.status).toBe(200); + expect(result.headers.get("content-type")).toMatch(/^image\//); + //* Should return image data, not redirect + expect(result.headers.get("location")).toBeNull(); + + //* Verify we got actual image data + const imageBuffer = await result.arrayBuffer(); + expect(imageBuffer.byteLength).toBeGreaterThan(0); + }); +}); diff --git a/apps/pd/src/routes/getFullLink.ts b/apps/pd/src/routes/getFullLink.ts new file mode 100644 index 0000000..b9536e4 --- /dev/null +++ b/apps/pd/src/routes/getFullLink.ts @@ -0,0 +1,93 @@ +import { Buffer } from "node:buffer"; + +import crypto from "node:crypto"; +import type { RouteHandlerMethod } from "fastify"; + +import isInCIDRRange from "../functions/isInCidRange.js"; +import googleCIDRs from "../googleCIDRs.js"; +import { keyv, ttl } from "../keyv.js"; + +const handler: RouteHandlerMethod = async (request, reply) => { + /* c8 ignore next 2 */ + const ip = request.headers["cf-connecting-ip"]?.toString() || request.socket.remoteAddress || request.ip; + + if ( + !isInCIDRRange( + googleCIDRs, + ip, + ) + ) { + return reply.status(401).send("Not a Google Cloud IP"); + } + + const id = (request.params as { "*": string })["*"].trim(); + + if (id.split(".")[0]?.length !== 10) + return reply.code(404).send("Invalid ID"); + + const url = await keyv.get(id); + if (!url) + return reply.code(404).send("Unknown ID"); + + const hash = crypto.createHash("sha256").update(url).digest("hex"); + + await Promise.all([keyv.set(hash, id, ttl), keyv.set(id, url, ttl)]); + + //* If it is a base64 string, decode and return the image + if (url.startsWith("data:image")) { + const image = Buffer.from( + url.replace(/^data:image\/\w+;base64,/, ""), + "base64", + ); + + const mime = url.split(";")[0]!.split(":")[1]!; + + return reply.type(mime).send(image); + } + + //* Check if URL has a valid image extension + const urlObject = new URL(url); + const pathname = urlObject.pathname; + const extensionMatch = pathname.match(/\.([^./]+)$/); + const extension = extensionMatch?.[1]?.toLowerCase() ?? null; + + const allowedExtensions = ["png", "jpeg", "jpg", "gif", "webp"]; + const hasValidImageExtension = extension && allowedExtensions.includes(extension); + + //* If URL has valid image extension, fetch and return the image + if (hasValidImageExtension) { + try { + const response = await fetch(url, { + headers: { + "Accept": "image/*", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Accept-Encoding": "gzip, deflate, br", + "Cache-Control": "no-cache", + "Pragma": "no-cache", + "Referer": urlObject.origin, //* Set referer to the origin domain to bypass hotlink protection + "Sec-Fetch-Dest": "image", + "Sec-Fetch-Mode": "no-cors", + "Sec-Fetch-Site": "cross-site", + }, + }); + + if (!response.ok) { + return reply.code(404).send("Image not found"); + } + + const contentType = response.headers.get("content-type") || `image/${extension}`; + const imageBuffer = Buffer.from(await response.arrayBuffer()); + + return reply.type(contentType).send(imageBuffer); + } + catch { + //* If fetch fails, fall back to redirect + return reply.redirect(url); + } + } + + //* For all other URLs, redirect to them + return reply.redirect(url); +}; + +export default handler; diff --git a/apps/pd/tsconfig.app.json b/apps/pd/tsconfig.app.json new file mode 100644 index 0000000..dd0b7bb --- /dev/null +++ b/apps/pd/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"], + "exclude": ["**/*.test.ts", "dist"] +} diff --git a/apps/pd/tsconfig.json b/apps/pd/tsconfig.json new file mode 100644 index 0000000..c0fe036 --- /dev/null +++ b/apps/pd/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "types": ["@types/node"], + "noEmit": true + }, + "include": ["environment.d.ts", "src"], + "exclude": ["**/*.test.ts"] +} diff --git a/apps/schema-server/.eslintrc.yaml b/apps/schema-server/.eslintrc.yaml new file mode 100644 index 0000000..d68c539 --- /dev/null +++ b/apps/schema-server/.eslintrc.yaml @@ -0,0 +1,2 @@ +rules: + no-console: off diff --git a/apps/schema-server/Readme.md b/apps/schema-server/Readme.md new file mode 100644 index 0000000..d09ad2c --- /dev/null +++ b/apps/schema-server/Readme.md @@ -0,0 +1,3 @@ +# @premid/schema-server + +This is a simple schema server which serves JSON schemas for Presence Developers. diff --git a/apps/schema-server/environment.d.ts b/apps/schema-server/environment.d.ts new file mode 100644 index 0000000..19e1d62 --- /dev/null +++ b/apps/schema-server/environment.d.ts @@ -0,0 +1,7 @@ +declare namespace NodeJS { + export interface ProcessEnv { + NODE_ENV?: "development" | "production" | "test"; + PORT?: string; + HOST?: string; + } +} diff --git a/apps/schema-server/package-lock.json b/apps/schema-server/package-lock.json new file mode 100644 index 0000000..8ed75e6 --- /dev/null +++ b/apps/schema-server/package-lock.json @@ -0,0 +1,859 @@ +{ + "name": "@premid/schema-server", + "version": "1.0.10", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@premid/schema-server", + "version": "1.0.10", + "license": "MPL-2.0", + "dependencies": { + "@fastify/helmet": "^11.1.1", + "fastify": "^4.26.0", + "globby": "^14.0.1" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "typescript": "^5.9.3" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/helmet": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@fastify/helmet/-/helmet-11.1.1.tgz", + "integrity": "sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==", + "license": "MIT", + "dependencies": { + "fastify-plugin": "^4.2.1", + "helmet": "^7.0.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" + }, + "node_modules/fastify": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.29.1.tgz", + "integrity": "sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz", + "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/helmet": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", + "integrity": "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==", + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/require-from-string": { + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "license": "MIT", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/apps/schema-server/package.json b/apps/schema-server/package.json new file mode 100644 index 0000000..0789fca --- /dev/null +++ b/apps/schema-server/package.json @@ -0,0 +1,26 @@ +{ + "name": "@premid/schema-server", + "type": "module", + "version": "1.0.10", + "private": true, + "description": "A small service to serve the JSON schemas for PreMiD", + "license": "MPL-2.0", + "main": "dist/index.js", + "files": [ + "dist", + "schemas" + ], + "scripts": { + "start": "node --enable-source-maps .", + "dev": "node --watch --enable-source-maps ." + }, + "dependencies": { + "@fastify/helmet": "^11.1.1", + "fastify": "^4.26.0", + "globby": "^14.0.1" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "typescript": "^5.9.3" + } +} diff --git a/apps/schema-server/schemas/metadata/1.0.json b/apps/schema-server/schemas/metadata/1.0.json new file mode 100644 index 0000000..273d710 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.0.json @@ -0,0 +1,241 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.0", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?:\\/\\/?([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+\\/.*$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bs] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.1.json b/apps/schema-server/schemas/metadata/1.1.json new file mode 100644 index 0000000..3896363 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.1.json @@ -0,0 +1,252 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.0", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?:\\/\\/?([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+\\/.*$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bs] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.10.json b/apps/schema-server/schemas/metadata/1.10.json new file mode 100644 index 0000000..f57205f --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.10.json @@ -0,0 +1,277 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.10", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "matches": { + "type": "array", + "description": "A glob pattern required to match Google's match pattern (https://developer.chrome.com/docs/extensions/develop/concepts/match-patterns). This is required for Presences.", + "items": { + "type": "string", + "description": "A glob pattern.", + "pattern": "^(https|http|[*])://.*/.*" + } + }, + + "iFrameMatches": { + "type": "array", + "description": "A glob pattern required to match Google's match pattern (https://developer.chrome.com/docs/extensions/develop/concepts/match-patterns). This is required for Presences.", + "items": { + "type": "string", + "description": "A glob pattern.", + "pattern": "^(https|http|[*])://.*/.*" + } + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.11.json b/apps/schema-server/schemas/metadata/1.11.json new file mode 100644 index 0000000..ad608da --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.11.json @@ -0,0 +1,260 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.11", + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + "definitions": { + "user": { + "type": "object", + "description": "User information.", + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + "additionalProperties": false, + "required": [ + "name", + "id" + ] + } + }, + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + "type": "string", + "description": "The metadata schema URL." + }, + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + "items": { + "$ref": "#/definitions/user" + } + }, + "service": { + "type": "string", + "description": "The service this presence is for." + }, + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + "additionalProperties": false, + "required": [ + "en" + ] + }, + "url": { + "type": [ + "string", + "array" + ], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "apiVersion": { + "type": "integer", + "description": "The Presence System version this Presence supports.", + "minimum": 1, + "maximum": 2 + }, + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + "tags": { + "type": [ + "array" + ], + "description": "The tags for the presence.", + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": [ + "anime", + "games", + "music", + "socials", + "videos", + "other" + ] + }, + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + "items": { + "type": "object", + "description": "A setting.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + "patternProperties": { + "": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "additionalProperties": false + }, + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The default value of the setting. Not compatible with `values`." + }, + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + "items": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "multiLanguage": { + "type": [ + "string", + "boolean", + "array" + ], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "required": [ + "author", + "service", + "description", + "url", + "version", + "apiVersion", + "logo", + "thumbnail", + "color", + "tags", + "category" + ] +} diff --git a/apps/schema-server/schemas/metadata/1.12.json b/apps/schema-server/schemas/metadata/1.12.json new file mode 100644 index 0000000..1f1961f --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.12.json @@ -0,0 +1,252 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.12", + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + "definitions": { + "user": { + "type": "object", + "description": "User information.", + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + "additionalProperties": false, + "required": [ + "name", + "id" + ] + } + }, + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + "type": "string", + "description": "The metadata schema URL." + }, + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + "items": { + "$ref": "#/definitions/user" + } + }, + "service": { + "type": "string", + "description": "The service this presence is for." + }, + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + "additionalProperties": false, + "required": [ + "en" + ] + }, + "url": { + "type": [ + "string", + "array" + ], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "apiVersion": { + "type": "integer", + "description": "The Presence System version this Presence supports.", + "minimum": 1, + "maximum": 2 + }, + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + "tags": { + "type": [ + "array" + ], + "description": "The tags for the presence.", + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": [ + "anime", + "games", + "music", + "socials", + "videos", + "other" + ] + }, + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + "items": { + "type": "object", + "description": "A setting.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + "patternProperties": { + "": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "additionalProperties": false + }, + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The default value of the setting. Not compatible with `values`." + }, + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + "items": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "multiLanguage": { + "type": "boolean", + "description": "When true, strings from the `general.json` file are available for use, plus the .json file. False is not allowed." + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false, + "required": [ + "author", + "service", + "description", + "url", + "version", + "apiVersion", + "logo", + "thumbnail", + "color", + "tags", + "category" + ] +} diff --git a/apps/schema-server/schemas/metadata/1.13.json b/apps/schema-server/schemas/metadata/1.13.json new file mode 100644 index 0000000..50e65b2 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.13.json @@ -0,0 +1,248 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.13", + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a activity.", + "definitions": { + "user": { + "type": "object", + "description": "User information.", + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + "additionalProperties": false, + "required": [ + "name", + "id" + ] + } + }, + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + "type": "string", + "description": "The metadata schema URL." + }, + "author": { + "$ref": "#/definitions/user", + "description": "The author of this activity." + }, + "contributors": { + "type": "array", + "description": "Any extra contributors to this activity.", + "items": { + "$ref": "#/definitions/user" + } + }, + "service": { + "type": "string", + "description": "The service this activity is for." + }, + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + "description": { + "type": "object", + "description": "A description of the activity in multiple languages.", + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(-regioncode).", + "pattern": "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the activity in the key's language." + } + }, + "additionalProperties": false, + "required": [ + "en" + ] + }, + "url": { + "type": [ + "string", + "array" + ], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + "version": { + "type": "string", + "description": "The SemVer version of the activity. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "apiVersion": { + "type": "integer", + "description": "The Activity System version this activity supports.", + "minimum": 1, + "maximum": 2 + }, + "logo": { + "type": "string", + "description": "The logo of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "color": { + "type": "string", + "description": "The theme color of the service this activity is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + "tags": { + "type": [ + "array" + ], + "description": "The tags for the activity.", + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + "category": { + "type": "string", + "description": "The category the activity falls under.", + "enum": [ + "anime", + "games", + "music", + "socials", + "videos", + "other" + ] + }, + "iframe": { + "type": "boolean", + "description": "Whether or not the activity should run in IFrames." + }, + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the activity to inject into." + }, + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the activity to inject into." + }, + "settings": { + "type": "array", + "description": "An array of settings the user can change in the activity.", + "items": { + "type": "object", + "description": "A setting.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + "patternProperties": { + "": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "additionalProperties": false + }, + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The default value of the setting. Not compatible with `values`." + }, + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + "items": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "multiLanguage": { + "type": "boolean", + "description": "When true, strings from the `general.json` file are available for use, plus the .json file. False is not allowed." + } + }, + "additionalProperties": false + } + }, + "mobile": { + "type": "boolean", + "description": "Whether or not the activity has support for mobile devices." + } + }, + "additionalProperties": false, + "required": [ + "author", + "service", + "description", + "url", + "version", + "apiVersion", + "logo", + "thumbnail", + "color", + "tags", + "category" + ] +} diff --git a/apps/schema-server/schemas/metadata/1.14.json b/apps/schema-server/schemas/metadata/1.14.json new file mode 100644 index 0000000..29acbdb --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.14.json @@ -0,0 +1,252 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.14", + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a activity.", + "definitions": { + "user": { + "type": "object", + "description": "User information.", + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + "additionalProperties": false, + "required": [ + "name", + "id" + ] + } + }, + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + "type": "string", + "description": "The metadata schema URL." + }, + "author": { + "$ref": "#/definitions/user", + "description": "The author of this activity." + }, + "contributors": { + "type": "array", + "description": "Any extra contributors to this activity.", + "items": { + "$ref": "#/definitions/user" + } + }, + "service": { + "type": "string", + "description": "The service this activity is for." + }, + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + "description": { + "type": "object", + "description": "A description of the activity in multiple languages.", + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(-regioncode).", + "pattern": "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the activity in the key's language." + } + }, + "additionalProperties": false, + "required": [ + "en" + ] + }, + "url": { + "type": [ + "string", + "array" + ], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + "version": { + "type": "string", + "description": "The SemVer version of the activity. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "apiVersion": { + "type": "integer", + "description": "The Activity System version this activity supports.", + "minimum": 1, + "maximum": 2 + }, + "logo": { + "type": "string", + "description": "The logo of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "color": { + "type": "string", + "description": "The theme color of the service this activity is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + "tags": { + "type": [ + "array" + ], + "description": "The tags for the activity.", + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + "category": { + "type": "string", + "description": "The category the activity falls under.", + "enum": [ + "anime", + "games", + "music", + "socials", + "videos", + "other" + ] + }, + "iframe": { + "type": "boolean", + "description": "Whether or not the activity should run in IFrames." + }, + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the activity to inject into." + }, + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the activity to inject into." + }, + "settings": { + "type": "array", + "description": "An array of settings the user can change in the activity.", + "items": { + "type": "object", + "description": "A setting.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + "description": { + "type": "string", + "description": "The description of the setting. Only applicable if `multiLanguage` is disabled." + }, + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + "patternProperties": { + "": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "additionalProperties": false + }, + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The default value of the setting. Not compatible with `values`." + }, + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + "items": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "multiLanguage": { + "type": "boolean", + "description": "When true, strings from the `general.json` file are available for use, plus the .json file. False is not allowed." + } + }, + "additionalProperties": false + } + }, + "mobile": { + "type": "boolean", + "description": "Whether or not the activity has support for mobile devices." + } + }, + "additionalProperties": false, + "required": [ + "author", + "service", + "description", + "url", + "version", + "apiVersion", + "logo", + "thumbnail", + "color", + "tags", + "category" + ] +} diff --git a/apps/schema-server/schemas/metadata/1.15.json b/apps/schema-server/schemas/metadata/1.15.json new file mode 100644 index 0000000..78e862e --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.15.json @@ -0,0 +1,256 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.15", + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a activity.", + "definitions": { + "user": { + "type": "object", + "description": "User information.", + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + "additionalProperties": false, + "required": [ + "name", + "id" + ] + } + }, + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + "type": "string", + "description": "The metadata schema URL." + }, + "author": { + "$ref": "#/definitions/user", + "description": "The author of this activity." + }, + "contributors": { + "type": "array", + "description": "Any extra contributors to this activity.", + "items": { + "$ref": "#/definitions/user" + } + }, + "service": { + "type": "string", + "description": "The service this activity is for." + }, + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + "description": { + "type": "object", + "description": "A description of the activity in multiple languages.", + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(-regioncode).", + "pattern": "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2,3}(?:-(?:[a-z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the activity in the key's language." + } + }, + "additionalProperties": false, + "required": [ + "en" + ] + }, + "url": { + "type": [ + "string", + "array" + ], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + "version": { + "type": "string", + "description": "The SemVer version of the activity. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "apiVersion": { + "type": "integer", + "description": "The Activity System version this activity supports.", + "minimum": 1, + "maximum": 2 + }, + "logo": { + "type": "string", + "description": "The logo of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this activity is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + "color": { + "type": "string", + "description": "The theme color of the service this activity is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + "tags": { + "type": [ + "array" + ], + "description": "The tags for the activity.", + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + "category": { + "type": "string", + "description": "The category the activity falls under.", + "enum": [ + "anime", + "games", + "music", + "socials", + "videos", + "other" + ] + }, + "iframe": { + "type": "boolean", + "description": "Whether or not the activity should run in IFrames." + }, + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the activity to inject into." + }, + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the activity to inject into." + }, + "allowURLOverrides": { + "type": "boolean", + "description": "Whether or not the activity should allow URL overrides." + }, + "settings": { + "type": "array", + "description": "An array of settings the user can change in the activity.", + "items": { + "type": "object", + "description": "A setting.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + "description": { + "type": "string", + "description": "The description of the setting. Only applicable if `multiLanguage` is disabled." + }, + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + "patternProperties": { + "": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "additionalProperties": false + }, + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The default value of the setting. Not compatible with `values`." + }, + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + "items": { + "type": [ + "string", + "number", + "boolean" + ], + "description": "The value of the setting." + } + }, + "multiLanguage": { + "type": "boolean", + "description": "When true, strings from the `general.json` file are available for use, plus the .json file. False is not allowed." + } + }, + "additionalProperties": false + } + }, + "mobile": { + "type": "boolean", + "description": "Whether or not the activity has support for mobile devices." + } + }, + "additionalProperties": false, + "required": [ + "author", + "service", + "description", + "url", + "version", + "apiVersion", + "logo", + "thumbnail", + "color", + "tags", + "category" + ] +} diff --git a/apps/schema-server/schemas/metadata/1.2.json b/apps/schema-server/schemas/metadata/1.2.json new file mode 100644 index 0000000..8a8fcd8 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.2.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.0", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?:\\/\\/?([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+\\/.*$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bs] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.3.json b/apps/schema-server/schemas/metadata/1.3.json new file mode 100644 index 0000000..4e694d2 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.3.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.3", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?:\\/\\/?([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+\\/.*$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bsd] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.4.json b/apps/schema-server/schemas/metadata/1.4.json new file mode 100644 index 0000000..674d46b --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.4.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.4", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpg)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpg)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bsd] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.5.json b/apps/schema-server/schemas/metadata/1.5.json new file mode 100644 index 0000000..30403cd --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.5.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.5", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(_[A-Z]{2})?$" + }, + "patternProperties": { + "^[a-z]{2}(_[A-Z]{2})?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g|gif)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bsd] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.6.json b/apps/schema-server/schemas/metadata/1.6.json new file mode 100644 index 0000000..7e818f7 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.6.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.6", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g|gif)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa[bsd] fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.7.json b/apps/schema-server/schemas/metadata/1.7.json new file mode 100644 index 0000000..425c194 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.7.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.7", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g|gif)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://(i).(imgur).(com)/(.*?).(png|jpe?g)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.8.json b/apps/schema-server/schemas/metadata/1.8.json new file mode 100644 index 0000000..3499fca --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.8.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.8", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://(cdn[.]rcd[.]gg|i[.]imgur[.]com)/(.*?)[.](png|jpe?g|gif|webp)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://(cdn[.]rcd[.]gg|i[.]imgur[.]com)/(.*?)[.](png|jpe?g|gif|webp)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/1.9.json b/apps/schema-server/schemas/metadata/1.9.json new file mode 100644 index 0000000..76acff6 --- /dev/null +++ b/apps/schema-server/schemas/metadata/1.9.json @@ -0,0 +1,257 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://schemas.premid.app/metadata/1.9", + + "title": "Metadata", + "type": "object", + "description": "Metadata that describes a presence.", + + "definitions": { + "user": { + "type": "object", + "description": "User information.", + + "properties": { + "name": { + "type": "string", + "description": "The name of the user." + }, + + "id": { + "type": "string", + "description": "The Discord snowflake of the user.", + "pattern": "^\\d+$" + } + }, + + "additionalProperties": false, + "required": ["name", "id"] + } + }, + + "properties": { + "$schema": { + "$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.", + + "type": "string", + "description": "The metadata schema URL." + }, + + "author": { + "$ref": "#/definitions/user", + "description": "The author of this presence." + }, + + "contributors": { + "type": "array", + "description": "Any extra contributors to this presence.", + + "items": { + "$ref": "#/definitions/user" + } + }, + + "service": { + "type": "string", + "description": "The service this presence is for." + }, + + "altnames": { + "type": "array", + "description": "Alternative names for the service.", + + "items": { + "type": "string", + "description": "An alternative name." + }, + "minItems": 1 + }, + + "description": { + "type": "object", + "description": "A description of the presence in multiple languages.", + + "propertyNames": { + "type": "string", + "description": "The language key. The key must be languagecode(_REGIONCODE).", + "pattern": "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$" + }, + "patternProperties": { + "^[a-z]{2}(?:_(?:[A-Z]{2}|[0-9]{1,3}))?$": { + "type": "string", + "description": "The description of the presence in the key's language." + } + }, + + "additionalProperties": false, + "required": ["en"] + }, + + "url": { + "type": ["string", "array"], + "description": "The service's website URL, or an array of URLs. Protocols should not be added.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$", + + "items": { + "type": "string", + "description": "One of the service's website URLs.", + "pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$" + }, + "minItems": 2 + }, + + "version": { + "type": "string", + "description": "The SemVer version of the presence. Must just be major.minor.patch.", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + + "logo": { + "type": "string", + "description": "The logo of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + + "thumbnail": { + "type": "string", + "description": "A thumbnail of the service this presence is for.", + "pattern": "^https?://.+\\.(png|jpe?g|gif|webp)$" + }, + + "color": { + "type": "string", + "description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.", + "pattern": "^#([A-Fa-f0-9]{3}){1,2}$" + }, + + "tags": { + "type": ["array"], + "description": "The tags for the presence.", + + "items": { + "type": "string", + "description": "A tag.", + "pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$" + }, + "minItems": 1 + }, + + "category": { + "type": "string", + "description": "The category the presence falls under.", + "enum": ["anime", "games", "music", "socials", "videos", "other"] + }, + + "iframe": { + "type": "boolean", + "description": "Whether or not the presence should run in IFrames." + }, + + "readLogs": { + "type": "boolean", + "description": "Whether or not the extension should be reading logs." + }, + + "regExp": { + "type": "string", + "description": "A regular expression used to match URLs for the presence to inject into." + }, + + "iFrameRegExp": { + "type": "string", + "description": "A regular expression used to match IFrames for the presence to inject into." + }, + + "button": { + "type": "boolean", + "description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only." + }, + + "warning": { + "type": "boolean", + "description": "Shows a warning saying that it requires additional steps for the presence to function correctly." + }, + + "settings": { + "type": "array", + "description": "An array of settings the user can change in the presence.", + + "items": { + "type": "object", + "description": "A setting.", + + "properties": { + "id": { + "type": "string", + "description": "The ID of the setting." + }, + + "title": { + "type": "string", + "description": "The title of the setting. Required only if `multiLanguage` is disabled." + }, + + "icon": { + "type": "string", + "description": "The icon of the setting. Required only if `multiLanguage` is disabled.", + "pattern": "^fa([bsdrlt]|([-](brands|solid|duotone|regular|light|thin))) fa-[0-9a-z-]+$" + }, + + "if": { + "type": "object", + "description": "Restrict showing this setting if another setting is the defined value.", + + "propertyNames": { + "type": "string", + "description": "The ID of the setting." + }, + + "patternProperties": { + "": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "additionalProperties": false + }, + + "placeholder": { + "type": "string", + "description": "The placeholder for settings that require input. Shown when the input is empty." + }, + + "value": { + "type": ["string", "number", "boolean"], + "description": "The default value of the setting. Not compatible with `values`." + }, + + "values": { + "type": "array", + "description": "The default values of the setting. Not compatible with `value`.", + + "items": { + "type": ["string", "number", "boolean"], + "description": "The value of the setting." + } + }, + + "multiLanguage": { + "type": ["string", "boolean", "array"], + "description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.", + + "items": { + "type": "string", + "description": "The name of a file from the localization GitHub repository." + } + } + }, + + "additionalProperties": false + } + } + }, + + "additionalProperties": false, + "required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"] +} diff --git a/apps/schema-server/schemas/metadata/README.md b/apps/schema-server/schemas/metadata/README.md new file mode 100644 index 0000000..a35c021 --- /dev/null +++ b/apps/schema-server/schemas/metadata/README.md @@ -0,0 +1,35 @@ +# Metadata Schema + +This schema is used to validate the `metadata.json` files in [PreMiD/Presences](https://github.com/PreMiD/Presences). + +## 1.7 + +- Updates `icon` regex for compability with FontAwesome v6 icon labelling + +## 1.6 + +- Adds support for language locales that end in numbers (e.g. es_419) + +## 1.5 + +- Allows `.gif` extensions for service logos and `.jpeg` extensions for service logos and thumbnails. + +## 1.4 + +- Adds regex for only allowing imgur links for `logo` & `thumbnail`. + +## 1.3 + +- Fixes validation for icons. + +## 1.2 + +- Adds "readLogs". + +## 1.1 + +- Adds "altnames" and "multiLanguage". + +## 1.0 + +- First iteration of the metadata file format. diff --git a/apps/schema-server/src/index.test.ts b/apps/schema-server/src/index.test.ts new file mode 100644 index 0000000..4045652 --- /dev/null +++ b/apps/schema-server/src/index.test.ts @@ -0,0 +1,37 @@ +import { resolve } from "node:path"; + +import { describe, expect, it } from "vitest"; + +import { app } from "./index.js"; + +describe("schemas", () => { + it("/ should return date", async () => { + const result = await app.inject({ url: "/" }); + + expect(result.statusCode).toBe(200); + expect(result.json()).toEqual({ date: expect.any(String) }); + }); + + it("/metadata/1.0 should return metadata schema", async () => { + const result = await app.inject({ url: "/metadata/1.0" }); + const schema = await import(resolve(import.meta.dirname, "../schemas/metadata/1.0.json")) as { default: Record }; + + expect(result.statusCode).toBe(200); + expect(result.json()).toEqual(schema.default); + }); + + it("/metadata/1.0 should return cached metadata schema", async () => { + const result = await app.inject({ url: "/metadata/1.0" }); + const schema = await import(resolve(import.meta.dirname, "../schemas/metadata/1.0.json")) as { default: Record }; + + expect(result.statusCode).toBe(200); + expect(result.json()).toEqual(schema.default); + }); + + it("/metadata/1 should return 404", async () => { + const result = await app.inject({ url: "/metadata/1" }); + + expect(result.statusCode).toBe(404); + expect(result.json()).toEqual({ error: "Schema not found." }); + }); +}); diff --git a/apps/schema-server/src/index.ts b/apps/schema-server/src/index.ts new file mode 100644 index 0000000..7c1a958 --- /dev/null +++ b/apps/schema-server/src/index.ts @@ -0,0 +1,63 @@ +import { extname, resolve } from "node:path"; + +import process from "node:process"; +import helmet from "@fastify/helmet"; +import fastify from "fastify"; +import { globby } from "globby"; +import type { RequestGenericInterface } from "fastify"; + +export const app = fastify(); + +await app.register(helmet); + +app.get("/", (_, reply) => reply.send({ date: new Date() })); + +interface versionRequest extends RequestGenericInterface { + Params: { + schemaName: string; + version: string; + }; +} + +const availableSchemas: Record; +}[]> = {}; + +for (const schemaPath of await globby(resolve(import.meta.dirname, "../schemas/*/*.json"), { onlyFiles: true })) { + const [schemaName, version] = schemaPath.split("/").slice(-2) as [string, string]; + + let schemaVersions = availableSchemas[schemaName]; + + if (!schemaVersions) + schemaVersions = []; + + const { default: content } = await import(schemaPath, { with: { type: "json" } }) as { default: Record }; + schemaVersions.push({ + content, + version: version.replace(extname(version), ""), + }); + + availableSchemas[schemaName] = schemaVersions; +} + +app.get("/:schemaName/:version", async (request, reply) => { + const { schemaName, version } = request.params; + + if (!availableSchemas[schemaName]?.some(schema => schema.version === version)) + return reply.status(404).send({ error: "Schema not found." }); + + return reply.send(availableSchemas[schemaName]?.find(schema => schema.version === version)?.content); +}); + +/* c8 ignore start */ +if (process.env.NODE_ENV !== "test") { + const url = await app.listen({ + host: process.env.HOST ?? "0.0.0.0", + port: Number.parseInt(process.env.PORT ?? "80"), + }); + + // eslint-disable-next-line no-console + console.log(`Listening on ${url}`); +} +/* c8 ignore stop */ diff --git a/apps/schema-server/tsconfig.app.json b/apps/schema-server/tsconfig.app.json new file mode 100644 index 0000000..dd0b7bb --- /dev/null +++ b/apps/schema-server/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*.ts"], + "exclude": ["**/*.test.ts", "dist"] +} diff --git a/apps/schema-server/tsconfig.json b/apps/schema-server/tsconfig.json new file mode 100644 index 0000000..c0fe036 --- /dev/null +++ b/apps/schema-server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "types": ["@types/node"], + "noEmit": true + }, + "include": ["environment.d.ts", "src"], + "exclude": ["**/*.test.ts"] +} diff --git a/installer_assets/PreMiD-Upgrade.xml b/installer_assets/PreMiD-Upgrade.xml deleted file mode 100644 index 0dfb1fd..0000000 --- a/installer_assets/PreMiD-Upgrade.xml +++ /dev/null @@ -1,416 +0,0 @@ - - PreMiD - PreMiD - VERSION - upgrader.${platform_exec_suffix} - 0 - ../LICENSE - leftSide.png - logo.png - logo.png - - - default - Default Component - 1 - 1 - 1 - - - Program Files - ${installdir} - programfiles - all - - - Program Files - ${installdir} - programfileslinux - linux - - - Program Files - ${installdir} - programfileslinux64 - linux-x64 - - - Program Files - ${installdir} - programfileswindows - windows - - - Program Files - ${installdir} - programfileswindows64 - windows-x64 - - - Program Files - ${installdir} - programfilesosx - osx - - - - - Uninstall ${product_fullname} - Uninstall ${product_fullname} - 0 - 0 - ${installdir}/${uninstallerName}.exe - - - ${installdir}/ - - - Rich Presence for web services. - PreMiD - 0 - 0 - ${installdir}/PreMiD.${platform_exec_suffix} - - - - - - - - - - installdir - 1 - ${windows_folder_appdata}/PreMiD - - - windows - - - - - installdir - 1 - ${platform_install_prefix}/PreMiD - - - osx - - - - - - - Couldn't download release... Try again later. - Downloading latest release... - - - Downloading latest release... - 450 - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-win32-x64.zip - - - - - windows-x64 - - - - - Downloading latest release... - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-win32-ia32.zip - - - - - windows-x86 - - - - - Downloading latest release... - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-darwin-x64.zip - - - - - osx - - - - - - - - - - HKEY_LOCAL_MACHINE\Software\${project.windowsSoftwareRegistryPrefix} - Version - oldVersion - - - - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${project.fullName} ${oldVersion} - - - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\${project.fullName} ${oldVersion} - - - - - - - - - - Killing ${product_fullname}... - - - 0 - ${product_fullname}.exe - 0 - - - windows - - - - - pkill - PreMiD - ${env(USER)} - 0 - ${installdir}/ - - - osx - - - is_running - PreMiD - - - - - - - - - 1 - ${installdir} - Extracting release... - ${system_temp_directory}/PreMiD-release.zip - - - 1 - ${installdir}/ - - - - - Killing ${product_fullname}... - - - 0 - ${product_fullname}.exe - 0 - - - windows - - - - - pkill - PreMiD - ${env(USER)} - 0 - ${installdir}/ - - - osx - - - is_running - PreMiD - - - - - - - lzham-ultra - 1 - unattended - 1 - Rich Presence for web services. - 1 - 0 - 1 - 1 - user - upgrade - utf-8 - appIcon.icns - eu.Timeraa.PreMiD - osx-intel osx-x86_64 - appIcon.icns - ../dist/installer - onlyIfNewer - C:/Users/metzf/Documents/Development/PreMiD/PreMiD/installer_assets/appIcon.ico - https://discord.premid.app - https://premid.app - utf-8 - 1 - 1 - asInvoker - 1 - Rich Presence for web services. - minimalWithDialogs - Timeraa - 625 - appIcon.ico - Rich Presence for web services. - ${product_version} - appIcon.ico - - - en - utf-8 - ../LICENSE - - - - - post_install_page - Installation Finished - - - - installation - - - general - General - - - - - addDesktop - Create Desktop Icon - - false - false - checkbox-left - - - launchApp - Launch App - - true - true - checkbox-left - - - extra - Extra - - - - - openStore - Open Presence Store - - true - true - checkbox-left - - - - - ${windows_folder_desktopdirectory} - - - ${addDesktop} - - - - - Rich Presence for web services. - PreMiD - 0 - 0 - ${installdir}/PreMiD.${platform_exec_suffix} - - - - - - - - 0 - PreMiD.exe - & - Launching PreMiD... - 0 - ${installdir} - - - windows - - - ${launchApp} - - - - - 0 - open - ${installdir}/PreMiD.app - Launching PreMiD... - ${env(USER)} - 0 - 0 - - - osx - - - ${launchApp} - - - - - https://premid.app/store - - - ${openStore} - - - - - - - - - - windows - - - - diff --git a/installer_assets/PreMiD.xml b/installer_assets/PreMiD.xml deleted file mode 100644 index c6f88ca..0000000 --- a/installer_assets/PreMiD.xml +++ /dev/null @@ -1,412 +0,0 @@ - - PreMiD - PreMiD - latest - ${product_shortname}-installer.${platform_exec_suffix} - 0 - ../LICENSE - leftSide.png - logo.png - logo.png - - - default - Default Component - 1 - 1 - 1 - - - Program Files - ${installdir} - programfiles - all - - - Program Files - ${installdir} - programfileslinux - linux - - - Program Files - ${installdir} - programfileslinux64 - linux-x64 - - - Program Files - ${installdir} - programfileswindows - windows - - - Program Files - ${installdir} - programfileswindows64 - windows-x64 - - - Program Files - ${installdir} - programfilesosx - osx - - - - - Uninstall ${product_fullname} - Uninstall ${product_fullname} - 0 - 0 - ${installdir}/${uninstallerName}.exe - - - ${installdir}/ - - - Rich Presence for web services. - PreMiD - 0 - 0 - ${installdir}/PreMiD.${platform_exec_suffix} - - - - - - - - - - installdir - 1 - ${windows_folder_appdata}/PreMiD - - - windows - - - - - installdir - 1 - ${platform_install_prefix}/PreMiD - - - osx - - - - - - - Couldn't download release... Try again later. - Downloading latest release... - - - Downloading latest release... - 450 - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-win32-x64.zip - - - - - windows-x64 - - - - - Downloading latest release... - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-win32-ia32.zip - - - - - windows-x86 - - - - - Downloading latest release... - - - ${platform_name} - ${system_temp_directory}/PreMiD-release.zip - https://github.com/PreMiD/PreMiD/releases/latest/download/PreMiD-darwin-x64.zip - - - - - osx - - - - - - - - - - HKEY_LOCAL_MACHINE\Software\${project.windowsSoftwareRegistryPrefix} - Version - oldVersion - - - - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${project.fullName} ${oldVersion} - - - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\${project.fullName} ${oldVersion} - - - - - - - - - - Killing ${product_fullname}... - - - 0 - ${product_fullname}.exe - 0 - - - windows - - - - - pkill - PreMiD - ${env(USER)} - 0 - ${installdir}/ - - - osx - - - is_running - PreMiD - - - - - - - - - 1 - ${installdir} - Extracting release... - ${system_temp_directory}/PreMiD-release.zip - - - 1 - ${installdir}/ - - - - - Killing ${product_fullname}... - - - 0 - ${product_fullname}.exe - 0 - - - windows - - - - - pkill - PreMiD - ${env(USER)} - 0 - ${installdir}/ - - - osx - - - is_running - PreMiD - - - - - - - lzham-ultra - 1 - 1 - Rich Presence for web services. - 1 - 0 - 1 - 1 - user - utf-8 - appIcon.icns - eu.Timeraa.PreMiD - osx-intel osx-x86_64 - appIcon.icns - ../dist/installer - onlyIfNewer - C:/Users/metzf/Documents/Development/PreMiD/PreMiD/installer_assets/appIcon.ico - https://discord.premid.app - https://premid.app - utf-8 - 1 - 1 - asInvoker - 1 - Rich Presence for web services. - Timeraa - appIcon.ico - Rich Presence for web services. - ${product_version} - appIcon.ico - - - en - utf-8 - ../LICENSE - - - - - post_install_page - Installation Finished - - - - installation - - - general - General - - - - - addDesktop - Create Desktop Icon - - false - false - checkbox-left - - - launchApp - Launch App - - true - true - checkbox-left - - - extra - Extra - - - - - openStore - Open Presence Store - - true - true - checkbox-left - - - - - ${windows_folder_desktopdirectory} - - - ${addDesktop} - - - - - Rich Presence for web services. - PreMiD - 0 - 0 - ${installdir}/PreMiD.${platform_exec_suffix} - - - - - - - - 0 - PreMiD.exe - & - Launching PreMiD... - 0 - ${installdir} - - - windows - - - ${launchApp} - - - - - 0 - open - ${installdir}/PreMiD.app - Launching PreMiD... - ${env(USER)} - 0 - 0 - - - osx - - - ${launchApp} - - - - - https://premid.app/store - - - ${openStore} - - - - - - - - - - windows - - - - diff --git a/installer_assets/appIcon.icns b/installer_assets/appIcon.icns deleted file mode 100644 index 5fe6048..0000000 Binary files a/installer_assets/appIcon.icns and /dev/null differ diff --git a/installer_assets/appIcon.ico b/installer_assets/appIcon.ico deleted file mode 100644 index 425f8cb..0000000 Binary files a/installer_assets/appIcon.ico and /dev/null differ diff --git a/installer_assets/appIcon.png b/installer_assets/appIcon.png deleted file mode 100644 index c5948d3..0000000 Binary files a/installer_assets/appIcon.png and /dev/null differ diff --git a/installer_assets/leftSide.png b/installer_assets/leftSide.png deleted file mode 100644 index 7317b0c..0000000 Binary files a/installer_assets/leftSide.png and /dev/null differ diff --git a/installer_assets/logo.png b/installer_assets/logo.png deleted file mode 100644 index 3968836..0000000 Binary files a/installer_assets/logo.png and /dev/null differ diff --git a/package.json b/package.json deleted file mode 100644 index c2d8990..0000000 --- a/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "premid", - "productName": "PreMiD", - "description": "Discord Rich Presence for web services.", - "version": "2.2.1", - "repository": "https://github.com/PreMiD/PreMiD", - "scripts": { - "init": "tsc --skipLibCheck && tsc pkg util/prepare util/zip && devScript --copyOnly", - "start": "electron dist/app/. --unhandled-rejections=strict", - "dev": "devscript --depCheck", - "pkg": "rimraf dist && tsc --skipLibCheck && devScript --copyOnly && cd dist/app/ && yarn && cd ../../ && node pkg", - "deploy": "tsc --skipLibCheck .github/deploy && cd .github && node deploy.js" - }, - "license": "MPL-2.0", - "devDependencies": { - "@types/archiver": "5.1.0", - "@types/auto-launch": "5.0.1", - "@types/discord-rpc": "3.0.4", - "@types/fs-extra": "9.0.11", - "@types/ini": "1.3.30", - "@types/node": "14.14.41", - "@types/prompts": "2.0.11", - "@types/request-promise-native": "1.0.17", - "@types/rimraf": "3.0.0", - "@types/socket.io": "2.1.13", - "@types/ssh2-sftp-client": "5.3.1", - "@types/unzipper": "^0.10.3", - "archiver": "5.2.0", - "chalk": "4.1.1", - "electron": "11.3.0", - "electron-packager": "15.2.0", - "fast-glob": "3.2.5", - "fs-extra": "9.1.0", - "nodemon": "2.0.7", - "ora": "5.3.0", - "prompts": "2.4.1", - "rimraf": "3.0.2", - "ssh2-sftp-client": "6.0.1", - "ts-devscript": "^3.0.3", - "typescript": "4.1.5", - "unzipper": "0.10.11", - "yarn": "1.22.10" - }, - "dependencies": { - "auto-launch": "5.0.5", - "axios": "0.21.1", - "chokidar": "3.5.1", - "discord-rpc": "github:discordjs/RPC", - "electron-store": "7.0.3", - "socket.io": "3.1.2", - "source-map-support": "^0.5.19" - }, - "devScript": { - "out": "dist/app" - } -} diff --git a/pkg.ts b/pkg.ts deleted file mode 100644 index 0731e9d..0000000 --- a/pkg.ts +++ /dev/null @@ -1,123 +0,0 @@ -import * as electronPackager from "electron-packager"; -import { platform } from "os"; -import * as prompts from "prompts"; -import * as ora from "ora"; - -(async () => { - let response = { - os: "current", - arch: "all" - }; - - if (process.env.NODE_ENV !== "DePloY") - response = await prompts([ - { - type: "select", - name: "arch", - message: "What architecture?", - choices: [ - { - title: "current", - value: "current" - }, - { - title: "all", - value: "all" - }, - { - title: "arm64", - value: "arm64" - }, - { - title: "armv7l", - value: "armv7l" - }, - { - title: "ia32", - value: "ia32" - }, - { - title: "mips64el", - value: "mips64el" - }, - { - title: "x64", - value: "x64" - } - ] - }, - { - type: "select", - name: "os", - message: "What operating system?", - choices: [ - { - title: "current", - value: "current" - }, - { - title: "all", - value: "all" - }, - { - title: "darwin", - value: "darwin" - }, - { - title: "linux", - value: "linux" - }, - { - title: "mas", - value: "mas" - }, - { - title: "win32", - value: "win32" - } - ] - } - ]); - - if (!response.os) { - process.exit(); - } - - let icon: string; - - if ( - response.os == "darwin" || - (response.os === "current" && platform() === "darwin") - ) - icon = "./installer_assets/appIcon.icns"; - if (["ia32", "x64"].includes(response.arch) || platform() === "win32") - icon = "./installer_assets/appIcon.ico"; - - let spinner = ora("Packaging app").start(), - packagingOptions: electronPackager.Options = { - dir: "./dist/app", - out: "./dist", - darwinDarkModeSupport: true, - icon: icon, - overwrite: true, - quiet: true, - appBundleId: "eu.Timeraa.PreMiD", - appCategoryType: "Utilities", - appCopyright: `Timeraa 2018-${new Date().getFullYear()}`, - prune: true, - asar: true, - // @ts-ignore - arch: response.arch, - // @ts-ignore - platform: response.os - }; - - if (response.arch === "current") delete packagingOptions.arch; - if (response.os === "current") delete packagingOptions.platform; - - electronPackager(packagingOptions).then(() => { - spinner.text = "Done!"; - spinner.succeed(); - process.exit(); - }); -})(); diff --git a/src/assets/appIcon.icns b/src/assets/appIcon.icns deleted file mode 100644 index 5fe6048..0000000 Binary files a/src/assets/appIcon.icns and /dev/null differ diff --git a/src/assets/tray/Icon.ico b/src/assets/tray/Icon.ico deleted file mode 100644 index e7a8335..0000000 Binary files a/src/assets/tray/Icon.ico and /dev/null differ diff --git a/src/assets/tray/Icon@1.25x.png b/src/assets/tray/Icon@1.25x.png deleted file mode 100644 index b096535..0000000 Binary files a/src/assets/tray/Icon@1.25x.png and /dev/null differ diff --git a/src/assets/tray/Icon@1.5x.png b/src/assets/tray/Icon@1.5x.png deleted file mode 100644 index a60978c..0000000 Binary files a/src/assets/tray/Icon@1.5x.png and /dev/null differ diff --git a/src/assets/tray/Icon@1.8x.png b/src/assets/tray/Icon@1.8x.png deleted file mode 100644 index d79c74e..0000000 Binary files a/src/assets/tray/Icon@1.8x.png and /dev/null differ diff --git a/src/assets/tray/Icon@16x.png b/src/assets/tray/Icon@16x.png deleted file mode 100644 index d9f2f1c..0000000 Binary files a/src/assets/tray/Icon@16x.png and /dev/null differ diff --git a/src/assets/tray/Icon@2.5x.png b/src/assets/tray/Icon@2.5x.png deleted file mode 100644 index b14994e..0000000 Binary files a/src/assets/tray/Icon@2.5x.png and /dev/null differ diff --git a/src/assets/tray/Icon@2x.png b/src/assets/tray/Icon@2x.png deleted file mode 100644 index 92cb7af..0000000 Binary files a/src/assets/tray/Icon@2x.png and /dev/null differ diff --git a/src/assets/tray/Icon@3x.png b/src/assets/tray/Icon@3x.png deleted file mode 100644 index 3b50807..0000000 Binary files a/src/assets/tray/Icon@3x.png and /dev/null differ diff --git a/src/assets/tray/Icon@4x.png b/src/assets/tray/Icon@4x.png deleted file mode 100644 index 49ece44..0000000 Binary files a/src/assets/tray/Icon@4x.png and /dev/null differ diff --git a/src/assets/tray/Icon@5x.png b/src/assets/tray/Icon@5x.png deleted file mode 100644 index a3b67a3..0000000 Binary files a/src/assets/tray/Icon@5x.png and /dev/null differ diff --git a/src/assets/tray/Icon@8x.png b/src/assets/tray/Icon@8x.png deleted file mode 100644 index 4ff65f4..0000000 Binary files a/src/assets/tray/Icon@8x.png and /dev/null differ diff --git a/src/assets/tray/IconTemplate.png b/src/assets/tray/IconTemplate.png deleted file mode 100644 index 3effa29..0000000 Binary files a/src/assets/tray/IconTemplate.png and /dev/null differ diff --git a/src/assets/tray/IconTemplate@2x.png b/src/assets/tray/IconTemplate@2x.png deleted file mode 100644 index 4b873d6..0000000 Binary files a/src/assets/tray/IconTemplate@2x.png and /dev/null differ diff --git a/src/assets/tray/icon.png b/src/assets/tray/icon.png deleted file mode 100644 index 0eea842..0000000 Binary files a/src/assets/tray/icon.png and /dev/null differ diff --git a/src/assets/tray/icon.svg b/src/assets/tray/icon.svg deleted file mode 100644 index 550464a..0000000 --- a/src/assets/tray/icon.svg +++ /dev/null @@ -1 +0,0 @@ -pmd_logo_1 \ No newline at end of file diff --git a/src/assets/tray/windows_icon.xcf b/src/assets/tray/windows_icon.xcf deleted file mode 100644 index 47103dd..0000000 Binary files a/src/assets/tray/windows_icon.xcf and /dev/null differ diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index a875fa4..0000000 --- a/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import "source-map-support/register"; - -import { app } from "electron"; -import { platform } from "os"; - -import { update as initAutoLaunch } from "./managers/launchManager"; -import { init as initSocket } from "./managers/socketManager"; -import { TrayManager } from "./managers/trayManager"; -import { checkForUpdate } from "./util/updateChecker"; - -export let trayManager: TrayManager; - -//* Define and set it to null -//* Set AppUserModelId for task manager etc -//* When app is ready -export let updateCheckerInterval = null; - -//* Attempt to get lock to prevent multiple instances of PreMiD from running -let singleInstanceLock = app.requestSingleInstanceLock(); - -//* Application already running? -if (!singleInstanceLock) app.quit(); - -app.setAppUserModelId("Timeraa.PreMiD"); -app.whenReady().then(async () => { - trayManager = new TrayManager(); - - await Promise.all([checkForUpdate(true), initAutoLaunch(), initSocket()]); - - app.isPackaged - ? (updateCheckerInterval = setInterval(checkForUpdate, 15 * 1000 * 60)) - : undefined; - if (platform() === "darwin") app.dock.hide(); -}); diff --git a/src/managers/discordManager.ts b/src/managers/discordManager.ts deleted file mode 100644 index e390545..0000000 --- a/src/managers/discordManager.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Client } from "discord-rpc"; -import { app } from "electron"; - -import { trayManager } from "../"; -//* Import custom types -import PresenceData from "../../@types/PreMiD/PresenceData"; -import { info } from "../util/debug"; - -export let rpcClients: Array = []; - -class RPCClient { - clientId: string; - currentPresence: PresenceData; - client: Client; - clientReady: boolean = false; - - constructor(clientId: string) { - rpcClients.push(this); - - this.clientId = clientId; - this.client = new Client({ - transport: "ipc" - }); - - this.client.once("ready", () => { - this.clientReady = true; - this.setActivity(); - }); - this.client.once( - // @ts-ignore - "disconnected", - () => - (rpcClients = rpcClients.filter( - client => client.clientId !== this.clientId - )) - ); - - this.client.login({ clientId: this.clientId }).catch(() => this.destroy()); - - info(`Create RPC client (${this.clientId})`); - } - - setActivity(presenceData?: PresenceData) { - presenceData = presenceData ? presenceData : this.currentPresence; - - if (!this.clientReady || !presenceData) return; - - if (presenceData.trayTitle) - trayManager.tray.setTitle(presenceData.trayTitle); - - this.client - .setActivity(presenceData.presenceData) - .catch(() => this.destroy()); - info("setActivity"); - } - - clearActivity() { - this.currentPresence = null; - - if (!this.clientReady) return; - - this.client.clearActivity().catch(() => this.destroy()); - trayManager.tray.setTitle(""); - } - - async destroy() { - try { - info(`Destroy RPC client (${this.clientId})`); - if (this.clientReady) { - this.client.clearActivity(); - this.client.destroy(); - } - - trayManager.tray.setTitle(""); - rpcClients = rpcClients.filter( - client => client.clientId !== this.clientId - ); - } catch (err) {} - } -} - -/** - * Sets the user's activity - * @param presence PresenceData to set activity - */ -export function setActivity(presence: PresenceData) { - let client = rpcClients.find(c => c.clientId === presence.clientId); - - if (!client) { - client = new RPCClient(presence.clientId); - client.currentPresence = presence; - } else client.setActivity(presence); -} - -/** - * Clear a user's activity - * @param clientId clientId of presence to clear - */ -export function clearActivity(clientId: string = undefined) { - info("clearActivity"); - - if (clientId) { - let client = rpcClients.find(c => c.clientId === clientId); - client.clearActivity(); - } else rpcClients.forEach(c => c.clearActivity()); -} - -export async function getDiscordUser() { - return new Promise((resolve, reject) => { - const c = new Client({ transport: "ipc" }); - - c.login({ - clientId: "503557087041683458" - }) - .then(({ user }) => c.destroy().then(() => resolve(user))) - .catch(reject); - }); -} - -app.once( - "will-quit", - async () => await Promise.all(rpcClients.map(c => c.destroy())) -); diff --git a/src/managers/launchManager.ts b/src/managers/launchManager.ts deleted file mode 100644 index f34eb78..0000000 --- a/src/managers/launchManager.ts +++ /dev/null @@ -1,29 +0,0 @@ -import AutoLaunch from "auto-launch"; -import { app } from "electron"; -import { settings } from "./settingsManager"; -import { info } from "../util/debug"; - -//* Create autoLaunch object -let autoLaunch = new AutoLaunch({ - name: app.name, - isHidden: true -}); - -/** - * Updates autoLaunch - */ -export async function update() { - //* If app not packaged return - //* Either enable/disable autolaunch - if (!app.isPackaged) { - //* Show debug - //* Return - info("Skipping autoLaunch."); - return; - } - if (settings.get("autoLaunch", true)) - //* Enable if not enabled - autoLaunch.enable(); - //* Disable if enabled - else autoLaunch.disable(); -} diff --git a/src/managers/presenceDevManager.ts b/src/managers/presenceDevManager.ts deleted file mode 100644 index 9ddabe3..0000000 --- a/src/managers/presenceDevManager.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { readdirSync, readFileSync, unwatchFile } from "fs"; -import { dialog, app } from "electron"; -import { socket } from "./socketManager"; -import { extname } from "path"; -import { info } from "../util/debug"; - -import chokidar from "chokidar"; - -let presenceDevWatchedFiles = [], - currWatchPath = "", - currWatcher: chokidar.FSWatcher = null; - -export async function watchDir(path: string) { - currWatchPath = path + "/"; - let files = readdirSync(path); - - if (currWatcher) await currWatcher.close(); - - currWatcher = chokidar.watch(currWatchPath, { - ignoreInitial: true, - ignored: ["*.ts"] - }); - - currWatcher.on("all", eventName => { - files = readdirSync(currWatchPath); - - console.log(eventName, currWatchPath, files); - - readFiles(files, currWatchPath); - }); - - readFiles(files, path); -} - -async function readFiles(files, path) { - //* Send files to extension - socket.emit("localPresence", { - files: await Promise.all( - files.map(f => { - if (extname(f) === ".json") - return { - file: f, - contents: JSON.parse(readFileSync(`${path}/${f}`).toString()) - }; - else if (extname(f) === ".js") - return { - file: f, - contents: readFileSync(`${path}/${f}`).toString() - }; - else return; - }) - ) - }); -} - -export async function openFileDialog() { - //* Open file dialog - //* If user cancels - //* Unwatch all still watched files - //* Watch directory - app.focus(); - let oDialog = await dialog.showOpenDialog(null, { - title: "Select Presence Folder", - message: - "Please select the folder that contains the presence you want to load.\n(metadata.json, presence.js, iframe.js)", - buttonLabel: "Load Presence", - properties: ["openDirectory"] - }); - if (oDialog.canceled) { - //* Show debug - //* return - info("Presence load canceled."); - return; - } - info(`Watching ${oDialog.filePaths[0]}`); - if (presenceDevWatchedFiles.length > 0) - await Promise.all( - presenceDevWatchedFiles.map(f => unwatchFile(currWatchPath + f)) - ); - - watchDir(oDialog.filePaths[0]); -} diff --git a/src/managers/settingsManager.ts b/src/managers/settingsManager.ts deleted file mode 100644 index 943ff09..0000000 --- a/src/managers/settingsManager.ts +++ /dev/null @@ -1,33 +0,0 @@ -import ElectronStore from "electron-store"; -import { update as updateAutoLaunch } from "./launchManager"; -import { platform } from "os"; -import { info } from "../util/debug"; - -//* Import custom types -import ExtensionSettings from "../../@types/PreMiD/ExtensionSettings"; -import { trayManager } from ".."; - -//* Export and set default settings -export let settings = new ElectronStore({ - defaults: { - autoLaunch: true - } -}); - -/** - * Update settings of app - * @param extensionSettings Settings from extension - */ -export function update(extensionSettings: ExtensionSettings) { - //* Show debug - //* remove title if disabled - //* Update autolaunch if updated - //* Save Settings - info("Updated settings"); - if (!extensionSettings.titleMenubar && platform() === "darwin") - trayManager.tray.setTitle(""); - if (settings.get("autoLaunch") != extensionSettings.autoLaunch) { - settings.set("autoLaunch", extensionSettings.autoLaunch); - updateAutoLaunch(); - } -} diff --git a/src/managers/socketManager.ts b/src/managers/socketManager.ts deleted file mode 100644 index ffaf2b8..0000000 --- a/src/managers/socketManager.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { app, dialog } from "electron"; -import { createServer, Server } from "http"; -import socketIo from "socket.io"; - -import { trayManager } from "../"; -import { error, success } from "../util/debug"; -import { - clearActivity, - getDiscordUser, - rpcClients, - setActivity -} from "./discordManager"; -import { openFileDialog } from "./presenceDevManager"; -import { update as updateSettings } from "./settingsManager"; - -export let io: socketIo.Server; -export let socket: socketIo.Socket; -export let server: Server; -export let connected: boolean = false; - -export function init() { - return new Promise(resolve => { - //* Create server - //* create SocketIo server, don't server client - //* Try to listen to port 3020 - //* If that fails/some other error happens run socketError - //* If someone connects to socket socketConnection - server = createServer(); - io = new socketIo.Server(server, { - serveClient: false, - allowEIO3: true, - allowRequest: (req, callback) => { - if (req.headers.origin === undefined) return callback(null, true); - //* 2.5.0+ only allows extensions to connect - if ( - req.headers.origin.startsWith("chrome-extension://") || - req.headers.origin.startsWith("moz-extension://") - ) - return callback(null, true); - - callback("Origin not allowed", false); - } - }); - server.listen(3020, () => { - //* Resolve promise - //* Debug info - resolve(); - success("Opened socket"); - }); - server.on("error", socketError); - io.on("connection", socketConnection); - }); -} - -function socketConnection(cSocket: socketIo.Socket) { - //* Show debug - //* Set exported socket letiable to current socket - //* Handle setActivity event - //* Handle clearActivity event - //* Handle settingsUpdate - //* Handle presenceDev - //* Handle version request - //* Once socket user disconnects run cleanup - success("Socket connection"); - socket = cSocket; - getDiscordUser() - .then(user => socket.emit("discordUser", user)) - .catch(_ => socket.emit("discordUser", null)); - socket.on("setActivity", setActivity); - socket.on("clearActivity", clearActivity); - socket.on("settingUpdate", updateSettings); - socket.on("selectLocalPresence", openFileDialog); - socket.on("getVersion", () => - socket.emit("receiveVersion", app.getVersion().replace(/[\D]/g, "")) - ); - socket.once("disconnect", () => { - connected = false; - trayManager.update(); - //* Show debug - //* Destroy all open RPC connections - error("Socket disconnection."); - rpcClients.forEach(c => c.destroy()); - }); - connected = true; - trayManager.update(); -} - -//* Runs on socket errors -function socketError(e: any) { - //* Show debug - //* If port in use - error(e.message); - if (e.code === "EADDRINUSE") { - //* Focus app - //* Show error dialog - //* Exit app afterwards - app.focus(); - dialog.showErrorBox( - "Oh noes! Port error...", - `${app.name} could not bind to port ${e.port}.\nIs ${app.name} running already?` - ); - app.quit(); - } -} diff --git a/src/managers/trayManager.ts b/src/managers/trayManager.ts deleted file mode 100644 index 9954f5d..0000000 --- a/src/managers/trayManager.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { app, Menu, shell, Tray } from "electron"; -import { platform } from "os"; -import { join } from "path"; - -import { trayManager } from "../"; -import { checkForUpdate, update, updateAvailable } from "../util/updateChecker"; -import { connected } from "./socketManager"; - -let trayIcon; - -switch (platform()) { - case "darwin": - trayIcon = join(__dirname, "../assets/tray/IconTemplate.png"); - break; - case "win32": - trayIcon = join(__dirname, "../assets/tray/Icon.ico"); - break; - default: - trayIcon = join(__dirname, "../assets/tray/Icon@4x.png"); - break; -} - -export class TrayManager { - tray: Tray; - - constructor() { - this.tray = new Tray(trayIcon); - this.tray.setToolTip(app.name); - - this.tray.on("right-click", () => this.update()); - } - - update() { - this.tray.setContextMenu( - Menu.buildFromTemplate([ - { - icon: - platform() === "darwin" - ? join(__dirname, "../assets/tray/IconTemplate.png") - : join(__dirname, "../assets/tray/Icon@4x.png"), - label: `${app.name} v${app.getVersion()}`, - enabled: false - }, - { - id: "connectInfo", - label: `Extension - ${connected ? "Connected" : "Not connected"}`, - enabled: false - }, - { - type: "separator" - }, - { - label: "Presence Store", - click: () => shell.openExternal("https://premid.app/store") - }, - { - type: "separator" - }, - { - label: `Update ${app.name}!`, - visible: updateAvailable, - click: () => update() - }, - { - label: "Check for Updates", - click: () => checkForUpdate(false, true), - visible: !updateAvailable - }, - { - label: "Contributors", - click: () => shell.openExternal("https://premid.app/contributors") - }, - { - type: "separator" - }, - { - label: `Quit ${app.name}`, - role: "quit" - } - ]) - ); - } -} - -app.once("quit", () => trayManager?.tray.destroy()); diff --git a/src/util/debug.ts b/src/util/debug.ts deleted file mode 100644 index b2645a6..0000000 --- a/src/util/debug.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { app } from "electron"; -if (!app.isPackaged) var chalk = require("chalk"); - -/** - * Show info message in console - * */ -export function info(message: string) { - //* Return if app packaged - //* Show debug - if (app.isPackaged) return; - console.log(`${chalk.bgBlue(chalk.white(" INFO "))} ${message}`); -} - -/** - * Show success message in console - * */ -export function success(message: string) { - //* Return if app packaged - //* Show debug - if (app.isPackaged) return; - console.log(`${chalk.bgGreen(" SUCCESS ")} ${message}`); -} - -/** - * Show error message in console - * */ -export function error(message: string) { - //* Return if app packaged - //* Show debug - if (app.isPackaged) return; - console.log(`${chalk.bgRed(" ERROR ")} ${message}`); -} diff --git a/src/util/updateChecker.ts b/src/util/updateChecker.ts deleted file mode 100644 index 04fd187..0000000 --- a/src/util/updateChecker.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { exec } from "child_process"; -import { resolve } from "path"; -import { error, info } from "./debug"; -import { app, dialog, shell } from "electron"; -import { platform } from "os"; -import axios from "axios"; -import { Notification } from "electron"; -import { trayManager } from ".."; -import { createWriteStream, existsSync, unlinkSync } from "fs"; - -export let updateAvailable = false; -let initialNotification = true; - -export async function checkForUpdate(autoUpdate = false, manual = false) { - //* Skip Update checker if unsupported OS / not packaged - if (!app.isPackaged || !["darwin", "win32"].includes(platform())) { - //* Show debug - //* return - info("Skipping UpdateChecker"); - return; - } - - axios - .get("https://api.premid.app/v2/versions") - .then(({ data }) => { - if (!data?.app) return; - - const latestAppVersion = data.app; - - if (app.getVersion() >= latestAppVersion) { - if (manual) - dialog.showMessageBox(null, { - message: "There are currently no updates available.", - type: "info" - }); - return; - } - - if (autoUpdate) { - updateTray(); - update(); - return; - } - - if (initialNotification) { - const updateNotification = new Notification({ - title: "Update available!", - body: "A new version of PreMiD is available! Click here to update." - }); - - updateNotification.once("click", update); - updateNotification.show(); - updateTray(); - - initialNotification = false; - } - }) - .catch(err => { - error(err.message); - }); -} - -export async function update() { - if (!["win32", "darwin"].includes(platform())) return; - const updaterPath = resolve( - app.getPath("temp"), - `PreMiD-Updater${ - platform() === "win32" ? ".exe" : ".app/Contents/MacOS/installbuilder.sh" - }` - ); - - if (existsSync(updaterPath)) unlinkSync(updaterPath); - if (existsSync(resolve(app.getPath("temp"), "PreMiD-release.zip"))) - unlinkSync(resolve(app.getPath("temp"), "PreMiD-release.zip")); - - const response = await axios({ - url: `http://dl.premid.app/upgrader${ - platform() === "win32" ? ".exe" : ".app" - }`, - method: "GET", - responseType: "stream" - }); - - const writer = createWriteStream(updaterPath); - response.data.pipe(writer); - - new Promise((resolve, reject) => { - writer.on("finish", resolve); - writer.on("error", reject); - }) - .then(() => exec(updaterPath, errorHandler)) - .catch(errorHandler); -} - -function errorHandler(err: Error) { - dialog - .showMessageBox({ - title: `Error while updating ${app.name}`, - message: `If this error persists reinstall the app.`, - detail: err.message, - buttons: ["Okay", "Reinstall Application"], - type: "error" - }) - .then(value => { - if (value.response === 1) - shell.openExternal("https://premid.app/downloads"); - }); - updateTray(); -} - -function updateTray() { - updateAvailable = true; - trayManager.update(); -} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..dfe0988 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "references": [ + { + "path": "./apps/pd/tsconfig.app.json" + }, + { + "path": "./apps/schema-server/tsconfig.app.json" + } + ], + "files": [] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..18ac1ac --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,33 @@ +// Credit: https://www.totaltypescript.com/tsconfig-cheat-sheet +{ + "compilerOptions": { + /* AND if you're building for a library in a monorepo: */ + "composite": true, + "target": "es2022", + + /* If your code doesn't run in the DOM: */ + "lib": ["es2022"], + "moduleDetection": "force", + + "module": "NodeNext", + /* If transpiling with TypeScript: */ + "moduleResolution": "NodeNext", + "resolveJsonModule": true, + "allowJs": true, + /* Strictness */ + "strict": true, + "strictNullChecks": true, + "noUncheckedIndexedAccess": true, + + /* AND if you're building for a library: */ + "declaration": true, + "declarationMap": true, + "outDir": "dist", + "sourceMap": true, + /* Base Options: */ + "esModuleInterop": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "exclude": ["**/*/node_modules", "**/*/dist", "**/drizzle.config.ts"] +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index d6db4c6..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es2018", - "moduleResolution": "node", - "inlineSourceMap": true, - "outDir": "dist/app", - "removeComments": true, - "esModuleInterop": true, - "skipLibCheck": true, - "noUnusedParameters": true, - "noUnusedLocals": true - }, - "include": ["src/**/*"], - "exclude": [ - "**/node_modules/", - "pkg.ts", - "util/**/*", - "installer_assets/builder.ts", - ".github/uploadFile.ts" - ] -} diff --git a/util/prepare.ts b/util/prepare.ts deleted file mode 100644 index b73d054..0000000 --- a/util/prepare.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { readFileSync, writeFileSync } from "fs"; - -let file = readFileSync("installer_assets/PreMiD-Upgrade.xml", "utf-8"); - -file = file.replace("VERSION", require("../package.json").version); - -writeFileSync("installer_assets/PreMiD-Upgrade.xml", file); diff --git a/util/uploadFile.ts b/util/uploadFile.ts deleted file mode 100644 index 74e39a0..0000000 --- a/util/uploadFile.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as Client from "ssh2-sftp-client"; - -let sftp = new Client(); - -sftp - .connect({ - host: process.env.SSHHOST, - username: process.env.SSH_USERNAME, - privateKey: process.env.SSH_KEY - }) - .then(async () => { - sftp - .fastPut(process.argv[2], process.argv[3]) - .then(() => { - sftp.end(); - }) - .catch(console.error); - }); diff --git a/util/zip.ts b/util/zip.ts deleted file mode 100644 index 652ceaf..0000000 --- a/util/zip.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as archiver from "archiver"; -import { Extract } from "unzipper"; -import { createWriteStream, createReadStream } from "fs"; -import { basename } from "path"; - -if (process.argv.includes("--zip")) { - const archive = archiver("zip"), - output = createWriteStream(process.argv[3]); - - archive.pipe(output); - archive.directory(process.argv[2], basename(process.argv[3], ".zip")); - - archive.finalize(); -} else { - createReadStream(process.argv[2]).pipe(Extract({ path: process.cwd() })); -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 396a76b..0000000 --- a/yarn.lock +++ /dev/null @@ -1,3166 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@dabh/diagnostics@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" - integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@electron/get@^1.0.1", "@electron/get@^1.6.0": - version "1.12.4" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab" - integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^9.6.0" - progress "^2.0.3" - semver "^6.2.0" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^2.0.2" - global-tunnel-ng "^2.7.1" - -"@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== - dependencies: - "@nodelib/fs.stat" "2.0.4" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== - dependencies: - "@nodelib/fs.scandir" "2.1.4" - fastq "^1.6.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@types/archiver@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.1.0.tgz#869f4ce4028e49cf9a0243cf914415f4cc3d1f3d" - integrity sha512-baFOhanb/hxmcOd1Uey2TfFg43kTSmM6py1Eo7Rjbv/ivcl7PXLhY0QgXGf50Hx/eskGCFqPfhs/7IZLb15C5g== - dependencies: - "@types/glob" "*" - -"@types/auto-launch@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/auto-launch/-/auto-launch-5.0.1.tgz#388a047edc0e754d8e8978cbd9ed4672b36be2c4" - integrity sha512-+KQ+/koZ7sJXnf5cnCANofY6yXAdYJNEoVZEuWcwJfuWbUp9u6l09I7KhwD+ivU+cdz7JId4V5ukxscWtHdSuw== - -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== - -"@types/component-emitter@^1.2.10": - version "1.2.10" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" - integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== - -"@types/cookie@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108" - integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg== - -"@types/cors@^2.8.8": - version "2.8.10" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" - integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== - -"@types/discord-rpc@3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/discord-rpc/-/discord-rpc-3.0.4.tgz#2b8c380ff17797b1408fd231b3a9944da515c331" - integrity sha512-Ee0vt82qcg05OeJrQZ/YN+NQwaBCnAul1rVLYaMLPkwR5f44WC3BpBQNvn5Z3Axu9szaVOHqXEDBI+uAXAiyrg== - -"@types/engine.io@*": - version "3.1.5" - resolved "https://registry.yarnpkg.com/@types/engine.io/-/engine.io-3.1.5.tgz#ed280bec61d6226c0bfcb03f2820c4e65391dac2" - integrity sha512-DLVpLEGTEZGBXOYoYoagHSxXkDHONc0fZouF2ayw7Q18aRu1Afwci+1CFKvPpouCUOVWP+dmCaAWpQjswe7kpg== - dependencies: - "@types/node" "*" - -"@types/fs-extra@9.0.11": - version "9.0.11" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.11.tgz#8cc99e103499eab9f347dbc6ca4e99fb8d2c2b87" - integrity sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA== - dependencies: - "@types/node" "*" - -"@types/glob@*", "@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/ini@1.3.30": - version "1.3.30" - resolved "https://registry.yarnpkg.com/@types/ini/-/ini-1.3.30.tgz#d1485459c9fad84e937414b832a2adb649eab379" - integrity sha512-2+iF8zPSbpU83UKE+PNd4r/MhwNAdyGpk3H+VMgEH3EhjFZq1kouLgRoZrmIcmoGX97xFvqdS44DkICR5Nz3tQ== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*", "@types/node@14.14.41", "@types/node@>=10.0.0": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== - -"@types/node@^12.0.12": - version "12.20.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.4.tgz#73687043dd00fcb6962c60fbf499553a24d6bdf2" - integrity sha512-xRCgeE0Q4pT5UZ189TJ3SpYuX/QGl6QIAOAIeDSbAVAd2gX1NxSZup4jNVK7cxIeP8KDSbJgcckun495isP1jQ== - -"@types/prompts@2.0.11": - version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.11.tgz#0cef3d1c7e5144c74abd71691287613b7514b03a" - integrity sha512-dcF5L3rU9VfpLEJIV++FEyhGhuIpJllNEwllVuJ5g8eoVqjf048tW9+spivIwjzgPbtaGAl7mIZW3cmhDAq2UQ== - dependencies: - "@types/node" "*" - -"@types/request-promise-native@1.0.17": - version "1.0.17" - resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.17.tgz#74a2d7269aebf18b9bdf35f01459cf0a7bfc7fab" - integrity sha512-05/d0WbmuwjtGMYEdHIBZ0tqMJJQ2AD9LG2F6rKNBGX1SSFR27XveajH//2N/XYtual8T9Axwl+4v7oBtPUZqg== - dependencies: - "@types/request" "*" - -"@types/request@*": - version "2.48.5" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.5.tgz#019b8536b402069f6d11bee1b2c03e7f232937a0" - integrity sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ== - dependencies: - "@types/caseless" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - -"@types/rimraf@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" - integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -"@types/socket.io-parser@*": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/socket.io-parser/-/socket.io-parser-2.2.1.tgz#dc94aed303839487f4975249a32a548109ea3647" - integrity sha512-+JNb+7N7tSINyXPxAJb62+NcpC1x/fPn7z818W4xeNCdPTp6VsO/X8fCsg6+ug4a56m1v9sEiTIIUKVupcHOFQ== - dependencies: - "@types/node" "*" - -"@types/socket.io@2.1.13": - version "2.1.13" - resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.13.tgz#b6d694234e99956c96ff99e197eda824b6f9dc48" - integrity sha512-JRgH3nCgsWel4OPANkhH8TelpXvacAJ9VeryjuqCDiaVDMpLysd6sbt0dr6Z15pqH3p2YpOT3T1C5vQ+O/7uyg== - dependencies: - "@types/engine.io" "*" - "@types/node" "*" - "@types/socket.io-parser" "*" - -"@types/ssh2-sftp-client@5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/ssh2-sftp-client/-/ssh2-sftp-client-5.3.1.tgz#686a5732eba71dd52631232ebc6b04125f39c85e" - integrity sha512-+A7a5Brf/6e/O+QqXiWv0NRDKQxJBw2bmf9hW/Dn3gRZyCZJBNv0uZEhKyu5Zz6DLZ41vYeZLQRGd8oczD+d7Q== - dependencies: - "@types/ssh2" "*" - -"@types/ssh2-streams@*": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.8.tgz#142af404dae059931aea7fcd1511b5478964feb6" - integrity sha512-I7gixRPUvVIyJuCEvnmhr3KvA2dC0639kKswqD4H5b4/FOcnPtNU+qWLiXdKIqqX9twUvi5j0U1mwKE5CUsrfA== - dependencies: - "@types/node" "*" - -"@types/ssh2@*": - version "0.5.46" - resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.46.tgz#e12341a242aea0e98ac2dec89e039bf421fd3584" - integrity sha512-1pC8FHrMPYdkLoUOwTYYifnSEPzAFZRsp3JFC/vokQ+dRrVI+hDBwz0SNmQ3pL6h39OSZlPs0uCG7wKJkftnaA== - dependencies: - "@types/node" "*" - "@types/ssh2-streams" "*" - -"@types/tough-cookie@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" - integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== - -"@types/unzipper@^0.10.3": - version "0.10.3" - resolved "https://registry.yarnpkg.com/@types/unzipper/-/unzipper-0.10.3.tgz#9eea872fb1fa460da76f253878b6275af588f464" - integrity sha512-01mQdTLp3/KuBVDhP82FNBf+enzVOjJ9dGsCWa5z8fcYAFVgA9bqIQ2NmsgNFzN/DhD0PUQj4n5p7k6I9mq80g== - dependencies: - "@types/node" "*" - -"@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== - dependencies: - "@types/node" "*" - -"@yarnpkg/parsers@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-2.3.0.tgz#7b9564c6df02f4921d5cfe8287c4b648e93ea84b" - integrity sha512-qgz0QUgOvnhtF92kaluIhIIKBUHlYlHUBQxqh5v9+sxEQvUeF6G6PKiFlzo3E6O99XwvNEGpVu1xZPoSGyGscQ== - dependencies: - js-yaml "^3.10.0" - tslib "^1.13.0" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -ajv-formats@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-1.5.1.tgz#0f301b1b3846182f224cc563fc0a032daafb7dab" - integrity sha512-s1RBVF4HZd2UjGkb6t6uWoXjf6o7j7dXPQIL7vprcIT/67bTD6+5ocsU0UKShS2qWxueGDWuGfKHfOxHWrlTQg== - dependencies: - ajv "^7.0.0" - -ajv@^7.0.0, ajv@^7.0.3: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" - integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -applescript@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/applescript/-/applescript-1.0.0.tgz#bb87af568cad034a4e48c4bdaf6067a3a2701317" - integrity sha1-u4evVoytA0pOSMS9r2Bno6JwExc= - -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.2.0.tgz#25aa1b3d9febf7aec5b0f296e77e69960c26db94" - integrity sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.0" - buffer-crc32 "^0.2.1" - readable-stream "^3.6.0" - readdir-glob "^1.0.0" - tar-stream "^2.1.4" - zip-stream "^4.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-back@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asar@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" - integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - -asn1@~0.2.0: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -async@^3.1.0, async@^3.2.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atomically@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" - integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== - -author-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" - integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= - -auto-launch@5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/auto-launch/-/auto-launch-5.0.5.tgz#d14bd002b1ef642f85e991a6195ff5300c8ad3c0" - integrity sha512-ppdF4mihhYzMYLuCcx9H/c5TUOCev8uM7en53zWVQhyYAJrurd2bFZx3qQVeJKF2jrc7rsPRNN5cD+i23l6PdA== - dependencies: - applescript "^1.0.0" - mkdirp "^0.5.1" - path-is-absolute "^1.0.0" - untildify "^3.0.2" - winreg "1.2.4" - -autopm@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/autopm/-/autopm-1.3.1.tgz#b334bd11d1dbca4a1951b1752389aa80d103fd0d" - integrity sha512-gaFNW4oTaeQarZUIP7VnBAHmSrACUrc5ra8P6jids6Sj+3cWUqTc08RgfVT1YEFPD0MBWM8Mie5DMRUB7h25IQ== - dependencies: - builtin-modules "^3.2.0" - compare-versions "^3.6.0" - fast-glob "^3.2.5" - package-json "^6.5.0" - require-package-name "^2.0.1" - source-map-support "^0.5.19" - -axios@0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -bcrypt-pbkdf@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.1.1, bluebird@^3.5.0: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - -boolean@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570" - integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - -builtin-modules@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@3.5.1, chokidar@^3.2.2, chokidar@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -chromium-pickle-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" - integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cli-boxes@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - 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.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" - integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colors@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -colorspace@1.1.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" - integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== - dependencies: - color "3.0.x" - text-hex "1.0.x" - -combined-stream@^1.0.6: - 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" - -command-line-args@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" - integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== - dependencies: - array-back "^3.0.1" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -commander@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -compare-version@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" - integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= - -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== - -component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compress-commons@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7" - integrity sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^4.0.1" - normalize-path "^3.0.0" - readable-stream "^3.6.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.0.2" - typedarray "^0.0.6" - -conf@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/conf/-/conf-9.0.2.tgz#943589602b1ce274d9234265314336a698972bc5" - integrity sha512-rLSiilO85qHgaTBIIHQpsv8z+NnVfZq3cKuYNCXN1AOqPzced0GWZEe/A517VldRLyQYXUMyV+vszavE2jSAqw== - dependencies: - ajv "^7.0.3" - ajv-formats "^1.5.1" - atomically "^1.7.0" - debounce-fn "^4.0.0" - dot-prop "^6.0.1" - env-paths "^2.2.0" - json-schema-typed "^7.0.3" - make-dir "^3.1.0" - onetime "^5.1.2" - pkg-up "^3.1.0" - semver "^7.3.4" - -config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -core-js@^3.6.5: - version "3.9.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8" - integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -crc32-stream@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== - dependencies: - crc-32 "^1.2.0" - readable-stream "^3.4.0" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -debounce-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" - integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== - dependencies: - mimic-fn "^3.0.0" - -debug@^2.2.0, debug@^2.6.8, 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.1.0, debug@^3.2.6: - 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" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -"discord-rpc@github:discordjs/RPC": - version "3.2.0" - resolved "https://codeload.github.com/discordjs/RPC/tar.gz/50376b913d089e8e28220fc67416c3e9bc5bca53" - dependencies: - node-fetch "^2.6.1" - ws "^7.3.1" - -displayastree@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/displayastree/-/displayastree-1.0.3.tgz#662db5495ff2b357ea1ddbbfd8e7fbe9f8119325" - integrity sha512-cpUYNudvG8G1H9pE4SpQKmCIei2DKMtE+PjqB/FqDdtWQtEuDgWY+cxkRQ9BcUEUb5lL2mYqb2hvoeUx2kOq0g== - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -electron-notarize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" - integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og== - dependencies: - debug "^4.1.1" - fs-extra "^9.0.1" - -electron-osx-sign@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" - integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== - dependencies: - bluebird "^3.5.0" - compare-version "^0.1.2" - debug "^2.6.8" - isbinaryfile "^3.0.2" - minimist "^1.2.0" - plist "^3.0.1" - -electron-packager@15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.2.0.tgz#c93de19d75e7c03d159a56295384d371cb625ad4" - integrity sha512-BaklTBRQy1JTijR3hi8XxHf/uo76rHbDCNM/eQHSblzE9C0NoNfOe86nPxB7y1u2jwlqoEJ4zFiHpTFioKGGRA== - dependencies: - "@electron/get" "^1.6.0" - asar "^3.0.0" - debug "^4.0.1" - electron-notarize "^1.0.0" - electron-osx-sign "^0.5.0" - extract-zip "^2.0.0" - filenamify "^4.1.0" - fs-extra "^9.0.0" - galactus "^0.2.1" - get-package-info "^1.0.0" - junk "^3.1.0" - parse-author "^2.0.0" - plist "^3.0.0" - rcedit "^2.0.0" - resolve "^1.1.6" - semver "^7.1.3" - yargs-parser "^20.0.0" - -electron-store@7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-7.0.3.tgz#56d78284454018ed50ffc7645da49f828ae5ff19" - integrity sha512-wIbw4GHt4djs4dVrlRLCD/SpdpDUiRsQc212jagGA6zJ8xt1iwx3KZIzXY8gmwvgVCOcVxi3iyCXZoBBWwBXpQ== - dependencies: - conf "^9.0.0" - type-fest "^0.20.2" - -electron@11.3.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-11.3.0.tgz#87e8528fd23ae53b0eeb3a738f1fe0a3ad27c2db" - integrity sha512-MhdS0gok3wZBTscLBbYrOhLaQybCSAfkupazbK1dMP5c+84eVMxJE/QGohiWQkzs0tVFIJsAHyN19YKPbelNrQ== - dependencies: - "@electron/get" "^1.0.1" - "@types/node" "^12.0.12" - extract-zip "^1.0.3" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encodeurl@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-parser@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" - integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg== - dependencies: - base64-arraybuffer "0.1.4" - -engine.io@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" - integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~4.0.0" - ws "~7.4.2" - -env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - -eol@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" - integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-zip@^1.0.3: - version "1.7.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== - dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" - yauzl "^2.10.0" - -extract-zip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@3.2.5, fast-glob@^3.1.1, fast-glob@^3.2.4, fast-glob@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-safe-stringify@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - -fastq@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" - integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== - dependencies: - reusify "^1.0.4" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - -fecha@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" - integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.2.0.tgz#c99716d676869585b3b5d328b3f06590d032e89f" - integrity sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flora-colossus@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93" - integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA== - dependencies: - debug "^4.1.1" - fs-extra "^7.0.0" - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.10.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" - integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - 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-extra@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -galactus@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9" - integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk= - dependencies: - debug "^3.1.0" - flora-colossus "^1.0.0" - fs-extra "^4.0.0" - -get-package-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" - integrity sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw= - dependencies: - bluebird "^3.1.1" - debug "^2.2.0" - lodash.get "^4.0.0" - read-pkg-up "^2.0.0" - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-agent@^2.0.2: - version "2.1.12" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" - integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== - dependencies: - boolean "^3.0.1" - core-js "^3.6.5" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - -global-dirs@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" - integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== - dependencies: - ini "1.3.7" - -global-tunnel-ng@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" - integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== - dependencies: - encodeurl "^1.0.2" - lodash "^4.17.10" - npm-conf "^1.1.3" - tunnel "^0.0.6" - -globalthis@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" - integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.1: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -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" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isbinaryfile@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" - -js-yaml@^3.10.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema-typed@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" - integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json2xml@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/json2xml/-/json2xml-0.1.3.tgz#9ae7c220bedd7c66a668e26f7ac182f6704eca21" - integrity sha1-mufCIL7dfGamaOJvesGC9nBOyiE= - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - -leasot@^11.5.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/leasot/-/leasot-11.5.0.tgz#a99eb4479618c9d2ea442a32ee006e5b9da4844d" - integrity sha512-L08QKlmofYIRs5gfOmhOtbEJUu6U/zFGvYpboPq34yAHQ2Oc/QznOw62noe29yRJLiV/XnIDS8vO2um1e1sikA== - dependencies: - async "^3.2.0" - chalk "^4.1.0" - commander "^6.2.1" - eol "^0.9.1" - get-stdin "^8.0.0" - globby "^11.0.1" - json2xml "^0.1.3" - lodash "^4.17.20" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - text-table "^0.2.0" - -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.get@^4.0.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash@^4.17.10, lodash@^4.17.19, lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -logform@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" - integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^4.2.0" - ms "^2.1.1" - triple-beam "^1.3.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== - -mime-types@^2.1.12, mime-types@~2.1.24: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== - dependencies: - mime-db "1.46.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" - integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.4: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -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== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -nodemon@2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32" - integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== - dependencies: - chokidar "^3.2.2" - debug "^3.2.6" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.7" - semver "^5.7.1" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.3" - update-notifier "^4.1.0" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - 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-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -npm-conf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-keys@^1.0.12: - 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, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -ora@5.3.0, ora@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" - integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0, package-json@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -parse-author@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" - integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= - dependencies: - author-regex "^1.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -plist@^3.0.0, plist@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" - integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== - dependencies: - base64-js "^1.5.1" - xmlbuilder "^9.0.7" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - -pstree.remy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -rcedit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.3.0.tgz#951685a079db98a4cc8c21ebab75e374d5a0b108" - integrity sha512-h1gNEl9Oai1oijwyJ1WYqYSXTStHnOcv1KYljg/8WM4NAg3H1KBK3azIaKkQ1WQl+d7PoJpcBMscPfLXVKgCLQ== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.3.7, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-glob@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" - integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== - dependencies: - minimatch "^3.0.4" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-package-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= - -resolve@^1.1.6, resolve@^1.10.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - 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", safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -"semver@2 || 3 || 4 || 5", semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -socket.io-adapter@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" - integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== - -socket.io-parser@~4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" - -socket.io@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" - integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== - dependencies: - "@types/cookie" "^0.4.0" - "@types/cors" "^2.8.8" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.1" - engine.io "~4.1.0" - socket.io-adapter "~2.1.0" - socket.io-parser "~4.0.3" - -source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - 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.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== - -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssh2-sftp-client@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssh2-sftp-client/-/ssh2-sftp-client-6.0.1.tgz#cd901acfd5303ec5da0e10436d5dc484f34e464c" - integrity sha512-Glut2SmK/XpNOBiEuzqlKZGKkIyha2XMbuWVXR2hFUJkNsbyl/wmlZSeUEPxKFp/dC9UEvUKzanKydgLmNdfkw== - dependencies: - concat-stream "^2.0.0" - promise-retry "^2.0.1" - ssh2 "^0.8.9" - winston "^3.3.3" - -ssh2-streams@~0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34" - integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== - dependencies: - asn1 "~0.2.0" - bcrypt-pbkdf "^1.0.2" - streamsearch "~0.1.2" - -ssh2@^0.8.9: - version "0.8.9" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.9.tgz#54da3a6c4ba3daf0d8477a538a481326091815f3" - integrity sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw== - dependencies: - ssh2-streams "~0.4.10" - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - -streamsearch@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -term-size@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - -triple-beam@^1.2.0, triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - -ts-devscript@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ts-devscript/-/ts-devscript-3.0.3.tgz#51f2b8fadfb61f08f431de28850eccad08dcfdf3" - integrity sha512-9RJ3TzIrGbYTAyehP/z7dAyZSp+//rtwQEY0bRY5ODCcjdvQJX45beiG0XnHqAnNOgaXDHu8T8NtzILtrmKrFQ== - dependencies: - "@yarnpkg/parsers" "^2.3.0" - autopm "^1.3.0" - chalk "^4.1.0" - chokidar "^3.5.0" - command-line-args "^5.1.1" - compare-versions "^3.6.0" - debug "^4.3.1" - displayastree "^1.0.3" - fast-glob "^3.2.4" - fs-extra "^9.0.1" - inquirer "^7.3.3" - leasot "^11.5.0" - ora "^5.3.0" - source-map-support "^0.5.19" - tree-kill "^1.2.2" - typescript "^4.1.3" - -tslib@^1.13.0, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -tweetnacl@^0.14.3: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@4.1.5, typescript@^4.1.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -undefsafe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" - integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== - dependencies: - debug "^2.2.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -untildify@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" - integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== - -unzipper@0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -update-notifier@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" - integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@^1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.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 sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -winreg@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" - integrity sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs= - -winston-transport@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" - integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== - dependencies: - readable-stream "^2.3.7" - triple-beam "^1.2.0" - -winston@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" - integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== - dependencies: - "@dabh/diagnostics" "^2.0.2" - async "^3.1.0" - is-stream "^2.0.0" - logform "^2.2.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.4.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1, ws@~7.4.2: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.0.0: - version "20.2.5" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" - integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== - -yarn@1.22.10: - version "1.22.10" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" - integrity sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA== - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -zip-stream@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a" - integrity sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.0.2" - readable-stream "^3.6.0"